2012-04-17 13 views
1

Cisco ASAの設定からファイアウォールルールを解析するスクリプトを作成しています。私の入力のPythonのファイアウォールルールの解析

としては、上記の3つのライン用.csvの形態で

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 

マイ所望の出力は、次のようであろう。しかし、これらはデータベースに格納されるタプルと同様に可能です。

#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

でファイアウォール文字列を解析します。可能性は(テストされていないコードですが、あなたがそのアイデアを得ることを望みます):

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

これはすばらしいです。これはトリックを行い、パーサで作業する必要はありません! –

0

ただCSVターゲットを出力する必要がある場合は、あなたが最もよく慣れている方法をお勧めします。それがワンタイム/アドジョークのものなら、私はあなたがそれを最速にすることを可能にするものをさらに推奨します。

もし私だったら、おそらく正規表現でしょう。

0

は、私が最初の6つのフィールドは、いくつかの表現を持つことができるエンドポイントを残している、非常に予測可能であるように見える.split(" ")