异步getNext在超出表时出错

1 投票
2 回答
794 浏览
提问于 2025-04-16 08:08

我正在使用一个关于GetNext操作的例子,来进行SNMPWalk这个树的遍历。我使用的是异步的方式来收集OID(对象标识符) -

# GETNEXT Command Generator
from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto import rfc1902

# ( ( authData, transportTarget, varNames ), ... )
targets = (
    # 1-st target (SNMPv1)
    ( cmdgen.CommunityData('test-agent-1', 'public'),
      cmdgen.UdpTransportTarget(('localhost', 161)),
      (rfc1902.ObjectName((1,3,6,1,2,1)), rfc1902.ObjectName((1,3,6,1,3,1)))),
    # 2-nd target (SNMPv2c)
    ( cmdgen.CommunityData('test-agent-2', 'public', 1),
      cmdgen.UdpTransportTarget(('localhost', 161)),
      (rfc1902.ObjectName((1,3,6,1,2,1,2)),) ),
    )

def cbFun(
    sendRequestHandle, errorIndication, errorStatus, errorIndex,
    varBindTable, (varBindHead, authData, transportTarget)
    ):
    if errorIndication:
        print 'SNMP engine error', errorIndication
        return 1
    if errorStatus:
        print 'SNMP error %s at %s' % (errorStatus, errorIndex)
        return 1
    varBindTableRow = varBindTable[-1]
    for idx in range(len(varBindTableRow)):
        name, val = varBindTableRow[idx]
        if val is not None and varBindHead[idx].isPrefixOf(name):
            # still in table
            break
    else:
        print 'went out of table at %s' % (name, )
        return

    for varBindRow in varBindTable:
        for oid, val in varBindRow:
            if val is None:
                print oid.prettyPrint()
            else:
                print '%s = %s' % (oid.prettyPrint(), val.prettyPrint())

    return 1 # continue table retrieval

cmdGen  = cmdgen.CommandGenerator()

for authData, transportTarget, varNames in targets:
    cmdGen.asyncNextCmd(
        authData, transportTarget, varNames,
        # User-space callback function and its context
        (cbFun, (varNames, authData, transportTarget))
        )

cmdGen.snmpEngine.transportDispatcher.runDispatcher()

我得到了我需要的OID;但是当它离开表格并从cbFun返回时,最后一行的调度器抛出了一个错误,我无法解决。输出看起来像这样 -

... (some 1.3.6.1.2.1.* stuff)
1.3.6.1.2.1.2.2.1.22.1 = 0.0
1.3.6.1.2.1.2.2.1.22.2 = 0.0
1.3.6.1.2.1.2.2.1.22.3 = 0.0
went out of table at (1, 3, 6, 1, 2, 1, 3, 1, 1, 1, 2, 1, 212, 201, 49, 186)
Traceback (most recent call last):
  File "asyncsnmpwalk.py", line 55, in <module>
    cmdGen.snmpEngine.transportDispatcher.runDispatcher()
  File "/var/lib/python-support/python2.5/pysnmp/v4/carrier/asynsock/dispatch.py", line 61, in runDispatcher
    self.handleTimerTick(time())
  File "/var/lib/python-support/python2.5/pysnmp/v4/carrier/base.py", line 81, in handleTimerTick
    self.__timerCbFun(timeNow)
  File "/var/lib/python-support/python2.5/pysnmp/v4/entity/engine.py", line 60, in __receiveTimerTickCbFun
    self.msgAndPduDsp.receiveTimerTick(self, timeNow)
  File "/var/lib/python-support/python2.5/pysnmp/v4/proto/rfc3412.py", line 491, in receiveTimerTick
    self.__cacheExpire(snmpEngine, self.__expireRequest)
  File "/var/lib/python-support/python2.5/pysnmp/v4/proto/rfc3412.py", line 56, in __cacheExpire
    if cbFun(snmpEngine, cachedParams):
  File "/var/lib/python-support/python2.5/pysnmp/v4/proto/rfc3412.py", line 486, in __expireRequest
    cbCtx
  File "/var/lib/python-support/python2.5/pysnmp/v4/entity/rfc3413/cmdgen.py", line 77, in processResponsePdu
    (self.processResponsePdu, (cbFun, cbCtx))
  File "/var/lib/python-support/python2.5/pysnmp/v4/entity/rfc3413/cmdgen.py", line 164, in _sendPdu
    (processResponsePdu, float(timeout)/100 + time.time(), cbCtx)
  File "/var/lib/python-support/python2.5/pysnmp/v4/proto/rfc3412.py", line 161, in sendPdu
    sendPduHandle
  File "/var/lib/python-support/python2.5/pysnmp/v4/proto/mpmod/rfc2576.py", line 89, in prepareOutgoingMessage
    scopedPDU
  File "/var/lib/python-support/python2.5/pysnmp/v4/proto/secmod/rfc2576.py", line 78, in generateRequestMsg
    errorIndication = 'unknownCommunityName'
pysnmp.proto.error.StatusInformation: {'errorIndication': 'unknownCommunityName'}

2 个回答

0

这似乎是在请求重试时发生的。所以可能和超出表格没有关系。

我建议你从SourceForge上升级你的pysnmp安装,看看是否已经修复了这个错误。如果没有解决,请发邮件到pysnmp-users@lists.sourceforge.net报告一下。

1

修改了CommunityData这个字符串就解决了问题(我也不知道为什么)

之前的代码

cmdgen.CommunityData('test-agent-1', 'public'), 

之后的代码

cmdgen.CommunityData('test-agent', 'public'),

撰写回答