summaryrefslogtreecommitdiff
path: root/pysnmp/entity/rfc3413/oneliner/sync/ntforg.py
diff options
context:
space:
mode:
Diffstat (limited to 'pysnmp/entity/rfc3413/oneliner/sync/ntforg.py')
-rw-r--r--pysnmp/entity/rfc3413/oneliner/sync/ntforg.py126
1 files changed, 126 insertions, 0 deletions
diff --git a/pysnmp/entity/rfc3413/oneliner/sync/ntforg.py b/pysnmp/entity/rfc3413/oneliner/sync/ntforg.py
new file mode 100644
index 0000000..16f3930
--- /dev/null
+++ b/pysnmp/entity/rfc3413/oneliner/sync/ntforg.py
@@ -0,0 +1,126 @@
+from pysnmp.entity.rfc3413.oneliner.ntforg import *
+
+if version_info[:2] < (2, 6):
+ def next(iter):
+ return iter.next()
+
+def sendNotification(snmpEngine, authData, transportTarget, contextData,
+ notifyType, varBinds, **options):
+ """Creates a generator to send one or more SNMP notifications.
+
+ On each iteration, new SNMP TRAP or INFORM notification is send
+ (:RFC:`3413#section-3.3`). The iterator blocks waiting for
+ INFORM acknowlegement to arrive or error to occur.
+
+ Parameters
+ ----------
+ snmpEngine : :py:class:`~pysnmp.entity.engine.SnmpEngine`
+ Class instance representing SNMP engine.
+
+ authData : :py:class:`~pysnmp.entity.rfc3413.oneliner.auth.CommunityData` or :py:class:`~pysnmp.entity.rfc3413.oneliner.auth.UsmUserData`
+ Class instance representing SNMP credentials.
+
+ transportTarget : :py:class:`~pysnmp.entity.rfc3413.oneliner.target.UdpTransportTarget` or :py:class:`~pysnmp.entity.rfc3413.oneliner.target.Udp6TransportTarget`
+ Class instance representing transport type along with SNMP peer address.
+
+ contextData : :py:class:`~pysnmp.entity.rfc3413.oneliner.ctx.ContextData`
+ Class instance representing SNMP ContextEngineId and ContextName values.
+
+ notifyType : str
+ Indicates type of notification to be sent. Recognized literal
+ values are *trap* or *inform*.
+
+ varBinds: tuple
+ Single :py:class:`~pysnmp.smi.rfc1902.NotificationType` class instance
+ representing a minimum sequence of MIB variables required for
+ particular notification type.
+ Alternatively, a sequence of :py:class:`~pysnmp.smi.rfc1902.ObjectType`
+ objects could be passed instead. In the latter case it is up to
+ the user to ensure proper Notification PDU contents.
+
+ Other Parameters
+ ----------------
+ **options :
+ Request options:
+
+ * `lookupMib` - load MIB and resolve response MIB variables at
+ the cost of slightly reduced performance. Default is `True`.
+
+ Yields
+ ------
+ errorIndication : str
+ True value indicates SNMP engine error.
+ errorStatus : str
+ Non-zero value indicates SNMP PDU error.
+ errorIndex : int
+ Non-zero value refers to *varBinds[errorIndex-1]
+ varBinds : tuple
+ A sequence of :py:class:`~pysnmp.smi.rfc1902.ObjectType` class
+ instances representing MIB variables returned in SNMP response.
+
+ Raises
+ ------
+ PySnmpError
+ Or its derivative indicating that an error occurred while
+ performing SNMP operation.
+
+ Notes
+ -----
+ The `sendNotification` generator will be exhausted immidiately unless
+ an instance of :py:class:`~pysnmp.smi.rfc1902.NotificationType` class
+ or a sequence of :py:class:`~pysnmp.smi.rfc1902.ObjectType` `varBinds`
+ are send back into running generator (supported since Python 2.6).
+
+ Examples
+ --------
+ >>> from pysnmp.entity.rfc3413.oneliner.ntforg import *
+ >>> g = sendNotification(SnmpEngine(),
+ ... CommunityData('public'),
+ ... UdpTransportTarget(('demo.snmplabs.com', 162)),
+ ... ContextData(),
+ ... 'trap',
+ ... NotificationType(ObjectIdentity('IF-MIB', 'linkDown')))
+ >>> next(g)
+ (None, 0, 0, [])
+ >>>
+
+ """
+ def cbFun(snmpEngine, sendRequestHandle,
+ errorIndication, errorStatus, errorIndex,
+ varBinds, cbCtx):
+ cbCtx['errorIndication'] = errorIndication
+ cbCtx['errorStatus'] = errorStatus
+ cbCtx['errorIndex'] = errorIndex
+ cbCtx['varBinds'] = varBinds
+
+ cbCtx = {}
+
+ ntfOrg = AsyncNotificationOriginator()
+
+ while True:
+ if varBinds:
+ ntfOrg.sendNotification(
+ snmpEngine,
+ authData,
+ transportTarget,
+ contextData,
+ notifyType,
+ varBinds,
+ cbInfo=(cbFun, cbCtx),
+ lookupMib=options.get('lookupMib', True)
+ )
+
+ snmpEngine.transportDispatcher.runDispatcher()
+
+ errorIndication = cbCtx.get('errorIndication')
+ errorStatus = cbCtx.get('errorStatus')
+ errorIndex = cbCtx.get('errorIndex')
+ varBinds = cbCtx.get('varBinds', [])
+ else:
+ errorIndication = errorStatus = errorIndex = None
+ varBinds = []
+
+ varBinds = ( yield errorIndication, errorStatus, errorIndex, varBinds )
+
+ if not varBinds:
+ break