2012-04-17 129 views
1

我正在編寫一個腳本來解析來自Cisco ASA配置的防火牆規則。我的輸入的解析Python中的防火牆規則

實例包括:

access-list myACL line 1 extended permit tcp host 10.8.13.200 host 10.32.53.22 eq 1122 
access-list myACL line 2 extended permit tcp 10.8.13.0 255.255.255.0 host 10.1.206.17 eq 445 
access-list myACL line 3 extended permit udp host 10.8.13.200 eq 54345 host 10.1.206.17 eq 445 
access-list myACL line 4 extended permit icmp any any 

我的期望的輸出,在.csv的形式,對於上面的三條線將是如下。但是,這些也可以是元組存儲在數據庫中。

#aclName,lineNumber,action,protocol,sourceIP,sourcePort,destIP,destPort 
myACL,1,permit,tcp,10.8.13.200,*,10.32.53.22,1122 
myACL,2,permit,tcp,10.8.13.0/24,*,10.1.206.17,445 
myACL,3,permit,udp,10.8.13.200,54345,10.1.206.17,445 
myACL,4,permit,icmp,*,*,*,* 

我在選擇此項目的方法時遇到問題。我看了許多選項,包括ats,shlex,甚至只是使用正則表達式,但我很難確定什麼是最佳選擇。 PLY能幫忙嗎?

這是什麼適合的方法?

回答

0

第6場似乎是相當有規律,離開它可以有幾次交涉端點解析防火牆字符串。一個可能性是(未經測試的代碼,但我希望你能明白):

parts = rule.split(" ") 
aclName, _, lineNumber, _, action, protocol = parts[:6] 
endpoints = parts[6:] 

def get_endpoint(eps): 
    host, port = "*", "*" 
    if eps[0] == "host": 
     host = eps[1] 
     eps = eps[2:] 
    elif eps[0] == "any": 
     eps = eps[1:] 
    else: 
     host = eps[0] + "/" + mask_to_bits(eps[1]) 
     eps = eps[2:] 

    if eps and eps[0] == 'eq': 
     port = eps[1] 
     eps = eps[2:] 
    return host, port, eps 

sourceIP, sourcePort, endpoints = get_endpoint(endpoints) 
destIP, destPort, endpoints = get_endpoint(endpoints) 
+0

這是非常好的 - 非常感謝您的快速回復。這樣做的竅門,並不需要我在解析器上工作! – 2012-04-17 20:33:59

0

如果需要輸出CSV目標,我建議您最熟悉的方法之一。如果這是一次性的/特殊的事情,我進一步推薦任何允許你以最快的速度處理它的東西。

如果是我 - 我可能是正則表達式。

0

我會.split(" ")