Advanced topics
***************


Custom ContextEngineId and ContextName
======================================

Send a SNMP GET request with the following options:

* with SNMPv3 with user 'usr-md5-none', SHA auth and no privacy
  protocols

* for MIB instance identified by

* contextEngineId: 0x80004fb805636c6f75644dab22cc,

* contextName: da761cfc8c94d3aceef4f60f049105ba

* over IPv4/UDP

* to an Agent at 104.236.166.95:161

* for an OID in tuple form

This script performs similar to the following Net-SNMP command:

   $ snmpget -v3 -l authNoPriv -u usr-md5-none -A authkey1 -E 80004fb805636c6f75644dab22cc -n da761cfc8c94d3aceef4f60f049105ba -ObentU 104.236.166.95:161  1.3.6.1.2.1.1.1.0

   from pysnmp.entity import engine, config
   from pysnmp.carrier.asyncore.dgram import udp
   from pysnmp.entity.rfc3413 import cmdgen
   from pysnmp.proto import rfc1902

   # Create SNMP engine instance
   snmpEngine = engine.SnmpEngine()

   #
   # SNMPv3/USM setup
   #

   # user: usr-md5-none, auth: MD5, priv: NONE
   config.addV3User(
       snmpEngine, 'usr-md5-none',
       config.usmHMACMD5AuthProtocol, 'authkey1'
   )
   config.addTargetParams(snmpEngine, 'my-creds', 'usr-md5-none', 'authNoPriv')

   #
   # Setup transport endpoint and bind it with security settings yielding
   # a target name
   #

   # UDP/IPv4
   config.addTransport(
       snmpEngine,
       udp.domainName,
       udp.UdpSocketTransport().openClientMode()
   )
   config.addTargetAddr(
       snmpEngine, 'my-router',
       udp.domainName, ('104.236.166.95', 161),
       'my-creds'
   )


   # Error/response receiver
   # noinspection PyUnusedLocal,PyUnusedLocal,PyUnusedLocal
   def cbFun(snmpEngine, sendRequestHandle, errorIndication,
             errorStatus, errorIndex, varBinds, cbCtx):
       if errorIndication:
           print(errorIndication)
       elif errorStatus:
           print('%s at %s' % (errorStatus.prettyPrint(),
                               errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
       else:
           for oid, val in varBinds:
               print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))


   # Prepare and send a request message, pass custom ContextEngineId & ContextName
   cmdgen.GetCommandGenerator().sendVarBinds(
       snmpEngine,
       'my-router',
       # contextEngineId
       rfc1902.OctetString(hexValue='80004fb805636c6f75644dab22cc'),
       # contextName
       rfc1902.OctetString('da761cfc8c94d3aceef4f60f049105ba'),
       [((1, 3, 6, 1, 2, 1, 1, 1, 0), None)],
       cbFun
   )

   # Run I/O dispatcher which would send pending queries and process responses
   snmpEngine.transportDispatcher.runDispatcher()

"Download" script.


Report SNMP engine processing details
=====================================

Send SNMP GET request with the following options:

* with SNMPv3 with user 'usr-sha-aes', SHA auth and AES128 privacy
  protocols

* over IPv4/UDP

* to an Agent at 104.236.166.95:161

* for an OID in tuple form

* also registers its own execution observer to snmpEngine

While execution, this script will report some details on request
processing as seen by rfc3412.sendPdu() and rfc3412.receiveMessage()
abstract interfaces.

This script performs similar to the following Net-SNMP command:

   $ snmpget -v3 -l authPriv -u usr-sha-aes -a SHA -A authkey1 -x AES -X privkey1 -ObentU 104.236.166.95:161  1.3.6.1.2.1.1.1.0

   from pysnmp.entity import engine, config
   from pysnmp.carrier.asyncore.dgram import udp
   from pysnmp.entity.rfc3413 import cmdgen

   # Create SNMP engine instance
   snmpEngine = engine.SnmpEngine()


   # Execution point observer setup

   # Register a callback to be invoked at specified execution point of 
   # SNMP Engine and passed local variables at code point's local scope
   # noinspection PyUnusedLocal,PyUnusedLocal
   def requestObserver(snmpEngine, execpoint, variables, cbCtx):
       print('Execution point: %s' % execpoint)
       print('* transportDomain: %s' % '.'.join([str(x) for x in variables['transportDomain']]))
       print('* transportAddress: %s' % '@'.join([str(x) for x in variables['transportAddress']]))
       print('* securityModel: %s' % variables['securityModel'])
       print('* securityName: %s' % variables['securityName'])
       print('* securityLevel: %s' % variables['securityLevel'])
       print('* contextEngineId: %s' % (variables['contextEngineId'] and variables['contextEngineId'].prettyPrint() or '<empty>',))
       print('* contextName: %s' % variables['contextName'].prettyPrint())
       print('* PDU: %s' % variables['pdu'].prettyPrint())


   snmpEngine.observer.registerObserver(
       requestObserver,
       'rfc3412.sendPdu',
       'rfc3412.receiveMessage:response'
   )

   #
   # SNMPv3/USM setup
   #

   # user: usr-sha-aes, auth: SHA, priv AES
   config.addV3User(
       snmpEngine, 'usr-sha-aes',
       config.usmHMACSHAAuthProtocol, 'authkey1',
       config.usmAesCfb128Protocol, 'privkey1'
   )
   config.addTargetParams(snmpEngine, 'my-creds', 'usr-sha-aes', 'authPriv')

   #
   # Setup transport endpoint and bind it with security settings yielding
   # a target name
   #

   # UDP/IPv4
   config.addTransport(
       snmpEngine,
       udp.domainName,
       udp.UdpSocketTransport().openClientMode()
   )
   config.addTargetAddr(
       snmpEngine, 'my-router',
       udp.domainName, ('104.236.166.95', 161),
       'my-creds'
   )


   # Error/response receiver
   # noinspection PyUnusedLocal,PyUnusedLocal,PyUnusedLocal
   def cbFun(snmpEngine, sendRequestHandle, errorIndication,
             errorStatus, errorIndex, varBinds, cbCtx):
       if errorIndication:
           print(errorIndication)
       elif errorStatus:
           print('%s at %s' % (errorStatus.prettyPrint(),
                               errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
       else:
           for oid, val in varBinds:
               print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))


   # Prepare and send a request message
   cmdgen.GetCommandGenerator().sendVarBinds(
       snmpEngine,
       'my-router',
       None, '',  # contextEngineId, contextName
       [((1, 3, 6, 1, 2, 1, 1, 1, 0), None)],
       cbFun
   )

   # Run I/O dispatcher which would send pending queries and process responses
   snmpEngine.transportDispatcher.runDispatcher()

   snmpEngine.observer.unregisterObserver()

"Download" script.

See also: library reference.
