diff options
author | elie <elie> | 2013-09-07 14:20:04 +0000 |
---|---|---|
committer | elie <elie> | 2013-09-07 14:20:04 +0000 |
commit | 690ea8ee6ae1ff16b184c8c17a6acda681613b6d (patch) | |
tree | aa01889e30f7410beab85156e1fa465e0f00bf24 /examples | |
parent | 7c88869118305527be9a6aa52ce8f40e9216ee3b (diff) | |
download | pysnmp-git-690ea8ee6ae1ff16b184c8c17a6acda681613b6d.tar.gz |
* A single instance of transport dispatcher can now serve multiple
receivers (identified by IDs) chosen by a public data routing method.
* SnmpEngine.[un]registerTransportDispatcher() methods now accept optional
receiver ID token to be used by transport dispatcher's data router. This
allows for multiple SNMP engines registration with a single transport
dispatcher.
* Relevant example added
Diffstat (limited to 'examples')
-rw-r--r-- | examples/v3arch/asyncore/agent/cmdrsp/multiple-snmp-engines.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/examples/v3arch/asyncore/agent/cmdrsp/multiple-snmp-engines.py b/examples/v3arch/asyncore/agent/cmdrsp/multiple-snmp-engines.py new file mode 100644 index 00000000..af5dec2c --- /dev/null +++ b/examples/v3arch/asyncore/agent/cmdrsp/multiple-snmp-engines.py @@ -0,0 +1,88 @@ +# +# Multiple Command Responders +# +# Run multiple SNMP Engines each with a complete Command Responder. +# Bind each SNMP Engine to a dedicated network transport endpoint: +# +# * IPv4/UDP, listening at 127.0.0.1:161 +# * IPv4/UDP, listening at 127.0.0.2:161 +# +# Each Command Responder will respond to SNMP GET/SET/GETNEXT/GETBULK +# queries with the following options: +# +# * SNMPv3 +# * with USM user 'usr-md5-des', auth: MD5, priv DES or +# * allow read access to SNMPv2-MIB objects (1.3.6) +# * allow write access to SNMPv2-MIB objects (1.3.6.1.2.1) +# * over IPv4/UDP, listening at 127.0.0.1:161 +# +# Either of the following Net-SNMP's commands will walk the first Agent: +# +# $ snmpwalk -v3 -u usr-md5-des -l authPriv -A authkey1 -X privkey1 127.0.0.1 usmUserEntry +# $ snmpwalk -v3 -u usr-md5-des -l authPriv -A authkey1 -X privkey1 127.0.0.2 usmUserEntry +# +# Notice differently configured snmpEngineId's in usmUserEntry columns. +# +from pysnmp.entity import engine, config +from pysnmp.entity.rfc3413 import cmdrsp, context +from pysnmp.proto import rfc1902 +from pysnmp.carrier.asynsock.dispatch import AsynsockDispatcher +from pysnmp.carrier.asynsock.dgram import udp + +# Configuration parameters for each of SNMP Engines +snmpEngineInfo = ( + ( '0102030405060708', udp.domainName + (1,), ('127.0.0.1', 1161) ), + ( '0807060504030201', udp.domainName + (2,), ('127.0.0.1', 1162) ) +) + +# Instantiate the single transport dispatcher object +transportDispatcher = AsynsockDispatcher() + +# Instantiate and configure SNMP Engines +for snmpEngineId, transportDomain, transportAddress in snmpEngineInfo: + # Create SNMP engine with specific engineID + snmpEngine = engine.SnmpEngine(rfc1902.OctetString(hexValue=snmpEngineId)) + + # Register SNMP Engine object with transport dispatcher. Request incoming + # data from specific transport endpoint to be funneled to this SNMP Engine. + snmpEngine.registerTransportDispatcher(transportDispatcher, transportDomain) + + # Transport setup + + # UDP over IPv4 + config.addTransport( + snmpEngine, + transportDomain, + udp.UdpTransport().openServerMode(transportAddress) + ) + + # SNMPv3/USM setup + + # user: usr-md5-des, auth: MD5, priv DES + config.addV3User( + snmpEngine, 'usr-md5-des', + config.usmHMACMD5AuthProtocol, 'authkey1', + config.usmDESPrivProtocol, 'privkey1' + ) + + # Allow full MIB access for this user / securityModels at VACM + config.addVacmUser(snmpEngine, 3, 'usr-md5-des', 'authPriv', (1,3,6), (1,3,6,1,2,1)) + + # Get default SNMP context this SNMP engine serves + snmpContext = context.SnmpContext(snmpEngine) + + # 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 +transportDispatcher.jobStarted(1) + +# Run I/O dispatcher which would receive queries and send responses +try: + transportDispatcher.runDispatcher() +except: + transportDispatcher.closeDispatcher() + raise |