SNMP / pysnmpを初めて使用し、カスタムMIBを使用するエージェントを実装しようとしています。pysnmpサイトで次の例を見ていますが、動作させることができないようです。これが私が取っているステップです:
- build-pysnmp-mibを使用してMIBファイルをpysnmpモジュールに変換します(これはエラーなしで成功します)
- MIBソースを設定し、MibBuilder()を使用してMIBモジュールをロードします
- 上記の例を使用してエージェントを設定します(追加したのはmibBuilderのみです)
- net-snmpのsnmpwalkを使用して、ロードされたMIBを表示します。
snmpwalkコマンドは次のとおりです。
snmpwalk -v3 -u usr-md5-none -l authNoPriv -A authkey1 -E 8000000001020304 -n my-context 127.0.0.1 .1.3.6
snmpwalkはタイムアウトエラーを返し、通信を分析すると(pysnmpでI / Oデバッグを有効にすることにより)、エージェントが要求を受信したが、応答しなかったことがわかります。これは文脈と関係があるのではないかと思いますが、現時点では正しく理解していない可能性があります。私が間違ったことをしている可能性のある場所についてのポインタは大歓迎です。テストには次のサンプルMIBを使用しています。以下のコード。ありがとう。
#!/usr/local/bin/python
from pysnmp.smi import builder
from pysnmp.smi import view
from pysnmp.entity import engine
from pysnmp.entity import config
from pysnmp.entity.rfc3413 import cmdrsp
from pysnmp.entity.rfc3413 import context
from pysnmp.smi import instrum
from pysnmp.carrier.asynsock.dgram import udp
from pysnmp.proto.api import v2c
from pysnmp import debug
# Create SNMP engine
snmpEngine = engine.SnmpEngine()
# Transport setup
# UDP over IPv4
config.addSocketTransport(
snmpEngine,
udp.domainName,
udp.UdpTransport().openServerMode(('127.0.0.1', 161))
)
# SNMPv3/USM setup
# user: usr-md5-none, auth: MD5, priv NONE
config.addV3User(
snmpEngine, 'usr-md5-none',
config.usmHMACMD5AuthProtocol, 'authkey1'
)
# Allow full MIB access for each user at VACM
config.addVacmUser(snmpEngine, 3, 'usr-md5-none', 'authNoPriv',
(1,3,6,1,2,1), (1,3,6,1,2,1))
# Create an SNMP context with ContextEngineId = 8000000001020304
snmpContext = context.SnmpContext(
snmpEngine, contextEngineId=v2c.OctetString(hexValue='8000000001020304')
)
# load mibs
MIBDIR = '/usr/local/share//mibdata'
mibBuilder = builder.MibBuilder()
mibSources = mibBuilder.getMibSources() + (builder.DirMibSource(MIBDIR),)
mibBuilder.setMibSources(*mibSources)
mibBuilder.loadModules('TOASTER-MIB')
# pass mib to Management Instrumentation Controller and register at SNMP Context
# under ContextName 'my-context'
snmpContext.registerContextName(
v2c.OctetString('my-context'), # Context Name
instrum.MibInstrumController(mibBuilder) # Managed Objects - loading my custom TOASTER-MIB
)
# Register SNMP Applications at the SNMP engine for particular SNMP context
cmdrsp.GetCommandResponder(snmpEngine, snmpContext)
cmdrsp.SetCommandResponder(snmpEngine, snmpContext)
cmdrsp.NextCommandResponder(snmpEngine, snmpContext)
cmdrsp.BulkCommandResponder(snmpEngine, snmpContext)
# Register an imaginary never-ending job to keep I/O dispatcher running forever
snmpEngine.transportDispatcher.jobStarted(1)
# Run I/O dispatcher which would receive queries and send responses
try:
snmpEngine.transportDispatcher.runDispatcher()
except:
snmpEngine.transportDispatcher.closeDispatcher()
raise