从django视图调用时,pysnmp发送超时

时间:2015-02-03 16:05:09

标签: python django pysnmp

我正在尝试从一些网络交换机中获取一些孩子,并使用名为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

1 个答案:

答案 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)。