Asynchronous: trollius
**********************

In order to use "asyncio" features with older Python (2.6+), you could
download and install Trollius module. PySNMP's *asyncio* bindings will
work with Trollius as well.

In most examples approximate analogues of well known Net-SNMP snmp*
tools command line options are shown. That may help those readers who,
by chance are familiar with Net-SNMP tools, better understanding what
example code doe

Here's a quick example on a simple SNMP GET by high-level API:

   * with SNMPv1, community 'public'

   * over IPv4/UDP

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

   * for an instance of SNMPv2-MIB::sysDescr.0 MIB object

   * Based on trollius I/O framework

   import trollius
   from pysnmp.hlapi.asyncio import *


   @trollius.coroutine
   def run():
       snmpEngine = SnmpEngine()
       (errorIndication,
        errorStatus,
        errorIndex,
        varBinds) = yield trollius.From(
           getCmd(snmpEngine,
                  CommunityData('public', mpModel=0),
                  UdpTransportTarget(('demo.snmplabs.com', 161)),
                  ContextData(),
                  ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
       )

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

       snmpEngine.transportDispatcher.closeDispatcher()


   trollius.get_event_loop().run_until_complete(run())

To make use of SNMPv3 and USM, the following code performs a series of
SNMP GETNEXT operations effectively fetching a table of SNMP variables
from SNMP Agent:

* with SNMPv3, user 'usr-none-none', no authentication, no privacy

* over IPv4/UDP

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

* for all OIDs past SNMPv2-MIB::system

* run till end-of-mib condition is reported by Agent

* based on trollius I/O framework

   import trollius
   from pysnmp.hlapi.asyncio import *


   @trollius.coroutine
   def run(varBinds):
       snmpEngine = SnmpEngine()
       while True:
           (errorIndication,
            errorStatus,
            errorIndex,
            varBindTable) = yield trollius.From(
               bulkCmd(snmpEngine,
                       UsmUserData('usr-none-none'),
                       UdpTransportTarget(('demo.snmplabs.com', 161)),
                       ContextData(),
                       0, 50,
                       *varBinds)
           )

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

           varBinds = varBindTable[-1]
           if isEndOfMib(varBinds):
               break

       snmpEngine.transportDispatcher.closeDispatcher()


   loop = trollius.get_event_loop()

   loop.run_until_complete(
       run([ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr'))])
   )

More examples on Command Generator API usage follow.

* Various SNMP versions

  * SNMPv1

  * Bulk walk MIB

* Walking operations

  * Bulk walk MIB

Sending SNMP TRAP's and INFORM's is as easy with PySNMP library. The
following code sends SNMP TRAP:

* SNMPv1

* with community name 'public'

* over IPv4/UDP

* send TRAP notification

* with Generic Trap #1 (warmStart) and Specific Trap 0

* with default Uptime

* with default Agent Address

* with Enterprise OID 1.3.6.1.4.1.20408.4.1.1.2

* include managed object information '1.3.6.1.2.1.1.1.0' = 'my system'

* use trollius I/O framework

   import trollius
   from pysnmp.hlapi.asyncio import *


   @trollius.coroutine
   def run():
       snmpEngine = SnmpEngine()
       (errorIndication,
        errorStatus,
        errorIndex,
        varBinds) = yield trollius.From(
           sendNotification(
               snmpEngine,
               CommunityData('public'),  # mpModel=0),
               UdpTransportTarget(('demo.snmplabs.com', 162)),
               ContextData(),
               'inform',
               NotificationType(
                   ObjectIdentity('1.3.6.1.6.3.1.1.5.2')
               ).addVarBinds(
                   ('1.3.6.1.6.3.1.1.4.3.0', '1.3.6.1.4.1.20408.4.1.1.2'),
                   ('1.3.6.1.2.1.1.1.0', OctetString('my system'))
               )
           )
       )

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

       snmpEngine.transportDispatcher.closeDispatcher()


   trollius.get_event_loop().run_until_complete(run())

More examples on Notification Originator API usage follow.

* Common notifications

  * SNMPv1 TRAP with defaults

More sophisticated or less popular SNMP operations can still be
performed with PySNMP through its Native API to Standard SNMP
Applications.
