Использование PySNMP в качестве приемника ловушек с собственным MIB / вендором - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь использовать PySNMP для получения ловушек SNMPv3.Я нашел этот пример кода:

#!/usr/bin/env /usr/bin/python3

from pysnmp.entity import engine, config
from pysnmp.carrier.asyncore.dgram import udp
from pysnmp.entity.rfc3413 import ntfrcv
from pysnmp.proto.api import v2c
from pysnmp.smi.rfc1902 import ObjectIdentity

snmpEngine = engine.SnmpEngine()

# Transport setup

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

# SNMPv3/USM setup
config.addV3User(
    snmpEngine, '<username>',
    config.usmHMACMD5AuthProtocol, '<password>',
    config.usmAesCfb128Protocol, '<password>',
    securityEngineId=v2c.OctetString(hexValue='<engineid>')
)

def cbFun(snmpEngine, stateReference, contextEngineId, contextName,
          varBinds, cbCtx):
    print('Notification from ContextEngineId "%s", ContextName "%s"' (contextEngineId.prettyPrint(), contextName.prettyPrint()))
    for name, val in varBinds:
        print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))

# Register SNMP Application at the SNMP engine
ntfrcv.NotificationReceiver(snmpEngine, cbFun)

snmpEngine.transportDispatcher.jobStarted(1)  # this job would never finish

# Run I/O dispatcher which would receive queries and send confirmations
try:
    snmpEngine.transportDispatcher.runDispatcher()
except:
    snmpEngine.transportDispatcher.closeDispatcher()
    raise

Этот код работает для меня, но я получаю сырые ловушки.У меня есть MIB-файл конкретного поставщика, который я хочу использовать.Но я не могу найти никакой документации, как связать MIB с snmpEngine.Примеры использования MIB из документации PySNMP показывают только использование для операций SNMP GET и здесь не применимы.Кто-то пробовал это раньше и может мне помочь?

Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2019

Если ваша цель - преобразовать необработанные привязки переменных, которые вы получаете, в удобную для человека форму, то вам необходимо обработать эти привязки переменных через объект браузера MIB.

Вы являетесьверно, это та же самая операция, которую генератор команд часто выполняет в примерах.

from pysnmp.smi import builder, view, compiler, rfc1902

# Assemble MIB browser
mibBuilder = builder.MibBuilder()
mibViewController = view.MibViewController(mibBuilder)
compiler.addMibCompiler(
    mibBuilder, sources=['file:///usr/share/snmp/mibs',
                         'http://mibs.snmplabs.com/asn1/@mib@'])

# Pre-load MIB modules that define objects we receive in TRAPs
mibBuilder.loadModules('SNMPv2-MIB', 'SNMP-COMMUNITY-MIB')

# This is what we would get in a TRAP PDU
varBinds = [
    ('1.3.6.1.2.1.1.3.0', 12345),
    ('1.3.6.1.6.3.1.1.4.1.0', '1.3.6.1.6.3.1.1.5.2'),
    ('1.3.6.1.6.3.18.1.3.0', '0.0.0.0'),
    ('1.3.6.1.6.3.18.1.4.0', ''),
    ('1.3.6.1.6.3.1.1.4.3.0', '1.3.6.1.4.1.20408.4.1.1.2'),
    ('1.3.6.1.2.1.1.1.0', 'my system')
]

# Pass raw var-binds through MIB browser
varBinds = [
    rfc1902.ObjectType(rfc1902.ObjectIdentity(x[0]), x[1]).resolveWithMib(mibViewController)
    for x in varBinds
]

for varBind in varBinds:
    print(varBind.prettyPrint())
...