BW3-Core/boswatch/router.py

122 lines
4.3 KiB
Python
Raw Normal View History

2019-03-01 20:41:13 +01:00
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""!
____ ____ ______ __ __ __ _____
/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ /
/ __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ <
/ /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ /
/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/
German BOS Information Script
by Bastian Schroll
@file: router.py
@date: 01.03.2019
@author: Bastian Schroll
@description: Class for the BOSWatch packet router
"""
2019-03-01 21:36:38 +01:00
# todo think about implement threading for routers and the plugin calls (THREAD SAFETY!!!)
2019-03-01 20:41:13 +01:00
import logging
import copy
import importlib
logging.debug("- %s loaded", __name__)
class _Router:
2019-02-26 13:33:35 +01:00
def __init__(self, name):
self.__name = name
2019-03-01 20:41:13 +01:00
self.__route = []
2019-03-01 21:36:38 +01:00
logging.debug("[%s] new router", self.__name)
2019-02-26 13:33:35 +01:00
2019-03-01 20:41:13 +01:00
def addRoute(self, route):
logging.debug("[%s] add route: %s", self.__name, route)
self.__route.append(route)
2019-02-26 13:33:35 +01:00
2019-03-01 20:41:13 +01:00
def runRouter(self, bwPacket):
logging.debug("[%s] started", self.__name)
for routeCall in self.__route:
logging.debug("[%s] -> run route: %s", self.__name, routeCall)
bwPacket_tmp = routeCall(copy.deepcopy(bwPacket)) # copy bwPacket to prevent edit the original
2019-02-26 13:33:35 +01:00
2019-03-01 20:41:13 +01:00
if bwPacket_tmp is None: # returning None doesnt change the bwPacket
continue
if bwPacket_tmp is False: # returning False stops the router immediately
logging.debug("[%s] stopped", self.__name)
break
2019-02-26 13:33:35 +01:00
2019-03-01 20:41:13 +01:00
bwPacket = bwPacket_tmp
logging.debug("[%s] <- bwPacket returned: %s", self.__name, bwPacket)
logging.debug("[%s] ended", self.__name)
return bwPacket
@property
def name(self):
return self.__name
@property
def route(self):
return self.__route
class RouterManager:
def __init__(self):
self.__routerDict = {}
def __del__(self):
del self.__routerDict
2019-03-01 21:36:38 +01:00
2019-03-01 20:41:13 +01:00
def buildRouter(self, config):
self.__routerDict = {} # all routers and loaded modules/plugins would be unloaded
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"))
2019-03-01 21:36:38 +01:00
2019-03-01 20:41:13 +01:00
for router in config.get("router"):
for route in router.get("route"):
2019-03-01 21:36:38 +01:00
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()
2019-03-01 20:41:13 +01:00
def runRouter(self, routerList, bwPacket):
for router in routerList:
if router in self.__routerDict:
self.__routerDict[router].runRouter(bwPacket)
2019-03-01 21:36:38 +01:00
def _showRouterRoute(self):
2019-03-01 20:41:13 +01:00
for name, router in self.__routerDict.items():
logging.debug("Route for %s", name)
for route in router.route:
2019-03-01 21:36:38 +01:00
logging.debug(" | %s", route)