0

opennms を使用して Python プロセスを監視しようとしています。これを行うには、HOST-RESOURCES-MIB をサポートするエージェントを実装する必要があります。Opennms は、HOST-RESOURCES-MIB の hrSwRunTable を調べて、プロセスの状態をチェックします。テストは、hrSwRunState の数値に対して hrSwRunName として指定されたプロセスを照合することによって行われます。

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に慣れていないので、愚かなエラーである可能性が非常に高いことに気づきました

4

1 に答える 1

1

によると、HOST-RESOURCES-MIBhrSWRunTableによって索引付けされhrSWRunIndex、その値は次のタイプに属しますInteger32:

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

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

整数ではなく文字列型のインデックス値から OID インデックスを構築しようとしています。これにより、string->int 変換エラーが発生します。

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

1したがって、おそらく最初の行にインデックス値を持たせたいでしょう:

instanceId = hostRunTable.getInstIdFromIndices(1)

instanceIdここでは、新しい表形式オブジェクト (例: ) の OID を構築する目的で計算すると仮定しますMibScalarInstance

于 2016-12-28T23:18:09.680 に答える