Skip to content

Commit

Permalink
Support two clients
Browse files Browse the repository at this point in the history
  • Loading branch information
julien-duponchelle committed Dec 16, 2015
1 parent 1380d16 commit 5d2224b
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions gns3server/utils/asyncio/telnet_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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:
Expand All @@ -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):
Expand Down

0 comments on commit 5d2224b

Please sign in to comment.