SNMP Daten lesen (pysnmp/pyasn1)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Risdyk
User
Beiträge: 3
Registriert: Dienstag 9. Dezember 2014, 11:53

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.
Zuletzt geändert von Risdyk am Dienstag 9. Dezember 2014, 15:43, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Risdyk
User
Beiträge: 3
Registriert: Dienstag 9. Dezember 2014, 11:53

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!
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.
Risdyk
User
Beiträge: 3
Registriert: Dienstag 9. Dezember 2014, 11:53

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?
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'
Antworten