我正在尝试使用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>
如果我在这里遗失任何东西,有人可以告诉我吗?如何解决此错误?
答案 0 :(得分:1)
我猜一个问题是错误的MibVariable
初始化参数。最重要的是,您尝试引用的MIB对象未在SNMPv2-SMI MIB中定义。
MibVariable
(AKA ObjectIdentity)类型需要MIB-name
,object-name
,indices
。使用您的代码,您将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。