【发布时间】:2019-06-03 12:37:21
【问题描述】:
我在 python 中使用 pysnmp lib 隐含了 SNMP 代理。这是我用来响应自定义 OID 的代码。
from datetime import datetime
from pysnmp import debug
from pysnmp.carrier.asyncore.dgram import udp
from pysnmp.entity import engine, config
from pysnmp.entity.rfc3413 import cmdrsp, context
from pysnmp.proto.api import v2c
from pysnmp.smi import builder, instrum, exval
# Uncomment this to turn pysnmp debugging on
#debug.setLogger(debug.Debug('all'))
formatting = '[%(asctime)s-%(levelname)s]-(%(module)s) %(message)s'
logging.basicConfig(level=logging.DEBUG, format=formatting, )
logging.info("Starting....")
# Create SNMP engine
snmpEngine = engine.SnmpEngine()
# Transport setup
# UDP over IPv4
config.addTransport(
snmpEngine,
udp.domainName,
udp.UdpTransport().openServerMode(('0.0.0.0', 12345))
)
# SNMPv2c setup
# SecurityName <-> CommunityName mapping.
config.addV1System(snmpEngine, 'my-area', 'public')
# Allow read MIB access for this user / securityModels at VACM
# Limit access to just the custom MIB. Widen if need be
config.addVacmUser(snmpEngine,
2,
'my-area',
'noAuthNoPriv',
(1, 3, 6, 4),
(1, 3, 6, 4))
# Create an SNMP context and ensure the custom MIB is loaded
# Your system must have this MIB installed otherwise pysnmp
# can't load it!
snmpContext = context.SnmpContext(snmpEngine)
logging.debug('Loading __EXAMPLE-MIB module...'),
mibBuilder = snmpContext.getMibInstrum().getMibBuilder()
(MibTable,
MibTableRow,
MibTableColumn,
MibScalarInstance) = mibBuilder.importSymbols(
'SNMPv2-SMI',
'MibTable',
'MibTableRow',
'MibTableColumn',
'MibScalarInstance'
)
logging.debug('done')
RowStatus, = mibBuilder.importSymbols('SNMPv2-TC', 'RowStatus')
mibBuilder.exportSymbols(
'__EXAMPLE-MIB',
# table object
exampleTable=MibTable((1, 3, 6, 4, 1)).setMaxAccess('readcreate'),
# table row object, also carries references to table indices
exampleTableEntry=MibTableRow((1, 3, 6, 4, 1, 5)).setMaxAccess('readcreate').setIndexNames((0, '__EXAMPLE-MIB', 'exampleTableColumn1')),
# table column: string index
exampleTableColumn1=MibTableColumn((1, 3, 6, 4, 1, 5, 1), v2c.OctetString()).setMaxAccess('readcreate'),
# table column: string value
exampleTableColumn2=MibTableColumn((1, 3, 6, 4, 1, 5, 2), v2c.OctetString()).setMaxAccess('readcreate'),
# table column: integer value with default
exampleTableColumn3=MibTableColumn((1, 3, 6, 4, 1, 5, 3), v2c.Integer32(123)).setMaxAccess('readcreate'),
# table column: row status
exampleTableStatus=MibTableColumn((1, 3, 6, 4, 1, 5, 4), RowStatus('notExists')).setMaxAccess('readcreate')
)
logging.debug('done')
(exampleTableEntry,
exampleTableColumn2,
exampleTableColumn3,
exampleTableStatus) = mibBuilder.importSymbols(
'__EXAMPLE-MIB',
'exampleTableEntry',
'exampleTableColumn2',
'exampleTableColumn3',
'exampleTableStatus'
)
rowInstanceId = exampleTableEntry.getInstIdFromIndices('example record one')
mibInstrumentation = snmpContext.getMibInstrum()
mibInstrumentation.writeVars(
((exampleTableColumn2.name + rowInstanceId, 'hello'),
(exampleTableColumn3.name + rowInstanceId, 123456),
(exampleTableStatus.name + rowInstanceId, 'createAndGo'))
)
logging.debug('done')
logging.debug('Snmp Agent Start')
# 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
我使用 iReasoning MIB 浏览器发送 snmp 请求。
当我发送 .1.3.6.4.1.5.1 oid 的 Get 请求时,出现带有此说明的错误:“No accesses error.”
最后,我发送 .1.3.6.4.1.5 oid 的 Get Subtree 请求,MIB 浏览器显示如下结果:
如您所见,OID 结果是: .1.3.6.4.1.5.1.18.101.120.97.109.112.108.101.32.114.101.99.111.114.100.32.111.110.101
这不短,而且有一些附加值。
怎么了?
【问题讨论】: