Используя браузер PYSNMP MIB, как определить скаляр или табличный oid?


person sbhatta    schedule 25.01.2017    source источник


Ответы (1)


РЕДАКТИРОВАТЬ:

При использовании SNMP идентификаторы OID скалярных объектов MIB экземпляров всегда заканчиваются на .0. Но экземпляры табличных объектов MIB также могут заканчиваться на '.0' (RFC 2578, 7.7 (2)). Обратите внимание на слово экземпляры. Я думаю, объекты MIB никогда (?) не заканчиваются на .0.

Объекты MIB находятся в файлах MIB, в отличие от экземпляров объектов MIB, которые реализуются и сообщаются активными агентами SNMP. С точки зрения OID существует отношение родитель-потомок между объектом MIB (родительским) и экземплярами объекта MIB (дочерний для скаляров, дочерний для столбцов таблицы).

Позвольте мне предложить вам этот простой скрипт. Он проходит по дереву OID, загруженному из файлов MIB (таким образом, он работает только с объектами MIB). Тестируя класс mibNode, вы можете определить, является ли объект столбчатым (MibTableColumn) или скалярным (MibScalar), или чем-то еще, что может предоставить SNMP SMI.

from pysnmp.smi import builder, view, compiler, error

mibBuilder = builder.MibBuilder()

# Optionally attach PySMI MIB compiler to deal with ASN.1 MIBs
#compiler.addMibCompiler(mibBuilder, sources=['/usr/share/snmp/mibs'])

mibBuilder.loadModules('SNMPv2-MIB', 'SNMP-FRAMEWORK-MIB', 'SNMP-COMMUNITY-MIB')

mibView = view.MibViewController(mibBuilder)

oid, label, suffix = mibView.getFirstNodeName()
while True:
    try:
        modName, nodeDesc, suffix = mibView.getNodeLocation(oid)
        mibNode, = mibBuilder.importSymbols(modName, nodeDesc)

        print('%s::%s (%s) -> %s' % (modName, nodeDesc, '.'.join([str(x) for x in oid]), type(mibNode).__name__))

        oid, label, suffix = mibView.getNextNodeName(oid)
    except error.NoSuchObjectError:
        break

Вот фрагмент его вывода, чтобы дать вам представление:

...
SNMPv2-MIB::system (1.3.6.1.2.1.1) -> MibIdentifier
SNMPv2-MIB::sysDescr (1.3.6.1.2.1.1.1) -> MibScalar
SNMPv2-MIB::sysObjectID (1.3.6.1.2.1.1.2) -> MibScalar
SNMPv2-MIB::sysUpTime (1.3.6.1.2.1.1.3) -> MibScalar
...
SNMP-TARGET-MIB::snmpTargetParamsTable (1.3.6.1.6.3.12.1.3) -> MibTable
SNMP-TARGET-MIB::snmpTargetParamsEntry (1.3.6.1.6.3.12.1.3.1) -> MibTableRow
SNMP-TARGET-MIB::snmpTargetParamsName (1.3.6.1.6.3.12.1.3.1.1) -> MibTableColumn
SNMP-TARGET-MIB::snmpTargetParamsMPModel (1.3.6.1.6.3.12.1.3.1.2) -> MibTableColumn
SNMP-TARGET-MIB::snmpTargetParamsSecurityModel (1.3.6.1.6.3.12.1.3.1.3) -> MibTableColumn
...

Если вы хотите разветвляться на основе типа узла MIB, вы можете использовать isinstance() для объектов MIB, таких как MibScalar, MibTableColumn и т. д. Чтобы получить доступ к этим классам, вы можете импортировать их из ядра MIB следующим образом:

MibScalar, MibTableColumn = mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalar', 'MibTableColumn')
person Ilya Etingof    schedule 25.01.2017
comment
Ненулевой одиночный индекс указывает на табличный объект, но обратное неверно. Хотя это верно для индексов INTEGER, для других типов допустимо значение .0 в табличных объектах. См. RFC 2578, 7.7 (2) и далее. Например. 1-символьная ОКТЕТНАЯ СТРОКА фиксированной длины. Правда редко. - person Gambit Support; 25.01.2017
comment
@ Илья, но когда я просматриваю MIB с помощью PYSNMP, скалярные oids, такие как systemName, не заканчиваются на .0. есть ли способ сделать это? - person sbhatta; 25.01.2017
comment
@user3502325 user3502325 Если вы просматриваете определения MIB, а не агент SNMP, реализующий этот MIB, вы получаете объекты MIB, которые могут заканчиваться чем угодно. Когда вы просматриваете агент SNMP, вы получаете объекты MIB экземпляры -- OID которых включают (завершающую) часть индекса, которая имеет только что рассмотренную ситуацию '.0'. - person Ilya Etingof; 25.01.2017
comment
@GambitSupport О, да, это моя ошибка. Я собираюсь исправить свой ответ. - person Ilya Etingof; 25.01.2017
comment
@ Илья, приведенный выше код отлично работает, как раз то, что я хотел. Но с pysnmp 4.3.2 этот тип (mibNode).__name__ не выводит скаляр. это просто сказать экземпляр. ››› type(mibNode) ‹type 'instance'› ››› type(mibNode).__name__ 'instance' ››› в любом случае я получил то, что мне нужно, как определить другой тип объекта. Большое спасибо. - person sbhatta; 27.01.2017
comment
@ user3502325 Это связано с вашей версией Python, а не с pysnmp. Либо попробуйте mibNode.__class__.__name__, либо используйте isinsntance, как я только что упомянул в ответе. - person Ilya Etingof; 27.01.2017