Как пройти подтаблицу с помощью pysnmp

Я хотел бы пройтись по таблице snmp под enterprise.35604.2.3.5.7.2 oid. Это вернет список журналов.

Когда я выполняю код, он не останавливается после последнего элемента таблицы. Как я могу убедиться, что он остановится после выполнения всей вспомогательной таблицы?

from pysnmp.hlapi import *
logoid='1.3.6.1.2.1.69.1.5.8.1.7'


def scan_cm_log(ipaddress, oid):
    for (errorIndication, errorStatus, errorIndex, varBinds) in nextCmd(SnmpEngine(),
               CommunityData('<key>'),
               UdpTransportTarget((ipaddress, 161)),
               ContextData(),
               ObjectType(ObjectIdentity(oid)),
               ):

        if not errorIndication and not errorStatus:
            for varBind in varBinds:
                result=' = '.join([x.prettyPrint() for x in varBind])
                print(result)


scan_cm_log('<ip>', logoid)

person Krisz    schedule 21.08.2019    source источник
comment
Изучите varBind, чтобы увидеть, чем вы занимаетесь, и сделайте return, если вы вышли из-за стола??   -  person Lightness Races in Orbit    schedule 21.08.2019
comment
Я хотел бы найти более надежное решение, которое можно применить к нескольким OID.   -  person Krisz    schedule 21.08.2019
comment
Да, я не хотел ничего жестко кодировать. Вы должны закончить прогулку, когда получаете ответы для OID, для которых ваш исходный OID не является префиксом.   -  person Lightness Races in Orbit    schedule 21.08.2019


Ответы (2)


Попробуйте добавить флаг lexicographicMode=False, как описано здесь.

iterator = nextCmd(
    SnmpEngine(),
    CommunityData('<key>'),
    UdpTransportTarget((ipaddress, 161)),
    ContextData(),
    ObjectType(ObjectIdentity(oid)),
    lexicographicMode=False)

for (errorIndication, errorStatus, errorIndex, varBinds) in iterator:
    ...

Это должно исчерпать итератор, как только все OID, которые вы запрашиваете, оставят свои соответствующие начальные префиксы OID.

person Ilya Etingof    schedule 22.08.2019

Изучите varBind, чтобы увидеть, чем вы занимаетесь, и сделайте return, если вы вышли из-за стола.

Сделайте это, завершив обход, когда вы получите ответы для OID, для которых ваш исходный OID не является префиксом.

Итак, если вы идете 1.2.3.4, а получаете 1.2.3.4.1/1.2.3.4.2/1.2.3.4.3/1.2.3.5.1/1.2.3.5.2 обратно, "1.2.3.5. 1" не начинается с "1.2.3.4", так что на этом все.

В конечном счете, это полностью зависит от вас, что вы хотите делать и с какой логикой/алгоритмом. Но выше приведен «типичный» алгоритм обхода.

person Lightness Races in Orbit    schedule 21.08.2019