Advanced Command Generator
**************************


Concurrent queries
==================

Send multiple SNMP GET requests at once using the following options:

* with SNMPv2c, community 'public'

* over IPv4/UDP

* to an Agent at demo.snmplabs.com:161

* for two instances of SNMPv2-MIB::sysDescr.0 and
  SNMPv2-MIB::sysLocation.0 MIB object,

* based on Twisted I/O framework

Functionally similar to:

   $ snmpget -v2c -c public demo.snmplabs.com SNMPv2-MIB::sysDescr.0
   $ snmpget -v2c -c public demo.snmplabs.com SNMPv2-MIB::sysLocation.0

   from twisted.internet.defer import DeferredList
   from twisted.internet.task import react
   from pysnmp.hlapi.twisted import *


   def success(args, hostname):
       (errorStatus, errorIndex, varBinds) = args

       if errorStatus:
           print('%s: %s at %s' % (hostname,
                                   errorStatus.prettyPrint(),
                                   errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
       else:
           for varBind in varBinds:
               print(' = '.join([x.prettyPrint() for x in varBind]))


   def failure(errorIndication, hostname):
       print('%s failure: %s' % (hostname, errorIndication))


   # noinspection PyUnusedLocal
   def getSystem(reactor, hostname):
       snmpEngine = SnmpEngine()

       def getScalar(objectType):
           d = getCmd(snmpEngine,
                      CommunityData('public', mpModel=0),
                      UdpTransportTarget((hostname, 161)),
                      ContextData(),
                      objectType)
           d.addCallback(success, hostname).addErrback(failure, hostname)
           return d

       return DeferredList(
           [getScalar(ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0))),
            getScalar(ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysLocation', 0)))]
       )


   react(getSystem, ['demo.snmplabs.com'])

"Download" script.


Walk multiple Agents at once
============================

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

* over IPv4/UDP

* to Agents at demo.snmplabs.com:161 and demo.snmplabs.com:1161

* for multiple MIB subtrees and tables

* for whole MIB

* based on Twisted I/O framework

Functionally similar to:

   $ snmpget -v2c -c public demo.snmplabs.com:161 SNMPv2-MIB::system
   $ snmpget -v2c -c public demo.snmplabs.comL1161 SNMPv2-MIB::system

   from twisted.internet.defer import DeferredList
   from twisted.internet.task import react
   from pysnmp.hlapi.twisted import *


   def success(args, reactor, snmpEngine, hostname):
       (errorStatus, errorIndex, varBindTable) = args

       if errorStatus:
           print('%s: %s at %s' % (hostname,
                                   errorStatus.prettyPrint(),
                                   errorIndex and varBindTable[0][int(errorIndex) - 1][0] or '?'))
       else:
           for varBindRow in varBindTable:
               for varBind in varBindRow:
                   print(' = '.join([x.prettyPrint() for x in varBind]))

           if not isEndOfMib(varBindTable[-1]):
               return getbulk(reactor, snmpEngine, hostname, *varBindTable[-1])


   def failure(errorIndication):
       print(errorIndication)


   def getbulk(reactor, snmpEngine, hostname, varBinds):
       d = bulkCmd(snmpEngine,
                   UsmUserData('usr-md5-none', 'authkey1'),
                   UdpTransportTarget(hostname),
                   ContextData(),
                   0, 25,
                   varBinds)
       d.addCallback(success, reactor, snmpEngine, hostname).addErrback(failure)
       return d


   def getall(reactor, hostnames):
       snmpEngine = SnmpEngine()

       return DeferredList(
           [getbulk(reactor, snmpEngine, hostname,
                    ObjectType(ObjectIdentity('SNMPv2-MIB', 'system')))
            for hostname in hostnames]
       )


   react(getall, [(('demo.snmplabs.com', 161), ('demo.snmplabs.com', 1161))])

"Download" script.

See also: library reference.
