我正在尝试利用PySNMP查询HP Procurve交换机。到目前为止,我已经通过mibdump.py将hpicfChassis.mib转换为HP-ICF-CHASSIS.py,并确认此MIB位于正确的路径中。我已尝试使用和不使用MibBuilder代码,但仍然存在错误。
我正在尝试查询hpicfSlotDescr的SNMP值以及此MIB中的其他SNMP值,它只会发出以下错误消息:
pysnmp.smi.error.SmiError:对象'hpicfSlotDescr'的实例索引(0,)到OID转换失败:ConstraintsIntersection(ConstraintsIntersection(ConstraintsIntersection(),ValueRangeConstraint(-2147483648,2147483647)),ValueRangeConstraint(1,16) )失败:“ValueRangeConstraint(1,16)失败于:”0“”在Integer32
我已经完成了数据包捕获,当使用hpicfSlotDescr(最多可以返回六个值)时,SNMP查询永远不会向交换机生成请求。
当查询不同的SNMP值(例如hpicfEntityIndex,它需要1个返回值)时,我看到发出的请求,但交换机从不回复。脚本和交换机上的社区名称匹配,我只是迷失了,想知道我想要完成的是否可行,如果是,我错过了哪些主要组件?
提前致谢!
from pysnmp.hlapi import *
from pysnmp.smi import builder
#MIBDIR = '/Python/Lib/site-packages/pysnmp_mibs'
#mibBuilder = builder.MibBuilder()
#mibSources = mibBuilder.getMibSources() + (builder.DirMibSource(MIBDIR),)
#mibBuilder.setMibSources(*mibSources)
#mibBuilder.loadModules('HP-ICF-CHASSIS')
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData('<comm name>', mpModel=1),
UdpTransportTarget(('<ipv4 address>', 161)),
ContextData(),
ObjectType(ObjectIdentity('HP-ICF-CHASSIS', 'hpicfSlotDescr', 0)))
)
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
答案 0 :(得分:0)
我的猜测是,根据您的MIB定义,表(HP-ICF-CHASSIS::hpicfSlotDescr
列所属的表)不允许零作为其索引值。这是在pysnmp异常中传达的:
ValueRangeConstraint(1, 16) failed at: "0"
由于pysnmp无法构建OID以从MIB符号数据进行查询,因此未发送任何数据包。所以我会在1..16范围内尝试正确的索引值,例如:
ObjectType(ObjectIdentity('HP-ICF-CHASSIS', 'hpicfSlotDescr', 1)))
最后,您并不需要手动MIB转换步骤。一旦将MIB名称传递给ObjectIdentity
类,后者将尝试在本地文件系统和this web site上查找此MIB的ASN.1源,并在后台将其编译为Python 。有关这方面的更多信息,请参阅pysnmp docs。