5

rlm_pythonRadius でモジュールを使用しておりoption82、coovachilli から DHCP の場所を 16 進数またはバイナリ形式で取得しています。

文字列としてキャッチすると、この値として表示されますが、フィールドが typeで始まり、その後に 1 バイトの長さが続くことを意味する エンコードされたが含まれ\001\027\002\025\001+\001\024ているため、python が示す値は切り捨てられているように見えます。option82suboptionsTLVs-type,length,values0x01(circuit ID, per RFC 3046)

これをキャッチしてオプションを適切に展開する方法はありますか?

を使用して文字列をアンパックしましstruct.unpackたが、意味がありません..パックされたフィールドについてはわかりませsuboptionsoption82

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)

何か案は?

アップデート:

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-Location を に保存しようとしましたがstringstringIO無駄な構造体を使用して解凍しました。TLV 形式のように見えます...

それを取り除く方法はありますか?

4

1 に答える 1

0

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

アンパックはオクテットサイズのフィールドを使用すべきではありませんか?

>>> unpack('=8B',"\001\027\002\025\001+\001\024")
(1, 23, 2, 21, 1, 43, 1, 20)
# あるいは '+ ' はセパレータ (43):
>>> unpack('=6Bh',"\001\027\002\025\001+\001\024")
(1, 23, 2, 21, 1, 43, 5121 )

最初のバイトは回路のサブオプション コード (unpack()[0]==1) で、サイズが 23 と異常に大きく、サブオプションの値全体を取得できていない可能性があります。しかし、サイズ == 10 のサブオプションの含まれる値、または 8 バイトのコンテンツしかない場合もあります。

「ChilliSpot-Location」には含まれていますが、オプション 82 に読み取り可能な文字列が含まれている必要があるかどうかはわかりません。RFC3046 は、回線サブオプションに「ルーター インターフェイス番号」、ポート番号、その他の数値などを含める必要があることを示しています。しかし、rad_recv のそのプロパティは本当に 82 オプションに由来するのでしょうか?

于 2013-05-01T04:46:02.170 に答える