2013-04-09 17 views
5

Używam modułu rlm_python w promieniu i otrzymuję lokalizację DHCP option82 od coovachilli w formacie szesnastkowym lub binarnym.Python unpack buffer data

Catching go jako ciąg pokazuje jak ta wartość \001\027\002\025\001+\001\024, ale wygląda na wartość, która pokazuje Python jest ścięty, ponieważ option82 zawiera suboptions zakodowany w TLVs-type,length,values co oznacza pole zaczyna się od typu 0x01(circuit ID, per RFC 3046), a następnie o długości jednego bajta.

Masz pomysł, jak to zrobić i odpowiednio rozpakować opcje?

Mam rozpakowany ciąg znaków przy użyciu struct.unpack, ale nie ma znaczenia .. nie mówi o spakowanym polu suboptions w 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) 

jakieś pomysły?

UPDATE:

Coovachilli jest skompilowany z --locationopt82 i wysyła lokalizację jako atrybut, coś takiego ...

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 posiada moduł rlm_python który wygląda na żąda rachunkowości

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 

Próbowałem przechowywać ChilliSpot-Locati na w string i stringIO, rozpakowane za pomocą struct bez skutku, wygląda na to, że jest w formacie TLV ...

Jakieś pomysły, jak je rozebrać?

+0

Jak przechwycić wartość jako ciąg za pomocą rlm_python i coovachilli? – RedBaron

+0

zaktualizowałem go powyżej – krisdigitx

+0

Nie jestem pewien co do całej rzeczy, ale 'ChilliSpot-Location' ma być czytelny dla człowieka. Zobacz [dane techniczne] (http://wiki-robin.meshroot.com/@api/deki/files/220/=dictionary.chillispot) i [przykład] (http://coova.org/node/4170) (Przeglądaj w dół gdzieś pośrodku, gdzie jest napisane 'Prośba o dostęp RADIUS z CoovaChilli') – RedBaron

Odpowiedz

0

Rozpakowanie nie rozpakowuje się na wartości "znaczące". Rozpakowuje ciąg jako sekwencję pól liczbowych, tak aby rozmiar każdego pola był określony przez każdy znak ciągu formatu (liczby poprzedzające litery są mnożnikami).

Czy nie należy rozpakowywać pól o wielkości oktetowej?

>>> rozpakowanie ('= 8B', "\ 001 \ 027 \ 002 \ 025 \ 001+ \ 001 \ 024")
(1, 23, 2, 21, 1, 43, 1 20)
# Albo '+' jest separatorem (43)
>>> rozpakowanie ('= 6BH', "\ 001 \ 027 \ 002 \ 025 \ 001+ \ 001 \ 024")
(1, 23, 2, 21, 1, 43, 5121)

pierwszy bajt może być kod podopcja obwód (rozpakowania() [0] == 1) z strangelly dużej wielkości 23 ', co oznacza nie otrzymaliśmy całej wartości podopcji. Ale możemy również mieć tylko wartość zawartą w podopcji o rozmiarze == 10 lub 8 bajtów treści.

Nie jestem pewien, czy opcja 82 powinna zawierać czytelny ciąg znaków, chociaż "ChilliSpot-Location" to robi. RFC3046 wskazuje, że podopcja obwodu ma zawierać takie rzeczy jak "numer interfejsu routera", numery portów i inne wartości numeryczne. Ale ta własność rad_recv naprawdę pochodzi z 82 opcji?

+0

dzięki za odpowiedź, według Coova jest to z pola opcji 82 na pakiecie dhcp, jeśli rozpakowanie pokazuje tylko rozmiar, to gdzie jest rzeczywista treść, oczywiście to coś reprezentuje ... – krisdigitx