some refactoring

This commit is contained in:
Bastian Schroll 2019-03-01 22:12:29 +01:00
parent 7f55be4823
commit f487bfc104
4 changed files with 42 additions and 36 deletions

View file

@ -23,17 +23,17 @@ logging.debug("- %s loaded", __name__)
class ConfigYAML: class ConfigYAML:
def __init__(self, config=None): def __init__(self, config=None):
self.__config = config self._config = config
def __iter__(self): def __iter__(self):
for item in self.__config: for item in self._config:
if type(item) is list or type(item) is dict: if type(item) is list or type(item) is dict:
yield ConfigYAML(item) yield ConfigYAML(item)
else: else:
yield item yield item
def __str__(self): def __str__(self):
return str(self.__config) return str(self._config)
def loadConfigFile(self, configPath): def loadConfigFile(self, configPath):
"""!loads a given configuration """!loads a given configuration
@ -44,14 +44,14 @@ class ConfigYAML:
try: try:
with open(configPath) as file: with open(configPath) as file:
# use safe_load instead load # use safe_load instead load
self.__config = yaml.safe_load(file) self._config = yaml.safe_load(file)
return True return True
except: # pragma: no cover except: # pragma: no cover
logging.exception("cannot load config file") logging.exception("cannot load config file")
return False return False
def get(self, *args, default=None): def get(self, *args, default=None):
tmp = self.__config tmp = self._config
try: try:
for arg in args: for arg in args:
tmp = tmp.get(arg, default) tmp = tmp.get(arg, default)

View file

@ -22,7 +22,7 @@ import time
logging.debug("- %s loaded", __name__) logging.debug("- %s loaded", __name__)
class ThreadedTCPRequestHandler(socketserver.ThreadingMixIn, socketserver.BaseRequestHandler): class _ThreadedTCPRequestHandler(socketserver.ThreadingMixIn, socketserver.BaseRequestHandler):
"""!ThreadedTCPRequestHandler class for our TCPServer class.""" """!ThreadedTCPRequestHandler class for our TCPServer class."""
def handle(self): def handle(self):
@ -60,7 +60,7 @@ class ThreadedTCPRequestHandler(socketserver.ThreadingMixIn, socketserver.BaseRe
logging.info("Client disconnected: %s", self.client_address[0]) logging.info("Client disconnected: %s", self.client_address[0])
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): class _ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
"""!ThreadedTCPServer class for our TCPServer class.""" """!ThreadedTCPServer class for our TCPServer class."""
pass pass
@ -98,7 +98,7 @@ class TCPServer:
@return True or False""" @return True or False"""
try: try:
if not self.isRunning: if not self.isRunning:
self._server = ThreadedTCPServer(("", port), ThreadedTCPRequestHandler) self._server = _ThreadedTCPServer(("", port), _ThreadedTCPRequestHandler)
self._server.timeout = self._timeout self._server.timeout = self._timeout
self._server.alarmQueue = self._alarmQueue self._server.alarmQueue = self._alarmQueue

View file

