From 4ac4bc5faa09647daa075aba967a523aff2a274a Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Fri, 1 Mar 2019 22:46:28 +0100 Subject: [PATCH] improve error handling in router building --- boswatch/router.py | 28 ++++++++++++++++++++-------- config/server.yaml | 41 +++++++++++++++++++---------------------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/boswatch/router.py b/boswatch/router.py index 6803af7..1e8c12c 100644 --- a/boswatch/router.py +++ b/boswatch/router.py @@ -67,16 +67,24 @@ class RouterManager: # destroy all routers (also destroys all instances of modules/plugins) del self._routerDict - def buildRouter(self, config): + def buildRouter(self, config): # todo validation self._routerDict = {} # all routers and instances of modules/plugins would be destroyed + routerDict_tmp = {} logging.debug("build routers") # first we have to init all routers # 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")) + if router.get("name") in self._routerDict: + logging.error("duplicated router name: %s", router.get("name")) + return False + routerDict_tmp[router.get("name")] = _Router(router.get("name")) for router in config.get("router"): + if router.get("name") is None or router.get("route") is None: + logging.error("name or route not found in router: %s", router) + return False + for route in router.get("route"): routerName = router.get("name") @@ -84,31 +92,35 @@ class RouterManager: routeName = route.get("name") if routeType is None or routeName is None: - logging.error("type or name error in config: %s", route) - continue + logging.error("type or name not found in route: %s", route) + return False try: if routeType == "plugin": importedFile = importlib.import_module(routeType + "." + routeName) loadedClass = importedFile.BoswatchPlugin(route.get("config")) - self._routerDict[routerName].addRoute(loadedClass._run) + routerDict_tmp[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) + routerDict_tmp[routerName].addRoute(loadedClass._run) elif routeType == "router": - self._routerDict[routerName].addRoute(self._routerDict[routeName].runRouter) + routerDict_tmp[routerName].addRoute(routerDict_tmp[routeName].runRouter) else: - logging.warning("unknown type: %s", routeType) + logging.error("unknown type '%s' in %s", routeType, route) + return False except ModuleNotFoundError: logging.error("%s not found: %s", route.get("type"), route.get("name")) + return False logging.debug("finished building routers") + self._routerDict = routerDict_tmp self._showRouterRoute() + return True def runRouter(self, routerList, bwPacket): if type(routerList) is str: # convert single string name to list diff --git a/config/server.yaml b/config/server.yaml index c4d9e6c..dfd8640 100644 --- a/config/server.yaml +++ b/config/server.yaml @@ -17,25 +17,22 @@ alarmRouter: - Test router: - -- name: Router 1 - route: - - type: module - name: template_module - config: - maxEntry: 30 - ignoreTime: 10 - checkMsg: no - - type: router - name: Router 2 - - type: plugin - name: template_plugin - config: - user: test - pass: test - db: test - -- name: Router 2 - route: - - type: module - name: template_module + - name: Router 1 + route: + - type: module + name: template_module + config: + maxEntry: 30 + ignoreTime: 10 + checkMsg: no + - type: router + name: Router 2 + - type: plugin + name: template_plugin + config: + user: test + pass: test + - name: Router 2 + route: + - type: module + name: template_module