我一直在尝试实现加载我的设备MIBS并遍历所有OIDS的代码。在这种情况下,当我尝试为snmp 1.3.6.1.2.1.11加载OID时,smi在尝试加载特定OID时抛出异常。以前的OID成功运行:'。1.3.6.1.2.1.11.29.0'但是这个生成错误消息'.1.3.6.1.2.1.11.30.0'
例外是:
文件“/opt/anaconda/lib/python2.7/site-packages/pysnmp/smi/rfc1902.py”,第859行,在resolveWithMib中 提升SmiError('MIB对象%r,类型%r无法转换值%r:%s'%(self。 args [0] .prettyPrint(),self .__ args [0] .getMibNode()。getSyntax ().__ class 。 name ,self .__ args [1],sys.exc_info()[1])) ; SmiError:类型为'Integer32'的MIB对象'SNMPv2-MIB :: snmpEnableAuthenTraps.0'无法转换值Integer32(808466736):ConstraintsIntersection(ConstraintsIntersection(ConstraintsIntersection(),ValueRangeConstraint(-2147483648,2147483647)),SingleValueConstraint(1, 2))失败:“SingleValueConstraint(1,2)失败于:”808466736“”在Integer32
以下是演示错误的示例代码。您需要修改DEVICE_IP。假设您正在运行SNMP v1并且正在运行社区'public。它正在运行pysnmp版本4.3.2
from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.smi.rfc1902 import ObjectIdentity
DEVICE_IP = 'localhost'
def get_oid(oid):
"""
Requires a valid oid as input and retrieves the given OID
"""
snmp_target = (DEVICE_IP, 161)
cmdGen = cmdgen.CommandGenerator()
result = None
errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(
cmdgen.CommunityData('public', mpModel=0),
cmdgen.UdpTransportTarget(snmp_target),
ObjectIdentity(oid, last=True),
lexicographicMode=False
)
if errorIndication:
print(errorIndication)
else:
for varBindTableRow in varBindTable:
for name, val in varBindTableRow:
try:
result = str(val)
except:
raise
return result
# Does not Throw Error
print get_oid('.1.3.6.1.2.1.11.29.0')
# Throws Error
print get_oid('.1.3.6.1.2.1.11.30.0')
答案 0 :(得分:0)
您的SNMP代理使用 1.3.6.1.2.1.11.30.0 = 808466736 进行响应,而OID 1.3.6.1.2.1.11.30.0标识了类型为MIB对象的 snmpEnableAuthenTraps INTEGER只允许两个值:1和2.
以下是SNMPv2-MIB的正式定义:
snmpEnableAuthenTraps OBJECT-TYPE
SYNTAX INTEGER { enabled(1), disabled(2) }
...
所以这次pysnmp似乎做了正确的事情 - 它使你免受那些毫无意义的价值。此问题的根本原因是SNMP代理为MIB对象发送格式错误的值。