diff --git a/boswatch/router.py b/boswatch/router.py index c167461..7f2d0e3 100644 --- a/boswatch/router.py +++ b/boswatch/router.py @@ -14,6 +14,7 @@ @author: Bastian Schroll @description: Class for the BOSWatch packet router """ +# todo think about implement threading for routers and the plugin calls (THREAD SAFETY!!!) import logging import copy import importlib @@ -25,7 +26,7 @@ class _Router: def __init__(self, name): self.__name = name self.__route = [] - logging.debug("add new router: %s", self.__name) + logging.debug("[%s] new router", self.__name) def addRoute(self, route): logging.debug("[%s] add route: %s", self.__name, route) @@ -64,7 +65,7 @@ class RouterManager: def __del__(self): del self.__routerDict - + def buildRouter(self, config): self.__routerDict = {} # all routers and loaded modules/plugins would be unloaded logging.debug("build routers") @@ -73,32 +74,48 @@ class RouterManager: # because a router can be a valid target and we need his reference for router in config.get("router"): self.__routerDict[router.get("name")] = _Router(router.get("name")) - + for router in config.get("router"): for route in router.get("route"): - - if route.get("type") == "plugin": - importedFile = importlib.import_module(route.get("type") + "." + route.get("name")) - loadedClass = importedFile.BoswatchPlugin(route.get("config")) - self.__routerDict[router.get("name")].addRoute(loadedClass._run) - - elif route.get("type") == "module": - importedFile = importlib.import_module(route.get("type") + "." + route.get("name")) - loadedClass = importedFile.BoswatchModule(route.get("config")) - self.__routerDict[router.get("name")].addRoute(loadedClass._run) - - elif route.get("type") == "router": - self.__routerDict[router.get("name")].addRoute(self.__routerDict[route.get("name")].runRouter) + + routerName = router.get("name") + routeType = route.get("type") + routeName = route.get("name") + + if routeType is None or routeName is None: + logging.error("type or name error in config: %s", route) + continue + + try: + if routeType == "plugin": + importedFile = importlib.import_module(routeType + "." + routeName) + loadedClass = importedFile.BoswatchPlugin(route.get("config")) + self.__routerDict[routerName].addRoute(loadedClass._run) + + elif routeType == "module": + importedFile = importlib.import_module(routeType + "." + routeName) + loadedClass = importedFile.BoswatchModule(route.get("config")) + self.__routerDict[routerName].addRoute(loadedClass._run) + + elif routeType == "router": + self.__routerDict[routerName].addRoute(self.__routerDict[routeName].runRouter) + + else: + logging.warning("unknown type: %s", routeType) + + except ModuleNotFoundError: + logging.error("%s not found: %s", route.get("type"), route.get("name")) + + logging.debug("finished building routers") + self._showRouterRoute() def runRouter(self, routerList, bwPacket): for router in routerList: if router in self.__routerDict: self.__routerDict[router].runRouter(bwPacket) - def showRouterRoute(self): + def _showRouterRoute(self): for name, router in self.__routerDict.items(): logging.debug("Route for %s", name) for route in router.route: - logging.debug("- %s", route) - - + logging.debug(" | %s", route) diff --git a/bw_server.py b/bw_server.py index 8073f4a..479b59f 100644 --- a/bw_server.py +++ b/bw_server.py @@ -38,11 +38,13 @@ try: logging.debug("Import python module") import argparse logging.debug("- argparse") + import queue + logging.debug("- queue") + # following is temp for testing import time import sys import threading - import queue logging.debug("Import BOSWatch module") from boswatch.configYaml import ConfigYAML diff --git a/router_test.py b/router_test.py index 9b29028..27272b2 100644 --- a/router_test.py +++ b/router_test.py @@ -16,8 +16,8 @@ print() routMan = RouterManager() routMan.buildRouter(config) + print() -routMan.showRouterRoute() routMan.runRouter(config.get("alarmRouter"), bwPack)