2016-12-28 11 views
0

Я пытаюсь контролировать процесс python с помощью opennms. Для этого мне нужно реализовать агента, который поддерживает HOST-RESOURCES-MIB. Opennms проверяет состояние процесса, проверяя hrSwRunTable из HOST-RESOURCES-MIB. Тест выполняется путем сопоставления данного процесса как hrSwRunName с числовым значением hrSwRunState.Агент pysnmp с 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')

Ошибка is pyasn1.error.PyAsn1Error: Can't coerce 'my-area' into integer: invalid literal for int() with base 10: 'my-area'

Может ли кто-нибудь пролить свет на то, что я делаю неправильно? Я понимаю, что я новичок в SNMP и поэтому вполне возможно, его глупая ошибка

ответ

1

Согласно HOST-RESOURCES-MIB, hrSWRunTable индексируется 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 с целью для создания новых табличных объектов (например, MibScalarInstance).

+0

Спасибо за ваш комментарий. Это было очень полезно. У меня все еще есть проблемы с тем, что мой SNMP-агент не работает. Будете ли вы любезны взглянуть на мою другую публикацию, чтобы увидеть, можете ли вы пролить свет? http://stackoverflow.com/questions/41384941/using-pysnmp-to-write-an-snmp-agent –

 Смежные вопросы

  • Нет связанных вопросов^_^