我是 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