2017-11-12 17 views
0

まず、PythonとPySNMPを使い慣れた人です。私はすべての物理インターフェイスに関する情報を取得するためにbulkCmdにネットワークデバイスのリストを渡そうとしています。PySNMP 4.4 with Python 2.7 bulkCmdの出力に子OIDが含まれていない

現在のところ、最初のインターフェイスを収集しているだけで、リスト内の次のネットワークデバイスに移動します。私は辞書編集とmaxCalls、繰り返しを変更しましたが、何も違いはありません。

単一のネットワークデバイスに単一のbulkCmdを送信すると、すべてのインターフェイスを正常にポーリングしました。

コード:

from pysnmp.hlapi import * 

routers = ["router1", "router2"] 

#adds routers to getCmd and bulkCmd 
def snmpquery (hostip): 

    errorIndication, errorStatus, errorIndex, varBinds = next (
     bulkCmd(SnmpEngine(), 
      CommunityData('communitystring'), 
      UdpTransportTarget((hostip, 161)), 
      ContextData(), 
      0, 50, 
      ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')), 
      ObjectType(ObjectIdentity('IF-MIB', 'ifAlias')), 
      ObjectType(ObjectIdentity('IF-MIB', 'ifOperStatus')), 
      lexicographicMode=True 
     ) 
    ) 

    # Check for errors and print out results 
    if errorIndication: 
     print(errorIndication) 

    elif errorStatus: 
     print('%s at %s' % (errorStatus.prettyPrint(), 
          errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) 
    else: 
     for varBind in varBinds: 
      print(' = '.join([x.prettyPrint() for x in varBind])) 


# calls snmpquery for all routers in list 
for router in routers: 
    snmpquery(router) 

出力:

IF-MIB::ifDescr.1 = GigabitEthernet0/0 
IF-MIB::ifAlias.1 = InterfaceDesc 
IF-MIB::ifOperStatus.1 = 'up' 
IF-MIB::ifDescr.1 = GigabitEthernet0/0 
IF-MIB::ifAlias.1 = InterfaceDesc 
IF-MIB::ifOperStatus.1 = 'up' 

答えて

0

bulkSNMPはイテレータを返し、あなただけの反復の最初の取得それにnext()を使用していました。あなたはおそらくPySNMP documentationからアイデアを得ています。それはすべての結果を取得する方法を示す素晴らしい仕事をしません。

次のようにあなたは、すべての反復をループするforループを使用する必要があります。

from pysnmp.hlapi import * 
routers = ["router1", "router2"] 

def snmpquery (hostip): 
    snmp_iter = bulkCmd(SnmpEngine(), 
         CommunityData('communitystring'), 
         UdpTransportTarget((hostip, 161)), 
         ContextData(), 
         0, 50, 
         ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')), 
         ObjectType(ObjectIdentity('IF-MIB', 'ifAlias')), 
         ObjectType(ObjectIdentity('IF-MIB', 'ifOperStatus')), 
         lexicographicMode=True) 
    for errorIndication, errorStatus, errorIndex, varBinds in snmp_iter: 
     # Check for errors and print out results 
     if errorIndication: 
      print(errorIndication) 
     elif errorStatus: 
      print('%s at %s' % (errorStatus.prettyPrint(), 
          errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) 
     else: 
      for varBind in varBinds: 
       print(' = '.join([x.prettyPrint() for x in varBind])) 

# calls snmpquery for all routers in list 
for router in routers: 
    snmpquery(router) 

また、Pythonの関連の質問を投稿するときに、それが重要であるとして、インデントに注意してください。

+0

ありがとうございましたsoundstripe、これは完全に機能しました!私はまた、次の投稿時に私のインデントをチェックします。 – Ev9432

0

bulkCmd関数で生成されたジェネレータを反復処理して、SNMPクエリを繰り返して、以前の応答パケットに収まらないSNMP管理オブジェクトを取得する必要があります。ちょうどnext()コールを捨て、bulkCmd()の上にforループを実行してください。

注釈1:MIBテーブルの列のすぐ下にある管理オブジェクト(たとえばIF-MIB::ifDescrなど)を取得する場合は、lexicographicMode=Trueは必要ありません。

サイドノート2:ネットワークに多数のSNMPエージェントがある場合は、in parallelと通信することで、データ取得の処理速度を向上させることができます。同じgetBulk()コールを使用します。これは、並列処理を行うネットワークI/Oの下にあるものです。

+0

おかげでIIya。私はあなたの推薦を調べます! – Ev9432

関連する問題