pysnmp Agent with HOST-RESOURCES-MIB

问题描述:

我试图监视一个使用opennms的python进程。为此,我需要实现支持HOST-RESOURCES-MIB的代理。 Opennms通过检查HOST-RESOURCES-MIB的hrSwRunTable来检查进程的状态。该测试通过将给定进程与hrSwRunState的数值匹配为hrSwRunName来完成。pysnmp Agent with HOST-RESOURCES-MIB

pysnmp给出了一些编写我试图修改的代理的例子,但我没有太大的成功。

我的代码的相关部分如下

import logging 

from pysnmp import debug 
from pysnmp.carrier.asyncore.dgram import udp 
from pysnmp.entity import engine, config 
from pysnmp.entity.rfc3413 import cmdrsp, context 
from pysnmp.proto.api import v2c 
from pysnmp.smi import builder, instrum, exval 


debug.setLogger(debug.Debug('all')) 

formatting = '[%(asctime)s-%(levelname)s]-(%(module)s) %(message)s' 
logging.basicConfig(level=logging.DEBUG, format=formatting,) 

logging.info("Starting....") 

# Create SNMP engine 
snmpEngine = engine.SnmpEngine() 

# Transport setup 

# UDP over IPv4 
config.addTransport(
    snmpEngine, 
    udp.domainName, 
    udp.UdpTransport().openServerMode(('mypc', 12345)) 
) 

# SNMPv2c setup 

# SecurityName <-> CommunityName mapping. 
config.addV1System(snmpEngine, 'my-area', 'public') 

# Allow read MIB access for this user/securityModels at VACM 
config.addVacmUser(snmpEngine, 2, 'my-area', 'noAuthNoPriv', (1, 3, 6, 1, 2, 1, 25, 4, 2), (1, 3, 6, 1, 2, 1, 25, 4, 2)) 

# Create an SNMP context 
snmpContext = context.SnmpContext(snmpEngine) 

# --- define custom SNMP Table within a newly defined EXAMPLE-MIB --- 

# ================================================================== 
logging.debug('Loading SNMP-TARGET-MIB module...'), 
mibBuilder1 = builder.MibBuilder().loadModules('SNMP-TARGET-MIB') 
logging.debug('done') 

logging.debug('Building MIB tree...'), 
mibInstrum1 = instrum.MibInstrumController(mibBuilder1) 
logging.debug('done') 

logging.debug('Building table entry index from human-friendly representation...') 

snmpTargetAddrEntry, = mibBuilder1.importSymbols('SNMP-TARGET-MIB', 'snmpTargetAddrEntry') 
instanceId1 = snmpTargetAddrEntry.getInstIdFromIndices('my-area') 
# ================================================================== 


logging.debug('Loading HOST-RESOURCES-MIB module...'), 
mibBuilder = builder.MibBuilder().loadModules('HOST-RESOURCES-MIB') 
logging.debug('done') 

logging.debug('Building MIB tree...'), 
mibInstrum = instrum.MibInstrumController(mibBuilder) 
logging.debug('done') 

logging.debug('Building table entry index from human-friendly representation...') 

# see http://www.oidview.com/mibs/0/HOST-RESOURCES-MIB.html 
hostRunTable, = mibBuilder.importSymbols('HOST-RESOURCES-MIB', 'hrSWRunEntry') 
instanceId = hostRunTable.getInstIdFromIndices('my-area') 
logging.debug('done') 

你会看到,在代码的最后我想产生的“SNMP-TARGET-MIB-> snmpTargetAddrEntry”和“一个实例HOST-RESOURCES-MIB-> hrSWRunEntry”。 SNMP-TARGET-MIB(位于pysnmp文档中)的代码工作正常,但尝试生成HOST-RESOURCES-MIB的代码在尝试生成线路上的实例时失败instanceId = hostRunTable.getInstIdFromIndices('my-area')

错误是pyasn1.error.PyAsn1Error: Can't coerce 'my-area' into integer: invalid literal for int() with base 10: 'my-area'

任何人都可以阐明我做错了什么?我知道我是新来的SNMP,因此它很可能它是一个愚蠢的错误

按照HOST-RESOURCES-MIBhrSWRunTablehrSWRunIndex列索引,其值属于Integer32类型:

hrSWRunEntry OBJECT-TYPE 
    SYNTAX  HrSWRunEntry 
    INDEX { hrSWRunIndex } 
    ::= { hrSWRunTable 1 } 

hrSWRunIndex OBJECT-TYPE 
    SYNTAX  Integer32 (1..2147483647) 
    ::= { hrSWRunEntry 1 } 

你是试图根据字符串类型的索引值而不是整数来构建OID索引。这导致与字符串> INT转换错误:

instanceId = hostRunTable.getInstIdFromIndices('my-area') 

所以你可能希望你的第一行有1作为指标值:

instanceId = hostRunTable.getInstIdFromIndices(1) 

在这里,我假设你计算instanceId为目的为您的新表格对象创建OID(例如MibScalarInstance)。

+0

感谢您的评论。这非常有用。但是,我的SNMP代理仍然无法正常工作。你愿意看看我的其他帖子,看看你是否可以点亮一些东西? http://*.com/questions/41384941/using-pysnmp-to-write-an-snmp-agent –