PYSNMP: pyasn1.error.SubstrateUnderrunError: 37998-октетный короткий

У меня есть python версии 4.3.2, py2exe 0.9.1.0, pysnmp 0.4.3.1, pyans1 0.1.9.
Я сталкиваюсь со всеми типами противоречивых ошибок во многих разных клиентах.
Один из моих клиентов, у которого есть сотни устройств SNMP, постоянно обнаруживает ошибки pysnmp, которые мешают ему обнаружить все устройства snmp.
Это функция:

def cbFun_Device(transportDispatcher, transportDomain, transportAddress, wholeMsg):
    while wholeMsg:
        for ip in Device.scan.devices:
            if ip == transportAddress[0]:
                try:
                    PDU = Device.scan.devices[ip].PDU
                    rspMsg, wholeMsg = decoder.decode(wholeMsg, asn1Spec = PDU['pMod'].Message())
                    rspPDU = PDU['pMod'].apiMessage.getPDU(rspMsg)
                    # Match response to request
                    if PDU['pMod'].apiPDU.getRequestID(PDU['reqPDU']) == PDU['pMod'].apiPDU.getRequestID(rspPDU):
                        errorStatus = PDU['pMod'].apiPDU.getErrorStatus(rspPDU)
                        if not (errorStatus and errorStatus != 2):
                            PDUarr = []
                            varBindTable = PDU['pMod'].apiPDU.getVarBindTable(PDU['reqPDU'], rspPDU)
                            for tableRow in varBindTable:
                                for oid, val in tableRow:
                                    print('from: %s, %s = %s' % (transportAddress, oid.prettyPrint(), val.prettyPrint()))
                                    if str(oid.prettyPrint()) not in Device.scan.params['MIBs']:
                                        for mibOID in PDU['MIBs']:
                                            if str(oid.prettyPrint()).find(mibOID) != -1 and mibOID not in Device.scan.devices[ip].MIBs:
                                                Device.scan.devices[ip].MIBs.append(mibOID)
                                    for tree in PDU['OIDs']:
                                        if str(oid.prettyPrint()).find(tree) != -1 and str(oid.prettyPrint()) not in Device.scan.devices[ip].OIDs:
                                            Device.scan.devices[ip].OIDs[str(oid.prettyPrint())] = val.prettyPrint()[:-1][2:] if val.prettyPrint().startswith("b'") and val.prettyPrint().endswith("'") else val.prettyPrint()
                                            PDUarr.append((str(oid.prettyPrint()), PDU['pMod'].null))
                            # Stop on EOM
                            for oid, val in varBindTable[-1]:
                                if not isinstance(val, PDU['pMod'].Null):
                                    break
                            else:
                                Progress.networks[ip]['Done'] = True
                                print("IP-------- " + ip)
                                Progress.progress.append(1)
                                Device.transportDispatcher.jobFinished(1)
                                continue    
                            # Generate request for next row
                            print(PDUarr)
                            if PDUarr != []:
                                PDU['pMod'].apiPDU.setVarBinds(PDU['reqPDU'], PDUarr)
                                PDU['pMod'].apiPDU.setRequestID(PDU['reqPDU'], PDU['pMod'].getNextRequestID())
                                Device.transportDispatcher.sendMessage(
                                    encoder.encode(PDU['reqMsg']), transportDomain, transportAddress
                                    )
                                Progress.networks[ip]['Time'] = time.time()
                            else:
                                Progress.networks[ip]['Done'] = True
                                print("IP-------- " + ip)
                                Progress.progress.append(1)
                                Device.transportDispatcher.jobFinished(1)
                                continue

И это ошибка, которую я получаю:

37998-octet short
Traceback (most recent call last):
File "C:\device.py", line 137, in cbFun_Device
File "C:\Python34\lib\site-packages\pyasn1\codec\ber\decoder.py", line 706, in __call__
pyasn1.error.SubstrateUnderrunError: 37998-octet short

И иногда эта ошибка тоже:

  pyasn1.error.PyAsn1Error: Empty substrate

но все ошибки происходят в этой строке:

rspMsg, wholeMsg = decoder.decode(wholeMsg, asn1Spec = PDU['pMod'].Message())

Что здесь происходит?

0 ответов

Другие вопросы по тегам