2017-01-09 9 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'}}

私は辞書を構築することができませんように私は、しかし、この問題に取り組む方法がわかりませんよ。

EDIT: 私は次のコードで辞書を得るために管理している:

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のような記号の値に変換します。

"すべての値を反復しない"ということは、どういう意味かわかりません。