2010-12-06 62 views
1

我正在使用樹的SNMPWalk的GetNext操作的示例之一。我正在使用異步變體來收集OID -異步getNext出錯時出錯

# 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'} 

回答

1

改變CommunityData串的伎倆(我不知道爲什麼)

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

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

似乎在請求重試時發生。所以這可能與走出桌面無關。

我建議在SourceForge上從CVS升級你的pysnmp安裝,希望它已經是一個固定的錯誤。否則,請報告至[email protected]