2012-04-20 11 views
5

i die folgende einfache Skript bin mit:pysnmp kann nicht Antwort erkennen

from pysnmp.entity.rfc3413.oneliner import cmdgen 

errorIndication, errorStatus, errorIndex, \ 
varBindTable = cmdgen.CommandGenerator().bulkCmd(
      cmdgen.CommunityData('test-agent', 'public'), 
      cmdgen.UdpTransportTarget(('IP.IP.IP.IP', 161)), 
      0, 
      1, 
      (1,3,6,1,2,1,4,24,4,1,2,169,254) 
     ) 

if errorIndication: 
    print errorIndication 
else: 
    if errorStatus: 
     print '%s at %s\n' % (
      errorStatus.prettyPrint(), 
      errorIndex and varBindTable[-1][int(errorIndex)-1] or '?' 
      ) 
    else: 
     for varBindTableRow in varBindTable: 
      for name, val in varBindTableRow: 
       print '%s = %s' % (name.prettyPrint(), val.prettyPrint()) 

Mit snmpwalk von der Kommandozeile zu diesem Gerät wieder erwarteten Ergebnis. Aber Skript gibt keine SNMP-Antwort vor dem Timeout erhalten. Wenn ich diese OID weglasse, funktioniert alles gut. Das Problem ist also in dieser OID

Hier tcpdump Statistik:

/usr/sbin/tcpdump -nn -vv -s0 -A host HOST and udp 

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 

12:15:31.494920 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP (17), length: 77) IP.IP.IP.IP.47911 > IP.IP.IP.IP.161: [bad udp cksum 4b7d!] { SNMPv2c { GetBulk(34) R=8993731 N=0 M=1 .1.3.6.1.2.1.4.24.4.1.2.169.254 } } 
[email protected]@.I..]<..]</.'...9.S0/.....public."....;.......0.0...+..........).~.. 

12:15:31.495666 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP (17), length: 98) IP.IP.IP.IP.161 > IP.IP.IP.IP.47911: [udp sum ok] { SNMPv2c { GetResponse(55) R=8993731 .1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.0.0.255.255.0.0.0.0.0=[inetaddr len!=4]0.0.255.255.0.0.0.0 } } 
[email protected]@.I..]</.]<....'.N.\0D.....public.7....;.......0)0'..+..........)[email protected] 

12:15:32.500226 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP (17), length: 77) IP.IP.IP.IP.47911 > IP.IP.IP.IP.161: [bad udp cksum 4b7d!] { SNMPv2c { GetBulk(34) R=8993731 N=0 M=1 .1.3.6.1.2.1.4.24.4.1.2.169.254 } } 
[email protected]@.I..]<..]</.'...9.S0/.....public."....;.......0.0...+..........).~.. 

12:15:32.500624 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: UDP (17), length: 98) IP.IP.IP.IP.161 > IP.IP.IP.IP.47911: [udp sum ok] { SNMPv2c { GetResponse(55) R=8993731 .1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.0.0.255.255.0.0.0.0.0=[inetaddr len!=4]0.0.255.255.0.0.0.0 } } 
[email protected]@.I..]</.]<....'.N.\0D.....public.7....;.......0)0'..+..........)[email protected] 

Wie wir, Gerät wieder .1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.0.0.255.255.0.0.0.0.0=[inetaddr len!=4]0.0.255.255.0.0.0.0 Antwort sehen können, aber es passiert nichts und pysnmp nur weiterhin den Wert dieser OID versuchen immer wieder .. snmpwalk erkennt diese Antwort als

Können Sie mir helfen? Vielen Dank im Voraus und Entschuldigung mein Englisch.

Antwort

4

Ihr SNMP-Agent scheint fehlerhafte SNMP-Nachrichten zu erzeugen. Während die IPv4-Adresse vier Bytes lang ist, meldet Ihr Agent einen Acht-Byte-Wert.

Gemäß SNMP-RFCs löscht pysnmp fehlerhafte SNMP-Nachrichten und wiederholt die ursprüngliche Anforderung einige Male in der Hoffnung, die richtige Antwort zu erhalten.

Um pysnmp arbeiten mit speziell erstellte IP-Adresse Werte machen Sie seine IpAddress Klasse zur Laufzeit es nehmen nur die vier führenden Bytes von einer möglicherweise länger initializer zu machen Patch könnte:

Sie
>>> def ipAddressPrettyIn(self, value): 
... return origIpAddressPrettyIn(self, value[:4]) 
... 
>>> origIpAddressPrettyIn = v2c.IpAddress.prettyIn 
>>> v2c.IpAddress.prettyIn = ipAddressPrettyIn 
>>> 
>>> msg, rest = decoder.decode(wholeMsg, asn1Spec=v2c.Message()) 
>>> print msg.prettyPrint() 
Message: 
version='version-2' 
community=public 
data=PDUs: 
response=ResponsePDU: 
    request-id=6564368 
    error-status='noError' 
    error-index=0 
    variable-bindings=VarBindList: 
    VarBind: 
    name=1.3.6.1.2.1.4.24.4.1.2.169.254.0.0.0.0.255.255.0.0.0.0.0 
    =_BindValue: 
    value=ObjectSyntax: 
     application-wide=ApplicationSyntax: 
     ipAddress-value=0.0.255.255 
+0

danken wieder :) –