Как получить правильный MIB для sysObjectID в pysnmp - PullRequest
0 голосов
/ 04 июня 2019

Когда у меня есть все необходимые файлы MIB, скомпилированные и загруженные в pysnmp, sysObjectID должен вернуть полностью проанализированный MIB.Но это не

Что я сделал до сих пор, так это то, что я создал mib_builder и добавил в конструктор предварительно скомпилированный источник mib, передал конструктор mib в SnmpEngine из hlapi через MsgAndPduDispatcher, предоставив MibInstrumController.И затем запрашивается 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)

Он должен вернуть правильный MIB для sysObjectID.Но он возвращает,

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, и у меня естьон скомпилирован.

Итак, что я могу сделать, чтобы получить правильный MIB для sysObjectID?

1 Ответ

0 голосов
/ 05 июня 2019

TL; DR;- попробуйте добавить .loadMibs ('CISCO-PRODUCTS-MIB') к вашему ObjectIdentity объекту.

Причина, по которой вам может потребоваться, заключается в том, что pysnmp не сопоставляет OID с MIB автоматически,Поэтому, когда pysnmp получает OID для преобразования, он пытается только с уже загруженными MIB.

Кстати, вам не нужно так много кода для достижения того, что вы пытаетесь.Достаточно просто базовой линии SNMP get / walk (плюс .loadMibs() для MIB, с которыми вы планируете работать).

...