diff --git a/service.py b/service.py index e74c7f9..fc65b81 100644 --- a/service.py +++ b/service.py @@ -1,7 +1,7 @@ #sys imports import argparse import traceback -import sys +import sys, os import asyncio from time import time from typing import List, Dict @@ -54,7 +54,7 @@ class MeshListener(MeshArgsParse): #task async def meshWorker(self, queue: asyncio.Queue): logger.info("Start mesh queue listener") - run = True + run = not self.args.disable_mesh while run: try: await self.device.start() @@ -82,6 +82,7 @@ class MeshListener(MeshArgsParse): class MeshApi(MeshArgsParse): app: FastAPI tasks: List + context: str = "/api" def __init__(self, args): super().__init__(args) self.app = FastAPI(lifespan=self.lifespan) @@ -169,6 +170,7 @@ class MeshCenter(MeshListener, MeshApi, MongoDriver, MeshArgsParse): MongoDriver.__init__(self, args) self.buildBackgroundTasks() self.bot = BotManager(self) + self.extensionLoader(['webExtensions']) async def queueHandler(self): logger.info("Start queue handler") @@ -200,12 +202,34 @@ class MeshCenter(MeshListener, MeshApi, MongoDriver, MeshArgsParse): self.tasks.append(handlerTask) + def extensionLoader(self, search_paths = []): + logger.info("Search fastapiExt") + os.chdir(os.path.dirname(os.path.abspath(__file__))) + if type(search_paths) == str: + search_paths = [search_paths] + + for path in search_paths: + logger.info(f"Try found extensions in {path}") + if not os.path.exists(path) or not os.path.isdir(path): + logger.info(f"Directory is not exists or not directory, skip") + continue + + sys.path.insert(0, path) + for extension in os.listdir(path): + extension, ext = os.path.splitext(extension) + if ext != ".py": + continue + logger.info(f"Found web ext: {extension}") + __import__(extension).WebExtension(self) + sys.path.pop(0) + if __name__ == "__main__": parser = argparse.ArgumentParser() #mesh parser.add_argument("--transport", default="serial") parser.add_argument("--serial-port", default="/dev/tty.usbmodemD0CF1309DC141") parser.add_argument("--serial-baudrate", default=115200) + parser.add_argument("--disable-mesh", action="store_true", default=True) #fastapi parser.add_argument("--web-host", default="0.0.0.0") parser.add_argument("--web-port", default=8680) diff --git a/webExtensions/webPing.py b/webExtensions/webPing.py new file mode 100644 index 0000000..f5785b8 --- /dev/null +++ b/webExtensions/webPing.py @@ -0,0 +1,11 @@ +from fastapi import FastAPI + +class WebExtension: + app: FastAPI + def __init__(self, core): + self.core = core + self.app = core.app + + @self.app.get(f"{self.core.context}/ping") + async def pong(): + return {"pong": True}