gpt4 book ai didi

python - 异步 getNext 超出表时出错

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:08 25 4
gpt4 key购买 nike

我正在使用树的 SNMPWalk 的 GetNext 操作示例之一。我正在使用异步变体来收集 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'}

最佳答案

更改 CommunityData 字符串就可以了(我不知道为什么)

之前

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

之后

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

关于python - 异步 getNext 超出表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4370540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com