2012-04-05 76 views
2

当我使用snmpwalk的一个OID(1.3.6.1.4.1.2021.4),我得到以下的结果:如何在pysnmp中查找mib表?

UCD-SNMP-MIB::memIndex.0 = INTEGER: 0 

UCD-SNMP-MIB::memErrorName.0 = STRING: swap 

UCD-SNMP-MIB::memMinimumSwap.0 = INTEGER: 16000 kB 

但是,当我使用pysnmp模块查询相同的OID,我得到的结果:

(ObjectName(1.3.6.1.4.1.2021.4.1.0), Integer(0)) 

(ObjectName(1.3.6.1.4.1.2021.4.2.0), OctetString('swap')) 

(ObjectName(1.3.6.1.4.1.2021.4.12.0), Integer(16000)) 

我已经把pysnmp_mibs在os.environ和我正在使用的代码是:

from pysnmp.entity.rfc3413.oneliner import cmdgen 
from pysnmp.smi import builder, view, error 

errorIndication, errorStatus, errorIndex, \ 
      varBindTable = cmdGen.nextCmd (
cmdgen.CommunityData('test-agent', 'public'), 
cmdgen.UdpTransportTarget ((localhost, 161)), 
('1.3.6.1.4.1.2021.4') 
) 

if errorIndication: 
    log.warn(errorIndication) 
    return 
else: 
    if errorStatus: 
     log.warn('%s at %s\n' % (
      errorStatus.prettyPrint(), 
      errorIndex and varBindTable[-1][int (errorIndex) - 1] or '?' 
      )) 
     return 
    else: 
     for varBindTableRow in varBindTable: 
      for oid, val in varBindTableRow: 
        (symName, modName), indices = cmdgen.mibvar.oidToMibName(
         cmdGen.mibViewController, oid 
         ) 
        val = cmdgen.mibvar.cloneFromMibValue(
            cmdGen.mibViewController, modName, symName, val 
         ) 
      print varBindTableRow 

我的问题是,为什么snmpwalk的和pysnmp结果不同,有什么建议立即进行删除我做得到的结果与使用pysnmp模块的snmpwalk相同吗?


编辑

我试过的代码,但在查询1.3.6.1.2.1.4.22.1 我收到以下错误

NoSuchObjectError: NoSuchObjectError({'str': 'No MIB info for (1, 3, 6, 1, 4, 1, 2021, 4, 1, 0) (closest parent (1, 3, 6, 1, 4, 1))'}) 

我已经装IP-MIB模块为:

mibBuilder = builder.MibBuilder() 
mibPath = mibBuilder.getMibSources()+(builder.DirMibSource(path_to_mib_dir),) 
mibBuilder.setMibSources(*mibPath) 
mibBuilder.loadModules('IP-MIB') 
mibView = view.MibViewController(mibBuilder) 

我很困惑是如何使用这个mibView

(symName,modName),indices=cmdgen.mibvar.oidToMibName(cmdGen.mibViewController, oid) 
val=cmdgen.mibvar.cloneFromMibValue(cmdGen.mibViewController,modName, symName, val) 

cmdGen.mibViewController将与mibView更换?

,但它适用于OID 1.3.6.1.2.1.1.3: 和我得到的结果如预期:

SNMPv2-MIB::sysUpTime.0 = 27 
+1

您似乎将IP-MIB加载到MIB树的* another *实例中,与您用于OID分辨率的不同。如果您使用mibBuilder = cmdGen.mibViewController.mibBuilder – 2012-04-22 18:31:55

+0

,您的IP-MIB加载代码也可能工作。您还可以参考在UCD-SNMP-MIB中定义的1.3.6.1.4.1.2021.4.1.0。由于pysnmp-mibs尚未包含该MIB,因此您必须使用pysnmp/tools/build-pysnmp-mib脚本将其编译到python模块中。加载完成后,您的OID分辨率可能会有效。 – 2012-04-22 18:37:35

+0

谢谢。 mibBuilder = cmdGen.mibViewController.mibBuilder工作。 但是我得到一个: './build-pysnmp-mib〜/ Desktop/src/UCD-SNMP-MIB。mib 空输入 smidump -k -f python /Users/furion/Desktop/src/UCD-SNMP-MIB.mib | ./libsmi2pysnmp失败 在尝试使用pysnmp/tools/build-pysnmp-mib脚本编译UCD-SNMP-MIB时,请确保您使用的是libsmi版本> 0.4.5(或svn)' 错误。 – ashokadhikari 2012-04-26 05:50:14

回答

0

尝试印刷:

print '%s::%s.%s = %s' % (
        modName, symName, 
        '.'.join(map(lambda v: v.prettyPrint(), indices), 
        val.prettyPrint() 
        ) 

代替

print varBindTableRow 

还要确保您加载相应的MIB。

+0

我也尝试了上面的代码,但是我收到了错误。 请看我的问题,我已编辑它包含它的细节。 – ashokadhikari 2012-04-20 09:18:29

0

对不起,但结果都是一样的!

如果您的问题是大约16000比16000 KB,您必须知道SNMP不会返回该单位。 SNMP V2 MIB只允许提供有关它的信息,所以SNMPWALK(作为客户端)正在使用它,而不是pysnmp。

+1

同样的结果,我的意思是如何使我的pysnmp显示结果为 UCD-SNMP-MIB :: memIndex.0 = INTEGER:0, 而不是, (ObjectName(1.3.6.1.4.1.2021.4.1.0),整数(0)) 是的,他们是相同的结果,但前一个更具可读性,我只是想让输出可读。 – ashokadhikari 2012-04-10 09:50:03