当我将所有必需的MIB文件编译并加载到pysnmp时,sysObjectID应该返回完全解析的MIB。但这不是
到目前为止,我所做的是,我创建了一个mib_builder并将预编译的mib源添加到了生成器中,通过提供MibInstrumController的MsgAndPduDispatcher将milb的mib构建器从hlapi传递给了SnmpEngine。然后请求sysObjectID。
请考虑以下代码块:
from pysnmp.smi import builder, view, compiler, error, instrum
from pysnmp.proto.rfc3412 import MsgAndPduDispatcher
from pysnmp.hlapi import *
mib_builder = builder.MibBuilder()
mib_builder.addMibSources(builder.DirMibSource('/path/to/compiled/mibs/'))
engine = SnmpEngine(msgAndPduDsp=MsgAndPduDispatcher(mibInstrumController=instrum.MibInstrumController(mib_builder)))
oid = ObjectIdentity("SNMPv2-MIB", "sysObjectID")
for (errorIndication,
errorStatus,
errorIndex,
varBinds) in nextCmd(
self.engine,
CommunityData('public', mpModel=1),
UdpTransportTarget(('192.168.0.222', 161)),
ContextData(),
ObjectType(oid),
lexicographicMode=False
):
if errorIndication:
print(errorIndication)
break
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
break
else:
for varBind in varBinds:
print(varBind)
它应该为sysObjectID返回正确的MIB。但是它返回了,
SNMPv2-MIB::sysObjectID.0 = SNMPv2-SMI::enterprises.9.1.1047
然后我尝试了
for varBind in varBinds:
print(varBind)
if type(varBind[1]) == type(oid):
_oid, label, suffix = view.MibViewController(mib_builder).getNodeName(varBind[1].getOid())
print(_oid, label, suffix)
返回
SNMPv2-MIB::sysObjectID.0 = SNMPv2-SMI::enterprises.9.1.1047
1.3.6.1.4.1 ('iso', 'org', 'dod', 'internet', 'private', 'enterprises') 9.1.1047
正确的MIB驻留在CISCO-PRODUCTS-MIB中,并且已对其进行编译。
那么,如何为sysObjectID获取正确的MIB?
答案 0 :(得分:0)
TL; DR; -尝试将.loadMibs('CISCO-PRODUCTS-MIB')添加到ObjectIdentity
对象中。
您可能需要这样做的原因是pysnmp不会将OID自动映射到MIB。因此,当pysnmp获取OID进行翻译时,它只会尝试使用已加载的MIB进行尝试。
顺便说一句,您不需要那么多代码即可实现您想要的目标。只需一个基线SNMP get/walk(加上您希望使用的MIB的.loadMibs()
)就可以满足要求。