2014-01-28 66 views
0

我有下面的代碼,我一直在使用它來查詢pysnmp。到目前爲止,它已被用來散步,但我希望能夠得到一個特定的索引。例如,我想查詢HOST-RESOURCES-MIB::hrSWRunPerfMem.999pysnmp輪詢HOST-RESOURCES-MIB中的特定進程索引

我可以用它來使用getCounter('1.1.1.1', 'public', 'HOST-RESOURCES-MIB', 'hrSWRunPerfMem')

然而成功地取回一切hrSWRunPerfMem一次我嘗試包括索引號getCounter('1.1.1.1', 'public', 'HOST-RESOURCES-MIB', 'hrSWRunPerfMem', indexNum=999)我總是varBindTable == []

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

def getCounter(ip, community, mibName, counterName, indexNum=None): 
    cmdGen = cmdgen.CommandGenerator() 
    mibBuilder = cmdGen.mibViewController.mibBuilder 
    mibPath = mibBuilder.getMibSources() + (builder.DirMibSource("/path/to/mibs"),) 
    mibBuilder.setMibSources(*mibPath) 
    mibBuilder.loadModules(mibName) 
    mibView = view.MibViewController(mibBuilder) 

    retList = [] 
    if indexNum is not None: 
     mibVariable = cmdgen.MibVariable(mibName, counterName, int(indexNum)) 
    else: 
     mibVariable = cmdgen.MibVariable(mibName, counterName) 

    errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(cmdgen.CommunityData('test-agent', community), 
                      cmdgen.UdpTransportTarget((ip, snmpPort)), 
                      mibVariable) 

有沒有人有一些如何使用pysnmp輪詢特定索引的見解?

回答

2

您應該使用cmdGen.getCmd()調用而不是nextCmd()調用。沒有「下一個」OID通過葉子,因此空的響應。

下面是你的代碼的一個優化版本。它應該從你的Python提示符下運行的,是正確的:

from pysnmp.entity.rfc3413.oneliner import cmdgen 

def getCounter(ip, community, mibName, counterName, indexNum=None): 
    if indexNum is not None: 
     mibVariable = cmdgen.MibVariable(mibName, counterName, int(indexNum)) 
    else: 
     mibVariable = cmdgen.MibVariable(mibName, counterName) 

    cmdGen = cmdgen.CommandGenerator() 

    errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.getCmd(
     cmdgen.CommunityData(community), 
     cmdgen.UdpTransportTarget((ip, 161)), 
     mibVariable.addMibSource("/path/to/mibs") 
    ) 

    if not errorIndication and not errorStatus: 
     return varBindTable 

#from pysnmp import debug 
#debug.setLogger(debug.Debug('msgproc')) 

print(getCounter('demo.snmplabs.com', 
       'recorded/linux-full-walk', 
       'HOST-RESOURCES-MIB', 
       'hrSWRunPerfMem', 
        970)) 

在性能方面,它的建議重用CommandGenerator實例,以節省[重] snmpEngine初始化引擎蓋下發生。

+0

這樣做!謝謝!在最後的建議中,我重新編了一些代碼,而且事情看起來更順暢。 – EEP