現在、私はトラップリスナーをセットアップしており、snmp通知をうまく聞くことができます。しかし、それは数値のoidでのみ返ってくるので、私はこのoidを人間が読める名前に解決したいと思っています。私はドキュメンテーションを見てきましたが、私はそれをすべてよく理解していません。私はMIBへのOIDを解決するについて行くだろうかと思いまして、ここでhttp://pysnmp.sourceforge.net/examples/v1arch/asyncore/manager/ntfrcv/transport-tweaks.htmlpysnmp oids to mibname
from pysnmp.carrier.asyncore.dispatch import AsyncoreDispatcher
from pysnmp.carrier.asyncore.dgram import udp, udp6, unix
from pyasn1.codec.ber import decoder
from pysnmp.proto import api
# noinspection PyUnusedLocal
def cbFun(transportDispatcher, transportDomain, transportAddress, wholeMsg):
while wholeMsg:
msgVer = int(api.decodeMessageVersion(wholeMsg))
if msgVer in api.protoModules:
pMod = api.protoModules[msgVer]
else:
print('Unsupported SNMP version %s' % msgVer)
return
reqMsg, wholeMsg = decoder.decode(
wholeMsg, asn1Spec=pMod.Message(),
)
print('Notification message from %s:%s: ' % (
transportDomain, transportAddress
)
)
reqPDU = pMod.apiMessage.getPDU(reqMsg)
if reqPDU.isSameTypeWith(pMod.TrapPDU()):
if msgVer == api.protoVersion1:
print('Enterprise: %s' % (pMod.apiTrapPDU.getEnterprise(reqPDU).prettyPrint()))
print('Agent Address: %s' % (pMod.apiTrapPDU.getAgentAddr(reqPDU).prettyPrint()))
print('Generic Trap: %s' % (pMod.apiTrapPDU.getGenericTrap(reqPDU).prettyPrint()))
print('Specific Trap: %s' % (pMod.apiTrapPDU.getSpecificTrap(reqPDU).prettyPrint()))
print('Uptime: %s' % (pMod.apiTrapPDU.getTimeStamp(reqPDU).prettyPrint()))
varBinds = pMod.apiTrapPDU.getVarBindList(reqPDU)
else:
varBinds = pMod.apiPDU.getVarBindList(reqPDU)
print('Var-binds:')
for oid, val in varBinds:
print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))
return wholeMsg
transportDispatcher = AsyncoreDispatcher()
transportDispatcher.registerRecvCbFun(cbFun)
# UDP/IPv4
transportDispatcher.registerTransport(
udp.domainName, udp.UdpSocketTransport().openServerMode(('localhost', 162))
)
# UDP/IPv6
transportDispatcher.registerTransport(
udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 162))
)
## Local domain socket
# transportDispatcher.registerTransport(
# unix.domainName, unix.UnixSocketTransport().openServerMode('/tmp/snmp-manager')
#)
transportDispatcher.jobStarted(1)
try:
# Dispatcher will never finish as job#1 never reaches zero
transportDispatcher.runDispatcher()
except:
transportDispatcher.closeDispatcher()
raise
サンプルスクリプトを使用しています。私は、シスコのMIB .MYファイルをダウンロードしていると私はとても好きにmibbuilderを指すディレクトリにそれらを立ち往生している、
snmpEngine = SnmpEngine()
mibBuilder = builder.MibBuilder()
mibPath = mibBuilder.getMibSources() + (builder.DirMibSource('/opt/mibs'),)
mibBuilder.setMibSources(*mibPath)
mibBuilder.loadModules('CISCO-CONFIG-MAN-MIB',)
mibViewController = view.MibViewController(mibBuilder)
を、私はprettyPrint()ステートメントを実行するスクリプトの例の中に私は
を持っていますあなたは、低レベルのAPI(というpysnmp.hlapiより)で作業しているので、私は今、2つのエラーが発生した変更を行った後for oid, val in varBinds:
objectType = ObjectType(ObjectIdentity(oid.prettyPrint()))
objectType.resolveWithMib(mibViewController)
print str(objectType)
print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))
、
Traceback (most recent call last): File "traplistener.py", line 200, in 'CISCO-BRIDGE-EXT-MIB', File "/usr/local/lib/python2.7/site-packages/pysnmp/smi/builder.py", line 344, in loadModules raise error.MibNotFoundError('%s compilation error(s): %s' % (modName, errs)) pysnmp.smi.error.MibNotFoundError: CISCO-CONFIG-MAN-MIB compilation error(s): missing; no module "CISCO-SMI" in symbolTable at MIB CISCO-CONFIG-MAN-MIB; missing; missing; missing; missing; missing; missing
こんにちは、指定したディレクトリからモジュールをロードしたい場合はどうすればいいですか? – Johnathon64
私の場合、あなたのソースを自分のローカルディレクトリに置き換えることになるでしょうか?私はLinuxのディストリビューションに取り組んでいるので、私は '/ opt/mibs'と置き換えることになります – Johnathon64
@IIya Etingof別のエラーが発生しました。他のmibからの依存関係をコンパイルしようとしていると思いますか?これは私の最初の推測です – Johnathon64