Seite 1 von 1

SNMP Daten lesen (pysnmp/pyasn1)

Verfasst: Dienstag 9. Dezember 2014, 14:35
von Risdyk
Hi

ich versuche die eingelesen SNMP Server Daten (MAC Adressen) einzuselen und dann zu vergleichen.

Kurz zum Problem:
Eine MAC Adresse von einem Server wird über ein Web-Interface abgelesen und diese soll dann über zwei Schnittstellen verifiziert werden, das die im Web-Interface richtig dargestellt wird.
Der Vergleich über SMASH geht schon mal wunderbar, nur über den SNMP habe ich da noch etwas Probleme.

wenn ich per Hand es einlese
root@kbuntu12-04:~# snmpwalk -v1 -c public 172.17.145.5 1.3.6.1.4.1.7244.1.1.1.4.7.1.1.3

SNMPv2-SMI::enterprises.7244.1.1.1.4.7.1.1.3.1.1 = Hex-STRING: 00 23 8B 42 48 BE

bekomme ich es als Hex-String und wenn ich jetzt per Python einlese:

Code: Alles auswählen

test_snmp = my_snmp( host = '172.17.145.5' )

test_snmp.add_cmd( '1', '1.3.6.1.4.1.7244.1.1.1.4.7.1.1.3' )
test_snmp.next( '1' )

print "test_snmp.shortcut['varBinds'][0][0]:" 
print test_snmp.shortcut['varBinds'][0][0]
Ausgabe:

Code: Alles auswählen

(ObjectName(1.3.6.1.4.1.7244.1.1.1.4.7.1.1.3.1.1), OctetString(hexValue='0238b4248be'))
bekomme ich es als hexValue.

Aber dabei verschluckt pysnmp z.B. bei Hex-STRING: 00 23 8B 57 FD 01 -> OctetString(hexValue='0238b57fd1')
die ganzen Nullen.

Wie kann ich das am besten verhindern oder lösen? Mir würde schon reichen wenn der nicht die Nullen verschlucken würde.

Danke für die Hilfe.
Risdyk

PS: Fall es in ein anderes Unterforum besser passt bitte verschieben.

Re: SNMP Daten lesen (pysnmp/pyasn1)

Verfasst: Dienstag 9. Dezember 2014, 15:05
von EyDu
Hallo und willkommen im Forum!

Das ist nur die Darstellung, der Wert ist der selbe. Führende Nullen tragen nichts zum Wert bei, daher können sie ausgelassen werden. Du schreibst die Siebzehn ja auch als 17 und nicht als 017, 0017 oder 00000000000000017.

Re: SNMP Daten lesen (pysnmp/pyasn1)

Verfasst: Dienstag 9. Dezember 2014, 15:30
von Risdyk
ja das große Problem ist das ich es dann mit der MAC Adresse 00:23:8B:57:FD:01 vergleiche und hier spielt die Anzahl der Nullen schon eine Rolle, den hexValue liefert '0238b57fd1' das sind 2 Zahlen weniger wie soll da noch der Vergleich stattfinden und verifizieren das der eingelese Wert mit der Mac Adresse übereinstimmt.

Kurzes Problembeschreibung habe ich oben noch mal eingefügt.

Ich muss denk ich mal pysnmp/pyasn1 anpassen damit es richtig abliest/speichert und da hänge ich etwas auf dem Schlauch!

Re: SNMP Daten lesen (pysnmp/pyasn1)

Verfasst: Dienstag 9. Dezember 2014, 15:49
von BlackJack
@Risdyk: Was hat denn das Objekt sonst so für eigenschaften? Kannst Du per Index auf die einzelnen Bytewerte zugreifen? Laut dieser Dokumentation: http://src.gnu-darwin.org/ports/net-mgm ... orial.html verhält sich das Objekt ähnlich wie eine Zeichenkette.

Re: SNMP Daten lesen (pysnmp/pyasn1)

Verfasst: Mittwoch 17. Dezember 2014, 13:51
von Risdyk
ja ich komme über Index an die Werte ran z.B. bei Wert OctetString(hexValue='0238b4248be') bekomme ich über direkte Index
den Wert ' #‹BH¾' sechs Zeichen ' ,#,‹,B,H,¾' und von Kodierung Typ us-ascii wie sollte ich jetzt das am bestern encoden?

Re: SNMP Daten lesen (pysnmp/pyasn1)

Verfasst: Mittwoch 17. Dezember 2014, 14:37
von BlackJack
@Risdyk: Das sind Bytestrings, die haben keine Kodierung. Du zeigst sie uns in irgendeiner Kodierung, die aber sicher nicht US-ASCII ist, denn das '¾' gibt es dort nicht und man könnte auch nicht alle möglichen 256 Bytewerte als ASCII kodieren, denn ASCII ist eine 7-Bit Codierung, kann also nur die Werte 0 bis 127 kodieren.

Bytestrings kann man nur *de*kodieren, zumindest was Zeichenkodierungen angeht.

Was Du mit diesem `OctectString`-Objekt machen solltest hängt letztendlich davon ab was Du grundsätzlich mit dem Wert anfangen willst. Du schreibst was von vergleichen. Womit denn? Du musst entweder das womit Du vergleichen willst in eine `OctetString`-vergleichbare Form bringen, oder den `OctetString` in die Form mit der Du vergleichen willst, oder aber beides in einer vergleichbare Form überführen. Hilft Dir zum Beispiel so etwas weiter? Ungetestet:

Code: Alles auswählen

if expected_mac == ' '.join('{0:02X}'.format(ord(c) for c in octet_string_mac)):
   print 'Juhuu'