我正在尝试从一些网络交换机中获取一些孩子,并使用名为pysnmp的purepyton库。它没有安装问题。
使用了可行的示例代码。
from pysnmp.entity.rfc3413.oneliner import cmdgen
cmdGen = cmdgen.CommandGenerator()
datos = []
ip = 'theipaddress'
comunidad_snmp = 'thecomunityv2c'
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
cmdgen.CommunityData(comunidad_snmp),
cmdgen.UdpTransportTarget((ip, 161)),
'.1.3.6.1.2.1.1.1.0', # sysDescr.0
lookupNames=True, lookupValues=True
)
if errorIndication:
print(errorIndication)
elif errorStatus:
print(errorStatus)
else:
for name, val in varBinds:
datos.append({'nombre': name.prettyPrint(), 'valor': val.prettyPrint()})
print datos
我们的问题是,如果我在任何视图中复制此代码(按原样),结果总是
"No SNMP response received before timeout"
我们需要添加一些东西才能按预期工作吗?
环境是美分6
答案 0 :(得分:0)
您的命令行测试没有过滤掉来自Django主机的SNMP / UDP查询吗?
深入挖掘:您的代码使用默认的基于asyncore的传输调用pysnmp。如果Django(或其某些组件)以某种方式以非合作的方式使用asyncore,pysnmp / django系统可能以某种方式干扰...一种避免这种干扰的方法是使用你自己的pysnmp I / O套接字对象映射,就像这样:
...
from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher
cmdGen.snmpEngine.registerTransportDispatcher(AsynsockDispatcher())
mySockMap = {}
cmdGen.snmpEngine.transportDispatcher.setSocketMap(mySockMap)
...
另一个想法是启用pysnmp调试以查看其中的内容:
import sys
from pysnmp import debug
debug.setLogger(debug.Debug('all', printer=sys.stderr.write))
还有其他更简洁的pysnmp调试标志(参见pysnmp.debug)。