0

我重新尝试从某个网络交换机中获取一些孩子,为此我使用了一个名为 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

4

1 回答 1

0

是不是你的 Django 主机的 SNMP/UDP 查询被过滤了,而你的命令行测试没有?

深入挖掘:您的代码使用默认的、基于异步的传输调用 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)。

于 2015-02-03T21:13:00.757 回答