2013-04-09 14 views
5

私は半径がrlm_pythonであり、coovachilliのDHCPロケーションoption82を16進数またはバイナリー形式で取得しています。ストリングがこの値\001\027\002\025\001+\001\024として示しているが、option82フィールドを意味TLVs-type,length,valuesでエンコードsuboptionsを含有するように、Pythonのショーが切り捨てられた値に見えるように、それをキャッチPython解凍バッファーデータ

は、1バイト長、続いタイプ0x01(circuit ID, per RFC 3046)始まります。

どのように私はこれをキャッチし、オプションを適切に解凍することができますか?

struct.unpackを使用して文字列を解凍しましたが、意味がありません。のoption82フィールドにはパックされていません。

Python 2.4.3 (#1, May 5 2011, 16:39:10) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from struct import * 
>>> unpack('=hhl',"\001\027\002\025\001+\001\024") 
(5889, 5378, 335620865) 

UPDATE:

Coovachilliが--locationopt82でコンパイルされ、それが属性として場所を送信し、このような何か...

rad_recv: Accounting-Request packet from host 10.66.53.49 port 53178, id=101, length=342 
     ChilliSpot-Version = "1.3.0" 
     ChilliSpot-Acct-View-Point = ChilliSpot-Client-View-Point 
     Event-Timestamp = "Apr 18 2013 11:59:16 BST" 
     User-Name = "3C-D0-F8-4A-05-68" 
     Acct-Input-Octets = 0 
     Acct-Output-Octets = 22851 
     Acct-Input-Gigawords = 0 
     Acct-Output-Gigawords = 0 
     Acct-Input-Packets = 0 
     Acct-Output-Packets = 370 
     Acct-Session-Time = 5401 
     ChilliSpot-Session-State = Authorized 
     Acct-Status-Type = Interim-Update 
     Acct-Session-Id = "516fbceb00000002" 
     Framed-IP-Address = 10.75.33.46 
     NAS-Port-Type = Wireless-802.11 
     NAS-Port = 2 
     NAS-Port-Id = "00000002" 
     Calling-Station-Id = "3C-D0-F8-4A-05-68" 
     Called-Station-Id = "00-50-56-B7-66-00" 
     NAS-IP-Address = 10.75.32.7 
     ChilliSpot-Location = "\001\030\002\026\001+\001\024" 
     ChilliSpot-Location-Change-Count = 15 
     NAS-Identifier = "VLAN299-REGENT" 
     WISPr-Location-ID = "isocc=GR,cc=44,ac=01200,network=mywifi,my_Network_regent" 
     WISPr-Location-Name = "REGENT" 

FreeRADIUSのは、アカウンティング要求を探しrlm_pythonモジュールを持ってい

def accounting(p): 
    file = open("/tmp/test.log","a") 
    username = None 
    chillilocation = None 
    output = StringIO.StringIO() 

    for t in p: 
     if t[0] == 'User-Name': 
      username = t[1] 
     elif t[0] == 'ChilliSpot-Location': 
      chillilocation = t[1]a 
      output.write(t[1]) 


    content = output.getvalue() 


    file.write("I am being called in radius accouting section as %s and location is %s \n" % (username,content)) 
    file.close() 
    print "---Accounting---" 
    radiusd.radlog(radiusd.L_INFO, '*** radlog call in accounting (0) ***') 
    print 
    print p 
    return radiusd.RLM_MODULE_OK 

私はChilliSpot-Locati stringstringIOで、無駄のないstructを使って解凍しました。それはTLV形式のようです...

どのようにそれを取り除くのですか?

+0

rlm_pythonとcoovachilliを使用して値を文字列としてキャッチするにはどうすればよいですか? – RedBaron

+0

私はそれを – krisdigitx

+0

より上に更新しました。全部はわかりませんが、 'ChilliSpot-Location'は人間が読める文字列であるはずです。 [specs](http://wiki-robin.meshroot.com/@api/deki/files/220/=dictionary.chillispot)と[例](http://coova.org/node/4170)を参照してください(中央のどこかに 'CoovaChilliからのRADIUSアクセス要求'と書かれています) – RedBaron

答えて

0

アンパックは「意味のある」値にアンパックしません。文字列を数値フィールドのシーケンスとしてアンパックするので、各フィールドのサイズは書式文字列の各文字によって指定されます(文字より前の数字は乗数です)。

アンパックでオクテットサイズのフィールドを使用しないでください。 ( "024 \ 002 \ \ 027 \ 001 \ 001 001+ \ 025 \" '= 8B')

>>>アンパック
(1、23、2、21、1、43、1 、20)
#「+」は区切り記号(43)です。
>>> unpack( '= 6Bh'、「\ 001 \ 027 \ 002 \ 025 \ 001+ \ 001 \ 024」)
(1,3,2,2,1,2,3,5,121)

最初のバイトは、strangelly高いサイズの23の回路サブオプションコード(unpack()[0] == 1)であってもよい。私たちは全体のサブオプション価値を得ていませんでした。しかし、サイズ== 10のサブオプション、または8バイトのコンテンツしか含めることができません。

「ChilliSpot-Location」では、オプション82に読み取り可能な文字列が含まれているはずがありません。 RFC3046は、回線サブオプションが "ルータインタフェース番号"、ポート番号および他の数値のようなものを含むと予想されることを示しています。しかし、rad_recvのプロパティは実際には82オプションから来ましたか?

+0

返信ありがとうございました、coovaによると、dpackパケットのオプション82フィールドからです。実際のコンテンツは、明らかに何かを表しています... – krisdigitx