如何将表上的PySNMP的nextCmd转换为多个对象

时间:2019-01-14 18:52:55

标签: python django snmp pysnmp

当PySNMP的nextCmd()遍历我正在使用的表时,它按列而不是按行输出。在尝试将数据保存到对象中时,这已证明很困难。例如,在进入下一列之前,我将看到AlarmID列中的每个值。

到目前为止,我只创建了一个打印语句来输出并查看值的结构。我一直在尝试解决此问题的方法,但我的想法倾向于带我递归,但这是我尚未尝试实现的方法。

这是我正在使用的功能:

def query_alarm_table(device):
    manufacturer = Manufacturer(device.manufacturer)

    for (errorIndication, errorStatus, errorIndex, varBinds) in nextCmd(
        SnmpEngine(),
        CommunityData("public"),
        UdpTransportTarget((device.ip_address, device.snmp_port_number)),
        ContextData(),
        ObjectType(ObjectIdentity(manufacturer.alarm_table)),
        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 oid, raw_value in varBinds:
                print(f'oid: {oid} --- raw_value: {raw_value}')

上面的函数可以正确地遍历表。但是我不确定如何处理数据,就好像它是单行并将其放入数据库中的对象一样。

1 个答案:

答案 0 :(得分:1)

也许最简单的解决方案是一次将您感兴趣的列全部传递到nextCmd中:

nextCmd(
    SnmpEngine(),
    CommunityData("public"),
    UdpTransportTarget((device.ip_address, device.snmp_port_number)),
    ContextData(),
    ObjectType(ObjectIdentity(manufacturer.alarm_table_column_1)),
    ObjectType(ObjectIdentity(manufacturer.alarm_table_column_2)),
    ObjectType(ObjectIdentity(manufacturer.alarm_table_column_3)),
    ...
)

在每次迭代中,您应该在varBinds中的每一列(即行)中获得一个值。