Консолидация различных SNMP-транзакций и присвоение OID и результата каждой уникальным переменным для дальнейшей обработки.

Я пытаюсь написать код, который будет иметь много SNMP-транзакций, некоторые транзакции могут быть объединены в один и тот же getCmd() функция PySNMP, С учетом вышесказанного я не собираюсь сразу печатать значение результата моей SNMP-транзакции, иногда требуется дальнейшая обработка. IE: распаковка. Объединение двух SNMP-транзакций выглядит так:

from pysnmp.hlapi import *

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData('somePasswd'),
           UdpTransportTarget(('somedev.example.com', 161)),
           ContextData(),
           #One MIB
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', '0')),
           #Second MIB
           ObjectType(ObjectIdentity('CISCO-CDP-MIB', 'cdpCacheAddress', 1,1)),
           lookupNames=True,
           lookupValues=True,
))

if errorIndication:
    print(errorIndication)
elif errorStatus:
    print('%s at %s' % (errorStatus.prettyPrint(),
                        errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
    for varBind in varBinds:
        print(' = '.join([x.prettyPrint() for x in varBind]))

То, как я это вижу, если я хочу присвоить значение определенного MIB переменной, мне нужно было бы поместить оператор if..elseif в мой последний цикл for, чтобы сравнить значение MIB, которое я ищу к текущему значению итераций oid (я думаю, это термин). Итак, мой код изменился бы так:

for oid, value in varBinds:
    if oid == 'SNMPv2-MIB::sysName.0':
        #take specific actions
    elif oid == 'CISCO-CDP-MIB::cdpCacheAddress.1.1'
        #take different actions

Я думаю, что это может быть одним из способов сделать что-то, однако у меня есть пара вопросов:

  1. Это эффективный способ обработки нескольких SNMP-транзакций?

  2. Разве для удобочитаемости кода лучше хранить каждую транзакцию SNMP Get отдельной?

  3. Когда я делаю следующее, мои OID конвертируются в удобные для человека MIBS:

        for varBind in varBinds
                print(' = '.join([x.prettyPrint() for x in varBind]))
    

Но следующее только дает мне уродливые oids:

     for oid, value in varBinds:
             print("oid:",oid,"Value",value):

передавая oid и value в мой цикл for, как я получаю дружественный человеку миб вместо уродливого oid?

ОБНОВИТЬ:

Переходя .loadMibs в ObjectIdentity, вот так: ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', '0').loadMibs('SNMPv2-MIB')) все еще дал мне OID при печати oid а также value как это: for oid, value in varBinds:

1 ответ

Решение

Я думаю, что одновременное использование двух управляемых объектов (это язык SNMP) является правильным способом сделать это. Это наиболее эффективный способ получения данных через высокоуровневый SNMP API.

Как только вы получите два управляемых объекта в ответ, вы можете перебрать их и предпринять соответствующие действия - это то, что, похоже, делает ваш код. Я лично не вижу там никаких проблем.

Чтобы разрешить полученные привязки переменных (представляющих управляемые объекты SNMP) к MIB, вы просто вызываете .prettyPrint() на них:

for oid, value in varBinds:
    print("Name: ", oid.prettyPrint(), "Value: ", value.prettyPrint()):

Если вы хотите ветвить свою обработку на основе значения OID, самый эффективный способ - сравнить эти уродливые OID:

for oid, value in varBinds:
    if oid == (1, 3, 6, 1, 2, 1, 1, 5, 0):  # 'SNMPv2-MIB::sysName.0':
        #take specific actions
Другие вопросы по тегам