2012-08-30 130 views
0

我基本上試圖繼續解決Fortigate配置文件這個未答覆的問題。使用Python解析Fortigate配置文件

Reading a fortigate configuration file with Python

問題的根源是,這個配置包含了一些類似這樣的記錄,

edit 1 
    set srcintf "port26" 
    set dstintf "port25" 
     set srcaddr "all"    
     set dstaddr "all"    
    set action accept 
    set utm-status enable 
    set schedule "always" 
     set service "ANY"    
    set av-profile "default" 
    set nat enable 
    set central-nat enable 
next 

我想獲得在一行上每個ACL的輸出,所以我可以將其導入成CSV。問題是每個記錄可以有可變數量的行,並且縮進顯示前一行的子部分。另一篇文章確實得到了一些,但它不處理縮進。我想出了一些用任意字符替換空格的解決方法,但是我不知道是否有方法讀取數字標籤/空格並用它來表示定位。

感謝

+0

所有您需要做的是編寫文本分析器...它通常是一個痛苦的,但它似乎你有關鍵字,它應該是完全可能的。 – Onlyjus

回答

0

所以我已成功地讀你的文字,把它變成一個Python字典。這很簡單。基本上,你要做的線沿線的東西:

conFigFile=open('./config.txt') 

data=dict() 
record=0 

for line in conFigFile: 
    if line.find('edit')>=0: 
     record=int(line.replace('edit','')) 
     data[record]={} 
    if line.find('set')>=0: 
     line=line.replace('set','') 
     line=line.strip() 
     print line 
     key,val=line.split(' ') 
     data[record][key]=val 
conFigFile.close() 

這將產生一個字典,這樣將使您撥打電話如:

>>> data[1]['nat'] 
'enable' 
>>> data[1].keys() 
['nat', 'service', 'schedule', 'central-nat', 'srcaddr', 'av-profile', 'dstintf', 'srcintf', 'action', 'dstaddr', 'utm-status'] 

那麼現在就可以生成CSV文件:

csvFile=open('./data.csv','w') 
records=data.keys() 
for record in records: 
    values=data[record].keys() 
    valList=['Record',str(record)] 
    for val in values: 
     valList.append(val) 
     valList.append(data[record][val]) 
    csvFile.write(",".join(valList)) 
csvFile.close() 

其產生的CSV文件:

Record,1,nat,enable,service,"ANY",schedule,"always",central-nat,enable,srcaddr,"all",av-profile,"default",dstintf,"port25",srcintf,"port26",action,accept,dstaddr,"all",utm-status,enable 

如果真要算前行的空間,你可以做類似如下:

>>> a='  test: one  ' 
>>> a.count(' ') #count all spaces 
11 
>>> (len(a) - len(a.lstrip())) #count leading spaces 
5