implement new router system in server

This commit is contained in:
Bastian Schroll 2019-03-02 09:17:20 +01:00
parent 3fa10911c9
commit 39d88f3e3d
4 changed files with 53 additions and 32 deletions

View file

@ -67,7 +67,7 @@ class TCPClient:
return True
except AttributeError:
logging.error("cannot disconnect - no connection established")
return False
return False
def transmit(self, data):
"""!Send a data packet to the server

View file

@ -18,25 +18,40 @@
import logging
import copy
import importlib
from boswatch.configYaml import ConfigYAML
logging.debug("- %s loaded", __name__)
class _Route:
def __init__(self, name, callback):
self._name = name
self._callback = callback
@property
def name(self):
return self._name
@property
def callback(self):
return self._callback
class _Router:
def __init__(self, name):
self._name = name
self._route = []
self._routeList = []
logging.debug("[%s] new router", self._name)
def addRoute(self, route):
logging.debug("[%s] add route: %s", self._name, route)
self._route.append(route)
logging.debug("[%s] add route: %s", self._name, route.name)
self._routeList.append(route)
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
for routeObject in self._routeList:
logging.debug("[%s] -> run route: %s", self._name, routeObject)
bwPacket_tmp = routeObject.callback(copy.deepcopy(bwPacket)) # copy bwPacket to prevent edit the original
if bwPacket_tmp is None: # returning None doesnt change the bwPacket
continue
@ -55,8 +70,8 @@ class _Router:
return self._name
@property
def route(self):
return self._route
def routeList(self):
return self._routeList
class RouterManager:
@ -67,7 +82,8 @@ class RouterManager:
# destroy all routers (also destroys all instances of modules/plugins)
del self._routerDict
def buildRouter(self, config): # todo validation
# if there is an error, router list would be empty (see tmp variable)
def buildRouter(self, config):
self._routerDict = {} # all routers and instances of modules/plugins would be destroyed
routerDict_tmp = {}
logging.debug("build routers")
@ -75,21 +91,21 @@ class RouterManager:
# 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"):
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
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
routerName = router.get("name")
for route in router.get("route"):
routerName = router.get("name")
routeType = route.get("type")
routeName = route.get("name")
routeConfig = route.get("Config", default=ConfigYAML()) # if no config - build a empty
if routeType is None or routeName is None:
logging.error("type or name not found in route: %s", route)
@ -98,16 +114,16 @@ class RouterManager:
try:
if routeType == "plugin":
importedFile = importlib.import_module(routeType + "." + routeName)
loadedClass = importedFile.BoswatchPlugin(route.get("config"))
routerDict_tmp[routerName].addRoute(loadedClass._run)
loadedClass = importedFile.BoswatchPlugin(routeConfig)
routerDict_tmp[routerName].addRoute(_Route(routeName, loadedClass._run))
elif routeType == "module":
importedFile = importlib.import_module(routeType + "." + routeName)
loadedClass = importedFile.BoswatchModule(route.get("config"))
routerDict_tmp[routerName].addRoute(loadedClass._run)
loadedClass = importedFile.BoswatchModule(routeConfig)
routerDict_tmp[routerName].addRoute(_Route(routeName, loadedClass._run))
elif routeType == "router":
routerDict_tmp[routerName].addRoute(routerDict_tmp[routeName].runRouter)
routerDict_tmp[routerName].addRoute(_Route(routeName, routerDict_tmp[routeName].runRouter))
else:
logging.error("unknown type '%s' in %s", routeType, route)
@ -122,16 +138,18 @@ class RouterManager:
self._showRouterRoute()
return True
def runRouter(self, routerList, bwPacket):
if type(routerList) is str: # convert single string name to list
routerList = [routerList]
def runRouter(self, routerRunList, bwPacket):
if type(routerRunList) is str: # convert single string name to list
routerRunList = [routerRunList]
for routerName in routerList:
for routerName in routerRunList:
if routerName in self._routerDict:
self._routerDict[routerName].runRouter(bwPacket)
def _showRouterRoute(self):
for name, router in self._routerDict.items():
for name, routerObject in self._routerDict.items():
logging.debug("Route for %s", name)
for routePoint in router.route:
logging.debug(" | %s", routePoint)
counter = 0
for routePoint in routerObject.routeList:
counter += 1
logging.debug(" %d. %s", counter, routePoint.name)

View file

@ -56,7 +56,6 @@ except: # pragma: no cover
try:
header.logoToLog()
header.infoToLog()
header.logoToScreen()
logging.debug("parse args")
# With -h or --help you get the Args help
@ -102,7 +101,7 @@ try:
if bwPacket:
bwPacket.printInfo()
bwPacket.addClientData()
bwPacket.addClientData(bwConfig)
bwClient.transmit(str(bwPacket))
# todo should we do this in an thread, to not block receiving ??? but then we should use transmit() and receive() with Lock()

View file

@ -52,6 +52,7 @@ try:
from boswatch.packet import Packet
from boswatch.utils import header
from boswatch.network.broadcast import BroadcastServer
from boswatch.router import RouterManager
except: # pragma: no cover
logging.exception("cannot import module")
exit(1)
@ -59,7 +60,6 @@ except: # pragma: no cover
try:
header.logoToLog()
header.infoToLog()
header.logoToScreen()
logging.debug("parse args")
# With -h or --help you get the Args help
@ -80,7 +80,10 @@ except: # pragma: no cover
logging.exception("error occurred")
exit(1)
import router_test
bwRoutMan = RouterManager()
bwRoutMan.buildRouter(bwConfig)
# ############################# begin server system
try:
@ -105,9 +108,10 @@ try:
bwPacket = Packet((data[1]))
bwPacket.set("clientIP", data[0])
bwPacket.addServerData()
bwPacket.addServerData(bwConfig)
# todo implement routing
bwRoutMan.runRouter(bwConfig.get("alarmRouter"), bwPacket)
incomingQueue.task_done()