来自 table 的 PySNMP 表单字典

PySNMP form dictionary from table

我正在尝试使用 PySNMP 模块从 Cisco 交换机输出 ifTbale table。

这是我当前的代码:

from pysnmp.hlapi import *

for (errorIndication,
     errorStatus,
     errorIndex,
     values) in nextCmd(SnmpEngine(),
                          CommunityData('public', mpModel=0),
                          UdpTransportTarget(('172.20.19.14', 161)),
                          ContextData(),
                          ObjectType(ObjectIdentity('IF-MIB', 'ifIndex')),
                          ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')),
                          ObjectType(ObjectIdentity('IF-MIB', 'ifType')),
                          ObjectType(ObjectIdentity('IF-MIB', 'ifSpeed')),
                          lexicographicMode=False):

    print('======================')

    for v in values:
        print(str(v))

所以这是有效的,因为它输出如下:

======================
IF-MIB::ifIndex.10028 = 10028
IF-MIB::ifDescr.10028 = FastEthernet0/28
IF-MIB::ifType.10028 = 'ethernetCsmacd'
IF-MIB::ifSpeed.10028 = 100000000
======================
IF-MIB::ifIndex.10029 = 10029
IF-MIB::ifDescr.10029 = FastEthernet0/29
IF-MIB::ifType.10029 = 'ethernetCsmacd'
IF-MIB::ifSpeed.10029 = 100000000
======================
IF-MIB::ifIndex.10030 = 10030
IF-MIB::ifDescr.10030 = FastEthernet0/30
IF-MIB::ifType.10030 = 'ethernetCsmacd'
IF-MIB::ifSpeed.10030 = 10000000
...

我想最终将其更改为函数,但目前我想知道如何将其放入嵌套字典中。

我想要以下格式的数据: {ifIndex{ifDescr, ifType, ifSpeed}}

看起来像这样: {10028{ifDescr: 'FastEthernet0/28', ifType: 'ethernetCsmacd', ifSpeed: '100000000'}}

我不确定如何解决这个问题,因为我无法构建字典。

编辑: 我设法用以下代码得到了一本字典:

print('======================')
raw_dict = {str(v).split('.')[0].split(':')[2]: str(v).split('.')[1].split()[2] for v in values}
print(raw_dict.items())
if_dict = {raw_dict['ifIndex']: {k: v} for k, v in raw_dict.items()}
print(if_dict)

但它并没有遍历 raw_dict.

中的所有值

这是输出:

======================
dict_items([('ifSpeed', '100000000'), ('ifIndex', '10048'), ('ifDescr', 'FastEthernet0/48'), ('ifType', "'ethernetCsmacd'")])
{'10048': {'ifType': "'ethernetCsmacd'"}}
======================
dict_items([('ifSpeed', '1000000000'), ('ifIndex', '10101'), ('ifDescr', 'GigabitEthernet0/1'), ('ifType', "'ethernetCsmacd'")])
{'10101': {'ifType': "'ethernetCsmacd'"}}
======================
dict_items([('ifSpeed', '1000000000'), ('ifIndex', '10102'), ('ifDescr', 'GigabitEthernet0/2'), ('ifType', "'ethernetCsmacd'")])
{'10102': {'ifType': "'ethernetCsmacd'"}}
======================
dict_items([('ifSpeed', '4294967295'), ('ifIndex', '10501'), ('ifDescr', 'Null0'), ('ifType', "'other'")])
{'10501': {'ifType': "'other'"}}

所以你想像这样构建一个字典:

{10028: {ifDescr: 'FastEthernet0/28',
         ifType: 'ethernetCsmacd',
         ifSpeed: '100000000'}}

为此,您需要 MIB 对象名称(例如 ifDescr)、MIB 对象实例 ID(例如 10028)和 SNMP 对象值(例如 FastEthernet0/28)。让我提出以下代码以从 SNMP 响应变量绑定中清除这些组件:

myDict = collections.defaultdict(collections.defaultdict)

for varBind in varBinds:
    varName, varValue = varName
    mibName, objectName, objectInstanceId = varName.getMibSymbol()

    idx = '.'.join([str(indexPart) for indexPart in objectInstanceId])

    myDict[idx][objectName] = varValue

请记住,上面的代码暗示 PySNMP 已加载响应 OID 的 MIB,因此它可以将响应 OID 转换为符号值,如 ifDescr.

我不确定你所说的 "not iterating through all the values" 是什么意思。