2017-01-09 37 views
0

我试图使用PySNMP模块从Cisco交换机输出ifTbale表。表中的PySNMP表字典

这里是我当前的代码:

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'"}} 

回答

0

所以,你要建立这样的字典:

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

对于您需要MIB对象的名称(例如ifDescr),MIB对象实例ID(例如10028)和SNMP对象值(例如FastEthernet0/28)。让我提出下面的代码从SNMP响应VAR-绑定剔除这些成分:

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具有MIB(个),加载,以便它可以把响应的OID响应的OID转换为像ifDescr这样的符号值。

我不确定你的意思是“不重复所有的值”。