私はできるだけクリーンなコードを作成しようとしていますが、これまで達成したことは完全にはわかりません。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'
の値?インデックスの名前を取得する方法(myTimeStamp
とmyName
)?
アップデート:私は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)
:
列挙、それは現在、
.prettyPrint()
によって報告される必要があります。私は解剖のあなたの究極の目標は何か分かっていませんが。 MIB名、MIBオブジェクト、および可能なインデックスを保持したいですか? –私はすでにそれを試していましたが、実際には、1つの位置引数が欠けていると不満を抱いています。そこで私は 'varBind [1] .prettyPrint(varBind [1])'でもまだ '1 'を返してみました。 –
そして、それらをループする際にインデックス名(' myTimeStamp'と 'myName')を取得する方法は? –