0

私は基本的に、fortigate 構成ファイルの解析に関するこの未回答の質問を続けようとしています。

Python で fortigate 構成ファイルを読み取る

根本的な問題は、この構成に次のような多数のレコードが含まれていることです。

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 の出力を 1 行で取得して、CSV にインポートできるようにしたいと考えています。問題は、各レコードの行数が可変であり、インデントが前の行のサブセクションを示していることです。他の投稿では、一部は正しく取得されますが、インデントは処理されません。空白を任意の文字に置き換えるいくつかの回避策を考え出しましたが、数字のタブ/空白を読み取り、それを使用して位置を示す方法があるかどうかは知りませんでした。

ありがとう

4

1 に答える 1

1

だから私はあなたのテキストを読んで、それを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
于 2012-08-30T23:09:01.417 に答える