diff options
Diffstat (limited to 'pysnmp/entity/rfc3413/asyncio')
-rw-r--r-- | pysnmp/entity/rfc3413/asyncio/__init__.py | 1 | ||||
-rw-r--r-- | pysnmp/entity/rfc3413/asyncio/cmdgen.py | 178 | ||||
-rw-r--r-- | pysnmp/entity/rfc3413/asyncio/ntforg.py | 66 |
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 |