2012-04-20 11 views
5

sto usando il seguente script semplice:PySNMP non può riconoscere la risposta

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()) 

Utilizzando snmpwalk da riga di comando per questo risultato atteso rendimenti dei dispositivi. Ma lo script restituisce Nessuna risposta SNMP ricevuta prima del timeout. Se ometto questo OID, allora tutto funziona correttamente. Quindi il problema è in questo OID

statistiche Qui tcpdump:

/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] 

Come possiamo vedere, i rendimenti dispositivo di risposta .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, ma non succede nulla e pysnmp solo continuano a provare e riprovare il valore di questo OID .. snmpwalk riconosce questa risposta come IP ADDRESS 0.0.255.255

Potete aiutarmi ragazzi? Grazie in anticipo e scusa il mio inglese.

risposta

4

L'agente SNMP sembra produrre messaggi SNMP danneggiati. Mentre l'indirizzo IPv4 è lungo quattro ottetti, l'agente segnala il valore di otto-ottetti.

Come da SNMP RFC, pysnmp elimina i messaggi SNMP malformati e riprova alcune volte la richiesta originale nella speranza di ottenere una risposta corretta.

Per rendere pysnmp lavorare con valori di indirizzo IP specifico malformati si potrebbe rattoppare sua classe IpAddress in fase di esecuzione per rendere più prendendo solo i quattro ottetti che conducono da un inizializzatore possibilmente più:

>>> 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

grazie ancora :) –

Problemi correlati