2017-11-15 3 views
0

私はできるだけクリーンなコードを作成しようとしていますが、これまで達成したことは完全にはわかりません。pysnmpのトラップされたvar-bindsからテーブル行のインデックスと名前付きの値を正しく取得する方法

カスタムMIBを使用して別のデバイスからトラップを受信するSNMPマネージャを作成しました。これはMY-MIBと呼ばれます。

私は、これはクリーンな方法であることを確認していないが、基本的に私が持っている:

varBinds = [rfc1902.ObjectType(rfc1902.ObjectIdentity(x[0]), x[1]).resolveWithMib(_view_controller) for x in var_binds] 
    for varBind in varBinds: 
     print(varBind.prettyPrint()) 
:私は、次のコードを使用することによって、かなり明瞭な印刷を得ることができる上に、コールバック関数で
from pysnmp.entity import engine, config 
from pysnmp.carrier.asynsock.dgram import udp 
from pysnmp.entity.rfc3413 import ntfrcv, context 
from pysnmp.smi import builder, rfc1902 
from pysnmp.smi.view import MibViewController 
from pysnmp.entity.rfc3413 import mibvar 

_snmp_engine = engine.SnmpEngine() 
_snmpContext = context.SnmpContext(_snmpEngine) 
_mibBuilder = _snmpContext.getMibInstrum().getMibBuilder() 
#Add local path where MY-MIB is located 
_mibSources = _mibBuilder.getMibSources() + (builder.DirMibSource('.'),) 
_mibBuilder.setMibSources(*mibSources) 
_mibBuilder.loadModules('MY-MIB') 
_view_controller = MibViewController(_mibBuilder)  


def my_callback_trap_processor(snmp_engine, state_reference, 
            context_id, context_name, var_binds, ctx): 

    #...CALLBACK CODE... 


config.addV1System(snmp_engine, 'my-area', 'MYCOMMUNITY') 
config.addTargetParams(snmp_engine, 'my-creds', 'my-area', 
         'noAuthNoPriv', 1) 

config.addSocketTransport(snmp_engine, 
          udp.domainName + (1,), 
          udp.UdpTransport().openServerMode((IP_ADDRESS, 
                  PORT))) 

ntfrcv.NotificationReceiver(snmp_engine, my_callback_trap_processor) 

snmp_engine.transportDispatcher.jobStarted(1) 

try: 
    snmp_engine.transportDispatcher.runDispatcher() 
except: 
    snmp_engine.transportDispatcher.closeDispatcher() 
    raise 

私が受け取る与えられたトラップから、私を与え、

SNMPv2-MIB::sysUpTime.0 = 0 
SNMPv2-MIB::snmpTrapOID.0 = MY-MIB::myNotificationType 
MY-MIB::myReplyKey.47746."ABC" = 0x00000000000000000000000000000000000 
MY-MIB::myTime.0 = 20171115131544Z 
MY-MIB::myOperationMode.0 = 'standalone' 

ニース。しかし、私は、与えられたvar-bindsからの情報の各ビットを、より高いレベルの方法で操作/解析したいと思っています。

私はこのコードを集めることができた図書館の内臓を見て:

for varBind in var_binds: 
    objct = rfc1902.ObjectIdentity(varBind[0]).resolveWithMib(self._view_controller) 
    (symName, modName), indices = mibvar.oidToMibName(
       self._view_controller, objct.getOid() 
       ) 
    print(symName, modName, indices, varBind[1]) 

私に与える:

sysUpTime SNMPv2-MIB (Integer(0),) 0 
snmpTrapOID SNMPv2-MIB (Integer(0),) 1.3.6.1.X.Y.Z.A.B.C.D 
myReplyKey MY-MIB (myTimeStamp(47746), myName(b'X00080')) 0x00000000000000000000000000000000000 
myTime MY-MIB (Integer(0),) 20171115131544Z 
myOperationMode MY-MIB (Integer(0),) 1 

とmyReplyKeyインデックスの場合には、私はちょうど行うことができますが:

for idx in indices: 
     try: 
      print(idx.getValue()) 
     except AttributeError: 
      print(int(idx)) 

しかしmyOperationMode VAR-バインドの場合には、どのように私はnamed-を得るのですか1の代わりに'standalone'の値?インデックスの名前を取得する方法(myTimeStampmyName)?

アップデート:私はnamedValuesを取得するために少しより多くのライブラリを調査し、また、私はインデックスに探していたものを手に入れるために、いくつかのPythonのハッキングを使用イリヤの提案後

varBinds = [rfc1902.ObjectType(rfc1902.ObjectIdentity(x[0]), x[1]).resolveWithMib(_view_controller) for x in var_binds] 
processed_var_binds = [] 
for var_bind in resolved_var_binds: 

    object_identity, object_value = var_bind 
    mod_name, var_name, indices = object_identity.getMibSymbol() 

    var_bind_dict = {'mib': mod_name, 'name': var_name, 'indices': {}} 

    for idx in indices: 
     try: 
      value = idx.getValue() 
     except AttributeError: 
      var_bind_dict['indices'] = int(idx.prettyPrint()) 
     else: 
      var_bind_dict['indices'][type(value).__name__] = str(value) 

    try: 
     var_bind_dict['value'] = object_value.namedValues[object_value] 
    except (AttributeError, KeyError): 
     try: 
      var_bind_dict['value'] = int(object_value.prettyPrint()) 
     except ValueError: 
      var_bind_dict['value'] = object_value.prettyPrint() 

    processed_var_binds.append(var_bind_dict) 
+0

>>> object_identity.getMibSymbol() ('SNMPv2-MIB', 'sysDescr', (0,)) 

列挙、それは現在、.prettyPrint()によって報告される必要があります。私は解剖のあなたの究極の目標は何か分かっていませんが。 MIB名、MIBオブジェクト、および可能なインデックスを保持したいですか? –

+0

私はすでにそれを試していましたが、実際には、1つの位置引数が欠けていると不満を抱いています。そこで私は 'varBind [1] .prettyPrint(varBind [1])'でもまだ '1 'を返してみました。 –

+0

そして、それらをループする際にインデックス名(' myTimeStamp'と 'myName')を取得する方法は? –

答えて

1

あなたは私はあなたがすでに行っている何を考えてthis snippetを使用することができるMIBに対してSNMP PDUのVAR-バインディングを解決するには:

from pysnmp.smi.rfc1902 import * 

var_binds = [ObjectType(ObjectIdentity(x[0]), x[1]).resolveWithMib(mibViewController) 
      for x in var_binds] 

をこの時点ではあなたがrfc1902.ObjectTypeオブジェクトのリストを持っています。 ObjectTypeインスタンスは、2要素タプル(ObjectIdentitySNMP value object)を模倣しています。

var_bind = var_binds[0] 
object_identity, object_value = var_bind 

さて、getMibSymbol()は、あなたのMIBオブジェクト名とOIDの末尾の部分から構成されたインデックスのタプルをMIBの名前を付けます。インデックスの要素がちょうどobject_valueとしてSNMP value objectsです:VARBINDは、[1] .prettyPrintを() `という名前の値を取得するために`てみ

>>> from pysnmp.proto.rfc1902 import * 
>>> Error = Integer.withNamedValues(**{'disk-full': 1, 'no-disk': -1}) 
>>> error = Error(1) 
>>> error.prettyPrint() 
'disk-full' 
>>> int(error) 
1 
関連する問題