PyAsn1Error bei SNMP-Abfragen?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
chpo7234
User
Beiträge: 35
Registriert: Dienstag 29. September 2015, 10:19

Hallo Leute,

ich verwende ein Script, welches mehrere IP's im Multithread-Verfahren nach dem Ping- und einer SNMP-OID abfragt. Anscheinend eher willkürlicher erhalte ich oftmals auf einzelne Threads kein gültiges Ergebnis und wird mir folgender Fehlercode ausgespuckt:
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "python/scan.py", line 64, in run
self.snmp = self.check_snmp(self.ip)
File "python/scan.py", line 82, in check_snmp
'1.3.6.1.2.1.1.1.0'
File "build/bdist.linux-x86_64/egg/pysnmp/entity/rfc3413/oneliner/cmdgen.py", line 370, in getCmd
kwargs.get('contextName', null)
File "build/bdist.linux-x86_64/egg/pysnmp/entity/rfc3413/oneliner/cmdgen.py", line 210, in getCmd
contextEngineId, contextName
File "build/bdist.linux-x86_64/egg/pysnmp/entity/rfc3413/cmdgen.py", line 329, in sendReq
(self.processResponsePdu, (cbFun, cbCtx))
File "build/bdist.linux-x86_64/egg/pysnmp/entity/rfc3413/cmdgen.py", line 231, in _sendPdu
cbCtx
File "build/bdist.linux-x86_64/egg/pysnmp/proto/rfc3412.py", line 155, in sendPdu
sendPduHandle
File "build/bdist.linux-x86_64/egg/pysnmp/proto/mpmod/rfc2576.py", line 64, in prepareOutgoingMessage
pdu.tagSet, pdu, verifyConstraints=False
File "build/bdist.linux-x86_64/egg/pyasn1/type/univ.py", line 874, in setComponentByType
idx = self._componentType.getPositionByType(tagSet)
File "build/bdist.linux-x86_64/egg/pyasn1/type/namedtype.py", line 68, in getPositionByType
raise error.PyAsn1Error('Type %s not found' % (tagSet,))
PyAsn1Error: Type TagSet(Tag(tagClass=128, tagFormat=32, tagId=0)) not found
Meine Methode für die SNMP-Abfrage sieht wie folgt aus:

Code: Alles auswählen

    def check_snmp(self, ip):
        command_generator = cmdgen.CommandGenerator()
        error_indication, error_status, _, var_binding = command_generator.getCmd(
            cmdgen.CommunityData('public'),
            cmdgen.UdpTransportTarget((ip, 161), timeout=1, retries=0),
            '1.3.6.1.2.1.1.1.0'
        )
     
        if error_indication or error_status:
            return 'no snmp'
        else:
            return var_binding[0][1]
Ich hoffe, dass für mein Anliegen der Code-Snippet erst mal reicht. Beim nächsten IP-Scan wird mir das SNMP-Ergebnis denn wieder korrekt dargestellt....

Hat vielleicht jemand eine Ahnung, woran das liegen könnte?
chpo7234
User
Beiträge: 35
Registriert: Dienstag 29. September 2015, 10:19

Hat niemand eine Ahnung? :(

Im vollständigen Script lasse ich einen ganzen Adressbereich scannen.
Wenn das Problem nicht lösbar ist, denn lasse ich bei Exception sonst die SNMP-Abfrage erneut ausführen:

Code: Alles auswählen

def check_snmp(self, ip):
        try:
            command_generator = cmdgen.CommandGenerator()
            error_indication, error_status, _, var_binding = command_generator.getCmd(
                cmdgen.CommunityData('public'),
                cmdgen.UdpTransportTarget((ip, 161), timeout=1, retries=0),
                '1.3.6.1.2.1.1.1.0'
            )
         
            if error_indication or error_status:
                return 'no snmp'
            else:
                return var_binding[0][1]
        except KeyError:
            self.snmp(ip)
Ich hoffe die Ausnahmen-Regelung ist für den Fehler richtig und dass das außerhalb des eigenen Systems nicht zu Endlosschleifen führen kann..

Lieben Gruß
BlackJack

@chpo7234: Was ist denn `self.snmp()`? Kann das zu einer Endlosrekursion führen? Das würde dann zu einer Ausnahme führen können weil der Stapelspeicher endlich ist und die Python-Laufzeitbibliothek die Anzahl der rekursiven Aufrufe begrenzt. Das sollte man mit einer Schleife lösen. Und auch dann Vorkehrungen treffen damit das keine Endlosschleife wird.
chpo7234
User
Beiträge: 35
Registriert: Dienstag 29. September 2015, 10:19

Huch, kein Wunder, dass der Code später keine Auswirkung zeigte... Gut, dass du mich noch mal darauf aufmerksam gemacht hast!

In der Exception sollte die Funktion sich noch mal selber aufrufen. Also nicht snmp(), sondern check_snmp(), sorry!
Ich werde das gleich noch mal editieren..

Die Abbruchbedingung ist eine gute Idee gegen den Stapel-Überlauf - danke dafür!
BlackJack

@chpo7234: Gegen den Stapelüberlauf wäre eine Schleife die bessere Idee. Und damit hätte man ja auch gleich eine Begrenzung wenn man keine Endlosschleife nimmt, sondern eine die nur n mal läuft.
Antworten