@ -24,56 +24,57 @@ logging.debug("- %s loaded", __name__)
class _Router: class _Router:
def __init__(self, name): def __init__(self, name):
self.__name = name self._name = name
self.__route = [] self._route = []
logging.debug("[%s] new router", self.__name) logging.debug("[%s] new router", self._name)
def addRoute(self, route): def addRoute(self, route):
logging.debug("[%s] add route: %s", self.__name, route) logging.debug("[%s] add route: %s", self._name, route)
self.__route.append(route) self._route.append(route)
def runRouter(self, bwPacket): def runRouter(self, bwPacket):
logging.debug("[%s] started", self.__name) logging.debug("[%s] started", self._name)
for routeCall in self.__route: for routeCall in self._route:
logging.debug("[%s] -> run route: %s", self.__name, routeCall) logging.debug("[%s] -> run route: %s", self._name, routeCall)
bwPacket_tmp = routeCall(copy.deepcopy(bwPacket)) # copy bwPacket to prevent edit the original bwPacket_tmp = routeCall(copy.deepcopy(bwPacket)) # copy bwPacket to prevent edit the original
if bwPacket_tmp is None: # returning None doesnt change the bwPacket if bwPacket_tmp is None: # returning None doesnt change the bwPacket
continue continue
if bwPacket_tmp is False: # returning False stops the router immediately if bwPacket_tmp is False: # returning False stops the router immediately
logging.debug("[%s] stopped", self.__name) logging.debug("[%s] stopped", self._name)
break break
bwPacket = bwPacket_tmp bwPacket = bwPacket_tmp
logging.debug("[%s] <- bwPacket returned: %s", self.__name, bwPacket) logging.debug("[%s] <- bwPacket returned: %s", self._name, bwPacket)
logging.debug("[%s] ended", self.__name) logging.debug("[%s] ended", self._name)
return bwPacket return bwPacket
@property @property
def name(self): def name(self):
return self.__name return self._name
@property @property
def route(self): def route(self):
return self.__route return self._route
class RouterManager: class RouterManager:
def __init__(self): def __init__(self):
self.__routerDict = {} self._routerDict = {}
def __del__(self): def __del__(self):
del self.__routerDict # destroy all routers (also destroys all instances of modules/plugins)
del self._routerDict
def buildRouter(self, config): def buildRouter(self, config):
self.__routerDict = {} # all routers and loaded modules/plugins would be unloaded self._routerDict = {} # all routers and instances of modules/plugins would be destroyed
logging.debug("build routers") logging.debug("build routers")
# first we have to init all routers # first we have to init all routers
# because a router can be a valid target and we need his reference # because a router can be a valid target and we need his reference
for router in config.get("router"): for router in config.get("router"):
self.__routerDict[router.get("name")] = _Router(router.get("name")) self._routerDict[router.get("name")] = _Router(router.get("name"))
for router in config.get("router"): for router in config.get("router"):
for route in router.get("route"): for route in router.get("route"):
@ -90,15 +91,15 @@ class RouterManager:
if routeType == "plugin": if routeType == "plugin":
importedFile = importlib.import_module(routeType + "." + routeName) importedFile = importlib.import_module(routeType + "." + routeName)
loadedClass = importedFile.BoswatchPlugin(route.get("config")) loadedClass = importedFile.BoswatchPlugin(route.get("config"))
self.__routerDict[routerName].addRoute(loadedClass._run) self._routerDict[routerName].addRoute(loadedClass._run)
elif routeType == "module": elif routeType == "module":
importedFile = importlib.import_module(routeType + "." + routeName) importedFile = importlib.import_module(routeType + "." + routeName)
loadedClass = importedFile.BoswatchModule(route.get("config")) loadedClass = importedFile.BoswatchModule(route.get("config"))
self.__routerDict[routerName].addRoute(loadedClass._run) self._routerDict[routerName].addRoute(loadedClass._run)
elif routeType == "router": elif routeType == "router":
self.__routerDict[routerName].addRoute(self.__routerDict[routeName].runRouter) self._routerDict[routerName].addRoute(self._routerDict[routeName].runRouter)
else: else:
logging.warning("unknown type: %s", routeType) logging.warning("unknown type: %s", routeType)
@ -110,12 +111,15 @@ class RouterManager:
self._showRouterRoute() self._showRouterRoute()
def runRouter(self, routerList, bwPacket): def runRouter(self, routerList, bwPacket):
for router in routerList: if type(routerList) is str: # convert single string name to list
if router in self.__routerDict: routerList = [routerList]
self.__routerDict[router].runRouter(bwPacket)
for routerName in routerList:
if routerName in self._routerDict:
self._routerDict[routerName].runRouter(bwPacket)
def _showRouterRoute(self): def _showRouterRoute(self):
for name, router in self.__routerDict.items(): for name, router in self._routerDict.items():
logging.debug("Route for %s", name) logging.debug("Route for %s", name)
for route in router.route: for routePoint in router.route:
logging.debug(" | %s", route) logging.debug(" | %s", routePoint)

View file

@ -5,7 +5,6 @@ from boswatch.configYaml import ConfigYAML
from boswatch.packet import Packet from boswatch.packet import Packet
from boswatch.router import RouterManager from boswatch.router import RouterManager
config = ConfigYAML() config = ConfigYAML()
config.loadConfigFile("config/server.yaml") config.loadConfigFile("config/server.yaml")
@ -20,6 +19,9 @@ routMan.buildRouter(config)
print() print()
routMan.runRouter(config.get("alarmRouter"), bwPack) routMan.runRouter(config.get("alarmRouter"), bwPack)
print()
routMan.runRouter("Router 2", bwPack)
print() print()
exit() exit()