PySNMP: динамические поля

Я пытаюсь пройти по таблице с помощью PySNMP и получить только определенные поля. В настоящее время у меня есть следующий код, который работает хорошо.

def walkTable(community, hostname, port, tableName, fields):
    for (errorIndication,
         errorStatus,
         errorIndex,
         varBinds) in nextCmd(SnmpEngine(),
                              CommunityData(community, mpModel=0),
                              UdpTransportTarget((hostname, port)),
                              ContextData(),
                              ObjectType(ObjectIdentity(tableName, 'ifAlias')),
                              ObjectType(ObjectIdentity(tableName, 'ifHCInOctets')),
                              ObjectType(ObjectIdentity(tableName, 'ifHCOutOctets')),
                              lexicographicMode=False):

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

Приведенная выше функция принимает переменную с именем fields. Это строковый массив полей, которые я хотел бы извлечь из таблицы, но не могу понять, как это сделать динамически.

В настоящее время я пробовал

def walkTable(community, hostname, port, tableName, fields):
    for (errorIndication,
         errorStatus,
         errorIndex,
         varBinds) in nextCmd(SnmpEngine(),
                              CommunityData(community, mpModel=0),
                              UdpTransportTarget((hostname, port)),
                              ContextData(),
                              for x in fields:
                                   ObjectType(ObjectIdentity(tableName, x))
                              lexicographicMode=False):

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

Что не работает. Есть ли способ динамически создать ObjectType для nextCmd()?


person user316114    schedule 07.02.2018    source источник


Ответы (1)


Попробуйте что-нибудь в этом духе:

...
nextCmd(SnmpEngine(),
        CommunityData(community, mpModel=0),
        UdpTransportTarget((hostname, port)),
        ContextData(),
        *[ObjectType(ObjectIdentity(tableName, field)) for field in fields])
...

Придирка: если вам нужна более высокая производительность, сохраните постоянный экземпляр SnmpEngine и повторно используйте его для всех ваших вызовов SNMP.

person Ilya Etingof    schedule 07.02.2018