我正在寻找在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::lldpLocManAddrIfId
,index
的值是ipV4.0x0a0001c8
,而不是1.4.10.0.1.200
。我可以通过执行以下操作来获取索引的IP地址部分:print('.'.join(('%d' % x for x in index_tuple[1].asNumbers())))
,但这对没有asNumbers()
属性的索引不起作用
如何编写一段代码来处理所有OID的索引,而不考虑OID的长度和组成(数据类型)?有没有一种方法可以应用相同的原理来提取值
我不确定什么是理想的
index
类型。。。一种可能是在那里有一个未解析的OID,它的索引部分。如果是这样的话,也许可以通过从托管对象实例OID中删除索引部分来计算它要确定剪切OID的位置,可以使用与MIB托管对象关联的OID(例如LLDP-MIB::lldpLocManAddrIfId)-它是OID的静态前缀,不包括任何变量索引部分:
我们应该在pysnmp中有一个快捷方式来简化它
相关问题 更多 >
编程相关推荐