2017-01-25 125 views
0

我在看this MIB browser code。但是這個o/p不能幫我弄清楚OID是標量還是Tabular的,使用PYSNMP MIB瀏覽器如何確定標量或Tabular oid?

我想要的是這樣的: ABP-SYSTEM :: systemName == 1.3.6.1.4.1 .211.1.24.12.100.1.2。 ###結束 '0' 要識別本OID表示的標量值####

預置O/P是這樣的:

ABP-SYSTEM :: SYSTEMNAME == 1.3。 6.1.4.1.211.1.24.12.100.1.2

這可能使用PYSNMP?

如果我使用其他MIB瀏覽器加載MIB​​文件,它會標識標量和表格值。

回答

0

編輯:

利用SNMP,標MIB的OID的對象實例總是0.0結束。但是,表格MIB對象實例也可以以'.0'(RFC 2578,7.7(2))結束。請注意這裏的單詞實例。 MIB對象永遠不會(?)以.0結尾我想。

MIB對象存在於MIB文件中,而不是MIB對象實例,它們由實時SNMP代理實現和報告。 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()對MIB對象,如MibScalarMibTableColumn等。要獲取這些類,可以像下面這樣從核心MIB中導入它們:

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

非零單個索引指示表格對象,但反過來i這不是真的。雖然INTEGER索引的確如此,但對於其他類型的值,.0在表格對象中是合法的。請參閱RFC 2578,7.7(2)及以下。例如。一個固定長度的1字符OCTET STRING。很少見。 –

+0

@Ilya,但是當我使用PYSNMP瀏覽MIB時,像systemName這樣的標量oid不會以.0結尾。有沒有辦法做到這一點? – sbhatta

+0

@ user3502325如果您正在瀏覽MIB定義而不是執行該MIB的SNMP代理程序,那麼您將獲得可能以任何內容結尾的MIB對象。當你瀏覽SNMP代理時,你得到的是MIB對象*實例* - 其中的OID包括(尾部)索引部分,它具有我們剛纔討論的'.0'情況。 –