From 5d2224bfe4344f276ae310b2f60c348ff648163c Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Wed, 16 Dec 2015 16:30:15 +0100 Subject: [PATCH] Support two clients --- gns3server/utils/asyncio/telnet_server.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/gns3server/utils/asyncio/telnet_server.py b/gns3server/utils/asyncio/telnet_server.py index d098f9acc..608ce6846 100644 --- a/gns3server/utils/asyncio/telnet_server.py +++ b/gns3server/utils/asyncio/telnet_server.py @@ -59,11 +59,15 @@ class AsyncioTelnetServer: def __init__(self, reader=None, writer=None): self._reader = reader self._writer = writer + self._clients = {} @asyncio.coroutine def run(self, network_reader, network_writer): READ_SIZE = 1024 + # Keep track of + self._clients[network_reader] = network_writer + try: # Send initial telnet session opening network_writer.write(bytes([IAC, WILL, ECHO, @@ -83,11 +87,14 @@ def run(self, network_reader, network_writer): ], return_when=asyncio.FIRST_COMPLETED) for coro in done: - data = coro.result() + try: + data = coro.result() + # Raise if another process is reading the same + # datas + except RuntimeError: + continue if coro == network_read: network_read = asyncio.async(network_reader.read(READ_SIZE)) - # Strip that so we don't get a double prompt. - #data = data.replace(b"\r\n", b"\n") if IAC in data: data = yield from self._IAC_parser(data, network_reader, network_writer) if self._writer: @@ -97,7 +104,13 @@ def run(self, network_reader, network_writer): reader_read = asyncio.async(self._reader.read(READ_SIZE)) network_writer.write(data) yield from network_writer.drain() + # Replicate the output on other clients + for writer in self._clients.values(): + if writer != network_writer: + writer.write(data) + yield from writer.drain() except ConnectionResetError: + del self._clients[network_reader] return def _IAC_parser(self, buf, network_reader, network_writer):