РЕДАКТИРОВАТЬ:
При использовании 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