pysnmp.smi.error.SmiError:尝试使用pysnmp打开apc插座时没有符号错误

时间:2017-10-26 20:15:51

标签: python python-2.7 pysnmp

我正在尝试使用pysnmp模块启动apc outlet。

这是手动命令,可以正常工作:

# snmpset -v1 -c comstring 10.x.x.x SNMPv2-SMI::enterprises.318.1.1.26.9.2.4.1.5.27 i 1
PowerNet-MIB::rPDU2OutletSwitchedControlCommand.27 = INTEGER: immediateOn(1)

以下是代码:

from pysnmp.entity.rfc3413.oneliner import cmdgen

cmdGen = cmdgen.CommandGenerator()

errorIndication, errorStatus, errorIndex, varBinds = cmdGen.setCmd(
    cmdgen.CommunityData('comstring'),
    cmdgen.UdpTransportTarget(('10.x.x.x', 161)),
    (cmdgen.MibVariable('SNMPv2-SMI', 'enterprises.318.1.1.26.9.2.4.1.5', "27"), 1)
)

# Check for errors and print out results
if errorIndication:
    print(errorIndication)
else:
    if errorStatus:
        print('%s at %s' % (
            errorStatus.prettyPrint(),
            errorIndex and varBinds[int(errorIndex)-1] or '?'
            )
        )
    else:
        for name, val in varBinds:
            print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))

我已将mibs文件复制到以下路径:

/usr/lib/python2.7/site-packages/pysnmp/smi/mibs
/usr/lib/python2.7/site-packages/pysnmp/smi/mibs/instances

当我尝试运行脚本时,我看到以下错误:

Traceback (most recent call last):
  File "snmp3.py", line 128, in <module>
    (cmdgen.MibVariable('SNMPv2-SMI', 'enterprises.318.1.1.26.9.2.4.1.5', "27"), 1)
  File "/usr/lib/python2.7/site-packages/pysnmp/entity/rfc3413/oneliner/cmdgen.py", line 200, in setCmd
    **kwargs):
  File "/usr/lib/python2.7/site-packages/pysnmp/hlapi/asyncore/sync/cmdgen.py", line 217, in setCmd
    lookupMib=options.get('lookupMib', True)))
  File "/usr/lib/python2.7/site-packages/pysnmp/hlapi/asyncore/cmdgen.py", line 239, in setCmd
    contextData.contextName, vbProcessor.makeVarBinds(snmpEngine, varBinds),
  File "/usr/lib/python2.7/site-packages/pysnmp/hlapi/varbinds.py", line 39, in makeVarBinds
    __varBinds.append(varBind.resolveWithMib(mibViewController))
  File "/usr/lib/python2.7/site-packages/pysnmp/smi/rfc1902.py", line 845, in resolveWithMib
    self.__args[0].resolveWithMib(mibViewController)
  File "/usr/lib/python2.7/site-packages/pysnmp/smi/rfc1902.py", line 481, in resolveWithMib
    self.__modName, self.__symName
  File "/usr/lib/python2.7/site-packages/pysnmp/smi/builder.py", line 407, in importSymbols
    'No symbol %s::%s at %s' % (modName, symName, self)
pysnmp.smi.error.SmiError: No symbol SNMPv2-SMI::enterprises.318.1.1.26.9.2.4.1.5 at <pysnmp.smi.builder.MibBuilder object at 0x367f550>

如果我在这里遗失任何东西,有人可以告诉我吗?如何解决此错误?

1 个答案:

答案 0 :(得分:1)

我猜一个问题是错误的MibVariable初始化参数。最重要的是,您尝试引用的MIB对象未在SNMPv2-SMI MIB中定义。

MibVariable(AKA ObjectIdentity)类型需要MIB-nameobject-nameindices。使用您的代码,您将object-name + indices粘贴在一起object-name。这就是它无法解析MIB对象的原因。

这个怎么样:

from pysnmp.hlapi import *
from pysnmp import debug

debug.setLogger(debug.Debug('msgproc'))

snmpEngine = SnmpEngine()

(errorIndication,
 errorStatus,
 errorIndex,
 varBinds) = next(
    setCmd(
      snmpEngine,
      CommunityData('public'),
      UdpTransportTarget(('demo.snmplabs.com', 161)),
      ContextData(),
      ObjectType(ObjectIdentity('SNMPv2-SMI', 'enterprises', '318.1.1.26.9.2.4.1.5.27'), Integer32(1))
    )
)

或者更好的方法是实际使用PowerNet-MIB

ObjectType(ObjectIdentity('PowerNet-MIB', 'rPDU2OutletSwitchedControlCommand', 27), 1) 

或者您可以将裸OID和值类型一起传递给pysnmp:

ObjectType(ObjectIdentity('1.3.6.1.4.1.318.1.1.26.9.2.4.1.5.27'), Integer32(1))

最后,您不应将MIB复制到pysnmp安装目录中。请考虑referring到您自己的MIB目录。或者,您可以要求pysnmp从the web自动搜索并下载所请求的MIB。