使用PYSNMP MIB浏览器如何确定标量或表格oid?

时间:2017-01-25 06:16:16

标签: python-2.7 snmp pysnmp

我在看this MIB browser code。但这个o / p并没有帮助我弄清楚OID是标量还是表格式,

我想要的是这样的:  ABP-SYSTEM :: systemName == 1.3.6.1.4.1.211.1.24.12.100.1.2。 0 ### End' 0'识别此oid表示标量值。####

预设o / p是这样的:

ABP-SYSTEM :: systemName == 1.3.6.1.4.1.211.1.24.12.100.1.2

这是否可以使用PYSNMP?

如果我使用其他MIB浏览器加载MIB​​文件,它会识别标量和表格值。

1 个答案:

答案 0 :(得分:0)

编辑:

使用SNMP,标量MIB对象实例的OID始终以 .0 结尾。但表格式MIB对象实例也可以以' .0' (RFC 2578,7.7(2))结尾。请注意这里的单词实例。 MIB对象从不(?)以 .0 结束。我想。

MIB对象存在于MIB文件中,而不是由实时SNMP代理实现和报告的MIB对象实例。 OID方面,MIB对象(父)和MIB对象实例之间存在父子关系(标量的子项,表列的子项)。

让我为您提供这个简单的脚本。它遍历从MIB文件加载的OID树(因此它只处理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()MibScalar等MIB对象使用MibTableColumn。要掌握这些类,可以从中导入它们像这样的核心MIB:

MibScalar, MibTableColumn = mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalar', 'MibTableColumn')