From ca3f8d0b43d9826636115b44ffb40247a1a34c3a Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Fri, 2 Jun 2017 14:50:34 +0200 Subject: [PATCH] Provide easy to test a shell by using stdin as an input --- gns3server/utils/asyncio/embed_shell.py | 71 +++++++++++++++---------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/gns3server/utils/asyncio/embed_shell.py b/gns3server/utils/asyncio/embed_shell.py index ccd3520c..fac81d3f 100644 --- a/gns3server/utils/asyncio/embed_shell.py +++ b/gns3server/utils/asyncio/embed_shell.py @@ -136,6 +136,39 @@ def create_telnet_shell(shell, loop=None): return AsyncioTelnetServer(reader=shell.writer, writer=shell.reader, binary=False, echo=False) +def create_stdin_shell(shell, loop=None): + """ + Run a shell application with a stdin frontend + + :param application: An EmbedShell instance + :param loop: The event loop + :returns: Telnet server + """ + @asyncio.coroutine + def feed_stdin(loop, reader): + while True: + line = yield from loop.run_in_executor(None, sys.stdin.readline) + reader.feed_data(line.encode()) + + @asyncio.coroutine + def read_stdout(writer): + while True: + c = yield from writer.read(1) + print(c.decode(), end='') + sys.stdout.flush() + + reader = asyncio.StreamReader() + writer = asyncio.StreamReader() + shell.reader = reader + shell.writer = writer + if loop is None: + loop = asyncio.get_event_loop() + + reader_task = loop.create_task(feed_stdin(loop, reader)) + writer_task = loop.create_task(read_stdout(writer)) + shell_task = loop.create_task(shell.run()) + return asyncio.gather(shell_task, writer_task, reader_task) + if __name__ == '__main__': loop = asyncio.get_event_loop() @@ -154,34 +187,14 @@ if __name__ == '__main__': return 'world\n' # Demo using telnet - server = create_telnet_shell(Demo()) - coro = asyncio.start_server(server.run, '127.0.0.1', 4444, loop=loop) - s = loop.run_until_complete(coro) - try: - loop.run_forever() - except KeyboardInterrupt: - pass + # server = create_telnet_shell(Demo()) + # coro = asyncio.start_server(server.run, '127.0.0.1', 4444, loop=loop) + # s = loop.run_until_complete(coro) + # try: + # loop.run_forever() + # except KeyboardInterrupt: + # pass # Demo using stdin - # @asyncio.coroutine - # def feed_stdin(loop, reader): - # while True: - # line = yield from loop.run_in_executor(None, sys.stdin.readline) - # reader.feed_data(line.encode()) - # - # @asyncio.coroutine - # def read_stdout(writer): - # while True: - # c = yield from writer.read(1) - # print(c.decode(), end='') - # sys.stdout.flush() - # - # reader = asyncio.StreamReader() - # writer = asyncio.StreamReader() - # shell = Demo(reader, writer, loop=loop) - # - # reader_task = loop.create_task(feed_stdin(loop, reader)) - # writer_task = loop.create_task(read_stdout(writer)) - # shell_task = loop.create_task(shell.run()) - # loop.run_until_complete(asyncio.gather(shell_task, writer_task, reader_task)) - # loop.close() + loop.run_until_complete(create_stdin_shell(Demo())) + loop.close()