如何规范PySNMP中的OID索引检索?

2024-05-23 13:53:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找在PySNMP中检索OID索引的标准化方法。我需要为所有的索引是“完全解决”,无论OID和数据类型。当索引由多个部分和不同的数据类型组成时,它会变得有点复杂

def execute_snmp(transactions, address, pp=True):
    mib_dict = defaultdict(dict)
    for ei, es, ex, vb in transactions:
        if ei:
            raise SNMPAgentUnreachable(ei)
        elif es:
            err_reason = f"{es.prettyPrint()} {ex and transactions[int(ex) - 1][0] or '?'}"
            raise ValueError(err_reason)
        else:
            for mib, val in vb:
                node, index_tuple = mib.getMibSymbol()[1:]
                # print('.'.join(('%d' % x for x in index_tuple[1].asNumbers())))
                # print(*(type(x) for x in index_tuple))
                index = '.'.join(x.prettyPrint() for x in index_tuple)
                print(mib, mib.prettyPrint(), mib.prettyPrint().split('.', 1)[-1], index, sep=' ====== ')
                value = val.prettyPrint() if pp else val
                mib_dict[node][index] = value

上述代码的示例输出如下所示:

# 1.0.8802.1.1.2.1.3.8.1.5.1.4.10.0.1.200 ====== LLDP-MIB::lldpLocManAddrIfId.ipV4."0x0a0001c8" ====== ipV4."0x0a0001c8" ====== ipV4.0x0a0001c8
# 1.3.6.1.2.1.17.4.3.1.1.228.224.166.29.95.216 ====== BRIDGE-MIB::dot1dTpFdbAddress."e4:e0:a6:1d:5f:d8" ====== "e4:e0:a6:1d:5f:d8" ====== e4:e0:a6:1d:5f:d8
# 1.3.6.1.2.1.4.22.1.4.1.10.0.1.220 ====== IP-MIB::ipNetToMediaType.1.10.0.1.220 ====== 1.10.0.1.220 ====== 1.10.0.1.220

我的最终目标是得到一个嵌套的dictionary(default dict),格式为mib_dict[node][index] = value,其中mib_dict是我的默认词典的名称

正如您所知,我上面的代码并不适用于所有oid。对于LLDP-MIB::lldpLocManAddrIfIdindex的值是ipV4.0x0a0001c8,而不是1.4.10.0.1.200。我可以通过执行以下操作来获取索引的IP地址部分:print('.'.join(('%d' % x for x in index_tuple[1].asNumbers()))),但这对没有asNumbers()属性的索引不起作用

如何编写一段代码来处理所有OID的索引,而不考虑OID的长度和组成(数据类型)?有没有一种方法可以应用相同的原理来提取值


Tags: inforindexesdictex数据类型mib
1条回答
网友
1楼 · 发布于 2024-05-23 13:53:20

我不确定什么是理想的index类型。。。一种可能是在那里有一个未解析的OID,它的索引部分。如果是这样的话,也许可以通过从托管对象实例OID中删除索引部分来计算它

要确定剪切OID的位置,可以使用与MIB托管对象关联的OID(例如LLDP-MIB::lldpLocManAddrIfId)-它是OID的静态前缀,不包括任何变量索引部分:

for var_bind in var_binds:
    object_identity, value = var_bind
    mib_node = object_identity.getMibNode()
    object_instance_oid = object_identity.getOid()
    object_oid = mib_node.getName()
    index_part = object_instance_oid[len(object_oid):]

我们应该在pysnmp中有一个快捷方式来简化它

相关问题 更多 >