summaryrefslogtreecommitdiff
path: root/pysnmp/entity/rfc3413/asyncio
diff options
context:
space:
mode:
Diffstat (limited to 'pysnmp/entity/rfc3413/asyncio')
-rw-r--r--pysnmp/entity/rfc3413/asyncio/__init__.py1
-rw-r--r--pysnmp/entity/rfc3413/asyncio/cmdgen.py178
-rw-r--r--pysnmp/entity/rfc3413/asyncio/ntforg.py66
3 files changed, 245 insertions, 0 deletions
diff --git a/pysnmp/entity/rfc3413/asyncio/__init__.py b/pysnmp/entity/rfc3413/asyncio/__init__.py
new file mode 100644
index 0000000..ac0b2c0
--- /dev/null
+++ b/pysnmp/entity/rfc3413/asyncio/__init__.py
@@ -0,0 +1 @@
+# This file is necessary to make this directory a package.
diff --git a/pysnmp/entity/rfc3413/asyncio/cmdgen.py b/pysnmp/entity/rfc3413/asyncio/cmdgen.py
new file mode 100644
index 0000000..8a127c2
--- /dev/null
+++ b/pysnmp/entity/rfc3413/asyncio/cmdgen.py
@@ -0,0 +1,178 @@
+#
+# Copyright (C) 2014, Zebra Technologies
+# Authors: Matt Hooks <me@matthooks.com>
+# Zachary Lorusso <zlorusso@gmail.com>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+#
+from pysnmp.entity.rfc3413 import cmdgen
+from pyasn1.compat.octets import null
+from pysnmp.proto.api import v2c
+try:
+ import asyncio
+except ImportError:
+ from pysnmp.error import PySnmpError
+ raise PySnmpError('The asyncio transport is not available')
+
+class AbstractCommandGenerator:
+ commandGenerator = None
+
+ def _cbFunWithFuture(self, snmpEngine, sendRequestHandle, errorIndication,
+ errorStatus, errorIndex, varBinds, cbCtx):
+ future = cbCtx
+ future.set_result(
+ (snmpEngine, errorIndication, errorStatus, errorIndex, varBinds)
+ )
+
+ def sendVarBinds(self, snmpEngine, targetName,
+ contextEngineId, contextName, varBinds):
+ future = asyncio.Future()
+ self.commandGenerator.sendVarBinds(
+ snmpEngine,
+ targetName,
+ contextEngineId,
+ contextName,
+ varBinds,
+ self._cbFunWithFuture,
+ future
+ )
+ return future
+
+class GetCommandGenerator(AbstractCommandGenerator):
+ commandGenerator = cmdgen.GetCommandGenerator()
+
+class SetCommandGenerator(AbstractCommandGenerator):
+ commandGenerator = cmdgen.SetCommandGenerator()
+
+class AbstractNextCommandGenerator:
+ commandGenerator = None
+
+ def _cbFunWithFuture(self, snmpEngine, sendRequestHandle, errorIndication,
+ errorStatus, errorIndex, varBinds, cbCtx):
+ targetName, contextEngineId, contextName, reqVarBinds, futureCtx = cbCtx
+ status = {}
+
+ def _nextCbFunClosure():
+ def _cbFun(future):
+ if not status.get('future'):
+ return
+ errorIndication, nextVarBinds = cmdgen.getNextVarBinds(
+ [ (v2c.ObjectIdentifier(x[0]), x[1]) for x in reqVarBinds ],
+ varBinds[-1]
+ )
+ self.commandGenerator.sendVarBinds(
+ snmpEngine,
+ targetName,
+ contextEngineId,
+ contextName,
+ nextVarBinds,
+ self._cbFunWithFuture,
+ (targetName, contextEngineId, contextName, nextVarBinds, { 'future': status['future']})
+ )
+ return _cbFun
+
+ future = futureCtx['future']
+ # add our own callback sending request for next vars if needed
+ future.add_done_callback(_nextCbFunClosure())
+ future.set_result(
+ (snmpEngine, errorIndication, errorStatus, errorIndex, varBinds, status)
+ )
+
+ def sendVarBinds(self, snmpEngine, targetName,
+ contextEngineId, contextName, varBinds):
+ future = asyncio.Future()
+ self.commandGenerator.sendVarBinds(
+ snmpEngine,
+ targetName,
+ contextEngineId,
+ contextName,
+ varBinds,
+ self._cbFunWithFuture,
+ (targetName, contextEngineId, contextName, varBinds, { 'future': future })
+ )
+ return future
+
+class NextCommandGeneratorSingleRun(AbstractNextCommandGenerator):
+ commandGenerator = cmdgen.NextCommandGeneratorSingleRun()
+
+class NextCommandGenerator(AbstractNextCommandGenerator):
+ commandGenerator = cmdgen.NextCommandGenerator()
+
+class AbstractBulkCommandGenerator:
+ commandGenerator = None
+
+ def _cbFunWithFuture(self, snmpEngine, sendRequestHandle, errorIndication,
+ errorStatus, errorIndex, varBinds, cbCtx):
+ targetName, contextEngineId, contextName, nonRepeaters, maxRepetitions, reqVarBinds, futureCtx = cbCtx
+ status = {}
+
+ def _nextCbFunClosure():
+ def _cbFun(future):
+ if not status.get('future'):
+ return
+ errorIndication, nextVarBinds = cmdgen.getNextVarBinds(
+ [ (v2c.ObjectIdentifier(x[0]), x[1]) for x in reqVarBinds ],
+ varBinds[-1]
+ )
+ self.commandGenerator.sendVarBinds(
+ snmpEngine,
+ targetName,
+ contextEngineId,
+ contextName,
+ nonRepeaters,
+ maxRepetitions,
+ nextVarBinds,
+ self._cbFunWithFuture,
+ (targetName, contextEngineId, contextName, nonRepeaters, maxRepetitions, nextVarBinds, { 'future': status['future']})
+ )
+ return _cbFun
+
+ future = futureCtx['future']
+ # add our own callback sending request for next vars if needed
+ future.add_done_callback(_nextCbFunClosure())
+ future.set_result(
+ (snmpEngine, errorIndication, errorStatus, errorIndex, varBinds, status)
+ )
+
+ def sendVarBinds(self, snmpEngine, targetName,
+ contextEngineId, contextName,
+ nonRepeaters, maxRepetitions, varBinds):
+ future = asyncio.Future()
+ self.commandGenerator.sendVarBinds(
+ snmpEngine,
+ targetName,
+ contextEngineId,
+ contextName,
+ nonRepeaters,
+ maxRepetitions,
+ varBinds,
+ self._cbFunWithFuture,
+ (targetName, contextEngineId, contextName, nonRepeaters, maxRepetitions, varBinds, { 'future': future })
+ )
+ return future
+
+class BulkCommandGeneratorSingleRun(AbstractBulkCommandGenerator):
+ commandGenerator = cmdgen.BulkCommandGeneratorSingleRun()
+
+class BulkCommandGenerator(AbstractBulkCommandGenerator):
+ commandGenerator = cmdgen.BulkCommandGenerator()
diff --git a/pysnmp/entity/rfc3413/asyncio/ntforg.py b/pysnmp/entity/rfc3413/asyncio/ntforg.py
new file mode 100644
index 0000000..716e524
--- /dev/null
+++ b/pysnmp/entity/rfc3413/asyncio/ntforg.py
@@ -0,0 +1,66 @@
+#
+# Copyright (C) 2014, Zebra Technologies
+# Authors: Matt Hooks <me@matthooks.com>
+# Zachary Lorusso <zlorusso@gmail.com>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+#
+from pysnmp.entity.rfc3413 import ntforg
+from pyasn1.compat.octets import null
+try:
+ import asyncio
+except ImportError:
+ from pysnmp.error import PySnmpError
+ raise PySnmpError('The asyncio transport is not available')
+
+def _cbFunWithFuture(snmpEngine, sendRequestHandle, errorIndication,
+ errorStatus, errorIndex, varBinds, cbCtx):
+ cbCtx.set_result(
+ (snmpEngine, errorIndication, errorStatus, errorIndex, varBinds)
+ )
+
+class NotificationOriginator:
+ def __init__(self):
+ self.notificationOriginator = ntforg.NotificationOriginator()
+
+ def sendVarBinds(self,
+ snmpEngine,
+ notificationTarget,
+ snmpContext,
+ contextName,
+ notificationName,
+ instanceIndex,
+ additionalVarBinds=()):
+ future = asyncio.Future()
+ self.notificationOriginator.sendVarBinds(
+ snmpEngine,
+ notificationTarget,
+ snmpContext,
+ contextName,
+ notificationName,
+ instanceIndex,
+ additionalVarBinds,
+ _cbFunWithFuture,
+ future
+ )
+ return future