From 8f6843299910d18d00bca44b5561b0529f024d10 Mon Sep 17 00:00:00 2001 From: BB Date: Sat, 6 May 2023 01:46:38 -0600 Subject: [PATCH] netgenie-server: Added a new server. todo - test. --- NetGuard | 2 +- server/NetGenieSrv.py | 110 ++++++++++++++++++++++++++++++------------ 2 files changed, 80 insertions(+), 32 deletions(-) diff --git a/NetGuard b/NetGuard index 0350e46..e3bbfed 160000 --- a/NetGuard +++ b/NetGuard @@ -1 +1 @@ -Subproject commit 0350e46d6dbe398dc395675e348121fe3ae6624a +Subproject commit e3bbfed2c3548f815d740c9ae261329d708f6d9c diff --git a/server/NetGenieSrv.py b/server/NetGenieSrv.py index 48eb586..7d7937a 100644 --- a/server/NetGenieSrv.py +++ b/server/NetGenieSrv.py @@ -1,41 +1,89 @@ -#!/bin/env python3 +import asyncio -def check_bridge_socket():: - evt = None - return evt +class NGServer: + def __init__(self): + self.incoming_queue = asyncio.Queue() + self.outgoing_queue = asyncio.Queue() + self.client_reader = None + self.client_writer = None -def handle_bridge_evt(evt): - """ - TODO: Whatever bridge events to handle - """ + async def handle_client(self, reader, writer): + self.client_reader = reader + self.client_writer = writer + while True: + data = await reader.read(1024) + if not data: + writer.close() + break + await self.incoming_queue.put(data) + async def handle_incoming(self, reader, writer): + while True: + data = await self.incoming_queue.get() + writer.write(data) + await writer.drain() -def check_debug_socket(): - dbg_evt = None - return dbg_evt + async def handle_outgoing(self, reader, writer): + while True: + data = await self.outgoing_queue.get() + writer.write(data) + await writer.drain() -def handle_debug_evt(dbg_evt): - """ TODO: Do something with the events here.""" + async def read_from_server(self): + while True: + data = await self.client_reader.read(1024) + if not data: + self.client_writer.close() + break + await self.outgoing_queue.put(data) -def run_loop(): - """ """ - while True: - # 1. Check the BridgeSocket - evt = check_bridge_socket() - if evt != None: - handle_bridge_evt(evt) - dbg_evt = check_debug_socket() - if dbg_evt != None: - handle_debug_evt(dbg_evt) -def main(): - """ - 1. TODO: Open Server port that the device connects to. - 2. TODO: Open Server port that an admin connects to, i.e., to test sending packets to - 3. TODO (Optional): We might be able to start a Scapy [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop) - and then add these functions. That way the person in debugging the phone can do live testing. + async def start_server(self): + server = await asyncio.start_server(self.handle_client, host='localhost', port=8000) + async with server: + await server.serve_forever() + + async def start_incoming_server(self): + server = await asyncio.start_server(self.handle_incoming, host='localhost', port=8001) + async with server: + await server.serve_forever() + + async def start_outgoing_server(self): + server = await asyncio.start_server(self.handle_outgoing, host='localhost', port=8002) + async with server: + await server.serve_forever() + +async def do_async_stuff(ng): + await asyncio.gather(ng.start_server(),ng.start_queue_server()) + +async def main(): """ + In this code, we're creating and running four separate coroutines: + + 1. start_server + 2. start_incoming_server + 3. start_outgoing_server + 4. read_from_server. + + We're also creating separate tasks for handling incoming and + outgoing data and adding them to the tasks list. + """ + ng = NGServer() + await asyncio.gather( + ng.start_server(), + ng.start_incoming_server(), + ng.start_outgoing_server(), + ) + """ + tasks = [ + ng.read_from_server(), + ng.handle_incoming(), + ng.handle_outgoing(), + ] + await asyncio.gather(*tasks) + """ -if __name__ == '__main__': - main() +def example(): + """ """ +# asyncio.run(main())