diff --git a/server/alarm.py b/server/alarm.py index 0ff46c6..f24d8f1 100644 --- a/server/alarm.py +++ b/server/alarm.py @@ -6,4 +6,4 @@ class alarm: def check(self): if self.time >= time.time(): return True - return False \ No newline at end of file + return False diff --git a/server/client.py b/server/client.py index a88eab6..c1e18ed 100644 --- a/server/client.py +++ b/server/client.py @@ -9,4 +9,4 @@ class client: while True: data = self.sock.recv(1024) if not data: continue - print(self.address, ":", data.decode("ASCII")) \ No newline at end of file + print(self.address, ":", data.decode("ASCII")) diff --git a/server/http_server.py b/server/http_server.py new file mode 100644 index 0000000..c9235f7 --- /dev/null +++ b/server/http_server.py @@ -0,0 +1,27 @@ +from aiohttp import web +import asyncio +import time +import alarm +import json +class http_endpoint: + def __init__(self, server): + self.parent = server + self.app = web.Application() + self.app.add_routes([web.get("/r/tasks", self.rtasks), + web.get("/w/task", self.wtasks)]) + async def rtasks(self, request): + resp = [] + for task in self.parent.tasks: + resp.append({"name":task.name, "time":task.time}) + return web.Response(text=json.dumps(resp)) + async def wtasks(self, request): + name = request.query.get("name") + try: + tim = float(request.query.get("time")) + except: + return web.Response(status=422, text="400 bad arg") + if name == "": name = "unnamed" + if tim == 0.0: tim = time.time() + self.parent.tasks.append(alarm.alarm(tim, name)) + self.rtasks(request) + return web.Response(text="done") diff --git a/server/manager_server.py b/server/manager_server.py index faa6458..9e8224e 100644 --- a/server/manager_server.py +++ b/server/manager_server.py @@ -1,4 +1,4 @@ import server -s = server.server("192.168.1.2", 1337) +s = server.server("0.0.0.0", 1337) s.run() diff --git a/server/server.py b/server/server.py index 75ab9a3..f22139a 100644 --- a/server/server.py +++ b/server/server.py @@ -3,6 +3,9 @@ import client import threading import time import alarm +import http_server +import asyncio +from aiohttp import web class server: def __init__(self, address, port): @@ -10,6 +13,7 @@ class server: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.bind((address, port)) self.sock.listen() + self.tasks = [] def __del__(self): for c in self.clients: del c @@ -17,13 +21,20 @@ class server: t = threading.Thread(target=self.handle_connections, args=()) t.start() - ta = alarm.alarm(time.time() + 30) + + he = http_server.http_endpoint(self) + runner = web.AppRunner(he.app) + het = threading.Thread(target=self.launch_http_server, args=(runner,)) + het.start() + + self.tasks.append(alarm.alarm(time.time() + 30)) while True: time.sleep(10) - if ta.check(): - for c in self.clients: - c.sock.sendall("STA".encode("ASCII")) + for task in self.tasks: + if task.check(): + for c in self.clients: + c.sock.sendall("STA".encode("ASCII")) def handle_connections(self): while True: (client_sock, address) = self.sock.accept() @@ -34,3 +45,10 @@ class server: t = threading.Thread(target=c.run, args=()) t.start() + def launch_http_server(self, app_runner): + event_loop = asyncio.new_event_loop() + asyncio.set_event_loop(event_loop) + event_loop.run_until_complete(app_runner.setup()) + endpoint = web.TCPSite(app_runner, "0.0.0.0", 8080) + event_loop.run_until_complete(endpoint.start()) + event_loop.run_forever()