diff options
Diffstat (limited to 'pysnmp/carrier/asyncio')
-rw-r--r-- | pysnmp/carrier/asyncio/base.py | 2 | ||||
-rw-r--r-- | pysnmp/carrier/asyncio/dgram/base.py | 16 | ||||
-rw-r--r-- | pysnmp/carrier/asyncio/dgram/udp.py | 13 | ||||
-rw-r--r-- | pysnmp/carrier/asyncio/dispatch.py | 24 |
4 files changed, 37 insertions, 18 deletions
diff --git a/pysnmp/carrier/asyncio/base.py b/pysnmp/carrier/asyncio/base.py index 192343f9..200889b1 100644 --- a/pysnmp/carrier/asyncio/base.py +++ b/pysnmp/carrier/asyncio/base.py @@ -31,5 +31,3 @@ from pysnmp.carrier.base import AbstractTransport class AbstractAsyncioTransport(AbstractTransport): protoTransportDispatcher = AsyncioDispatcher """Base Asyncio Transport, to be used with AsyncioDispatcher""" - def __init__(self): - self._writeQ = [] diff --git a/pysnmp/carrier/asyncio/dgram/base.py b/pysnmp/carrier/asyncio/dgram/base.py index c45e3584..01a9e305 100644 --- a/pysnmp/carrier/asyncio/dgram/base.py +++ b/pysnmp/carrier/asyncio/dgram/base.py @@ -25,14 +25,15 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # +import sys +import traceback from pysnmp.carrier.asyncio.base import AbstractAsyncioTransport from pysnmp.carrier import error from pysnmp import debug try: import asyncio except ImportError: - from pysnmp.error import PySnmpError - raise PySnmpError('The asyncio transport is not available') + import trollius as asyncio loop = asyncio.get_event_loop() @@ -40,6 +41,9 @@ class DgramAsyncioProtocol(asyncio.DatagramProtocol, AbstractAsyncioTransport): """Base Asyncio datagram Transport, to be used with AsyncioDispatcher""" transport = None + def __init__(self, *args, **kwargs): + self._writeQ = [] + def datagram_received(self, datagram, transportAddress): if self._cbFun is None: raise error.CarrierError('Unable to call cbFun') @@ -55,8 +59,8 @@ class DgramAsyncioProtocol(asyncio.DatagramProtocol, AbstractAsyncioTransport): (transportAddress, debug.hexdump(outgoingMessage))) try: self.transport.sendto(outgoingMessage, transportAddress) - except Exception as err: - raise error.CarrierError() from err + except Exception: + raise error.CarrierError(';'.join(traceback.format_exception(*sys.exc_info()))) def connection_lost(self, exc): debug.logger & debug.flagIO and debug.logger('connection_lost: invoked') @@ -71,5 +75,5 @@ class DgramAsyncioProtocol(asyncio.DatagramProtocol, AbstractAsyncioTransport): else: try: self.transport.sendto(outgoingMessage, transportAddress) - except Exception as err: - raise error.CarrierError() from err + except Exception: + raise error.CarrierError(';'.join(traceback.format_exception(*sys.exc_info()))) diff --git a/pysnmp/carrier/asyncio/dgram/udp.py b/pysnmp/carrier/asyncio/dgram/udp.py index d29981a4..8b752e3e 100644 --- a/pysnmp/carrier/asyncio/dgram/udp.py +++ b/pysnmp/carrier/asyncio/dgram/udp.py @@ -25,13 +25,14 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # +import sys +import traceback from pysnmp.carrier.asyncio.dgram.base import DgramAsyncioProtocol from pysnmp.carrier import error try: import asyncio except ImportError: - from pysnmp.error import PySnmpError - raise PySnmpError('The asyncio transport is not available') + import trollius as asyncio loop = asyncio.get_event_loop() @@ -44,16 +45,16 @@ class UdpAsyncioTransport(DgramAsyncioProtocol): try: c = loop.create_datagram_endpoint(lambda: self, local_addr=iface) self._lport = asyncio.async(c) - except Exception as err: - raise error.CarrierError() from err + except Exception: + raise error.CarrierError(';'.join(traceback.format_exception(*sys.exc_info()))) return self def openServerMode(self, iface=('0.0.0.0', 161)): try: c = loop.create_datagram_endpoint(lambda: self, local_addr=iface) self._lport = asyncio.async(c) - except Exception as err: - raise error.CarrierError() from err + except Exception: + raise error.CarrierError(';'.join(traceback.format_exception(*sys.exc_info()))) return self def closeTransport(self): diff --git a/pysnmp/carrier/asyncio/dispatch.py b/pysnmp/carrier/asyncio/dispatch.py index 1d28b661..1a59db21 100644 --- a/pysnmp/carrier/asyncio/dispatch.py +++ b/pysnmp/carrier/asyncio/dispatch.py @@ -25,12 +25,14 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF # THE POSSIBILITY OF SUCH DAMAGE. # +import sys +import traceback from pysnmp.carrier.base import AbstractTransportDispatcher from pysnmp.error import PySnmpError try: import asyncio except ImportError: - raise PySnmpError('The asyncio transport is not available') + import trollius as asyncio loop = asyncio.get_event_loop() @@ -46,7 +48,7 @@ class AsyncioDispatcher(AbstractTransportDispatcher): @asyncio.coroutine def handle_timeout(self): while True: - yield from asyncio.sleep(self.getTimerResolution()) + yield asyncio.From(asyncio.sleep(self.getTimerResolution())) self.handleTimerTick(loop.time()) def runDispatcher(self, timeout=0.0): @@ -55,8 +57,8 @@ class AsyncioDispatcher(AbstractTransportDispatcher): loop.run_forever() except KeyboardInterrupt: raise - except Exception as err: - raise PySnmpError('event loop error') from err + except Exception: + raise error.PySnmpError(';'.join(traceback.format_exception(*sys.exc_info()))) def registerTransport(self, tDomain, transport): if self.loopingcall is None and self.getTimerResolution() > 0: @@ -76,3 +78,17 @@ class AsyncioDispatcher(AbstractTransportDispatcher): if self.__transportCount == 0 and not self.loopingcall.done(): self.loopingcall.cancel() self.loopingcall = None + +# Trollius or Tulip? +if not hasattr(asyncio, "From"): + exec( +"""\ +@asyncio.coroutine +def handle_timeout(self): + while True: + yield from asyncio.sleep(self.getTimerResolution()) + self.handleTimerTick(loop.time()) +AsyncioDispatcher.handle_timeout = handle_timeout\ +""" + ) + |