From c2a09ad7c374a921248bb1551ad8aed9bdfbc129 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Sun, 14 Jan 2018 22:57:30 +0100 Subject: [PATCH] add pluginmanager class --- boswatch/plugin/pluginManager.py | 111 +++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 boswatch/plugin/pluginManager.py diff --git a/boswatch/plugin/pluginManager.py b/boswatch/plugin/pluginManager.py new file mode 100644 index 0000000..a64cda3 --- /dev/null +++ b/boswatch/plugin/pluginManager.py @@ -0,0 +1,111 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +"""! + ____ ____ ______ __ __ __ _____ + / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / + / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ < + / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / +/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/ + German BOS Information Script + by Bastian Schroll + +@file: pluginManager.py +@date: 08.01.2018 +@author: Bastian Schroll +@description: Plugin manager class to load and call the plugins +@todo must be mostly refactored +""" +import logging +import os +import time +import importlib + +from boswatch.config import Config +from boswatch.utils import paths + +logging.debug("- %s loaded", __name__) + + +class PluginManager: + """!Plugin manager class to load, manage and call the plugins + + @todo refactor the class and add documentation""" + + def __init__(self): + """!init comment""" + self._config = Config() + self._pluginList = [] + + def getPluginList(self): + logging.debug("search for plugins in: %s", paths.PLUGIN_PATH) + for name in os.listdir(paths.PLUGIN_PATH): + location = os.path.join(paths.PLUGIN_PATH, name) + + # Skip if Path.isdir() or no File DIR_NAME.py is found + if not os.path.isdir(location) or not name + ".py" in os.listdir(location): + continue + + pluginPriority = self._config.getInt("Plugins", name, "serverConfig") + + if pluginPriority is None: + logging.warning("no entry in server config for plugin: %s", name) + continue + elif pluginPriority > 0: + self._pluginList.append({"pluginName": name, "pluginPriority": pluginPriority}) + logging.debug("[ENABLED ] %s [%3d]", name, pluginPriority) + elif pluginPriority <= 0: + logging.debug("[DISABLED] %s ", name) + + # sort pluginList on pluginPriority descending (High to Low) + self._pluginList.sort(key=lambda x: x['pluginPriority'], reverse=True) + + def importAllPlugins(self): + logging.debug("importing all plugins") + for item in self._pluginList: + importPlugin = self._importPlugin(item["pluginName"]) + if importPlugin: + item["pluginImport"] = importPlugin + + @staticmethod + def _importPlugin(pluginName): + logging.debug("import plugin: %s", pluginName) + try: + return importlib.import_module("plugins." + pluginName + "." + pluginName) + except: + logging.exception("error while loading plugin: %s", pluginName) + return False + + def loadAllPlugins(self): + logging.debug("loading all plugins") + for item in self._pluginList: + item["pluginObject"] = None # todo del or none ??? + item["pluginObject"] = item["pluginImport"].BoswatchPlugin() + + def runAllPlugins(self, bwPacket): + logging.info("ALARM - %0.3f sec. since radio reception", time.time() - bwPacket.get("timestamp")) + for item in self._pluginList: + item["pluginObject"]._run(bwPacket) + item["pluginStatistics"] = item["pluginObject"]._getStatistics() + self.printEndStats() + + def unloadAllPlugins(self): + logging.debug("unload all plugins") + for item in self._pluginList: + # todo del or None ??? + del item["pluginObject"] # delete plugin object to force __del__() running + + def printEndStats(self): + logging.debug("Plugin run statistics:") + logging.debug("Plugin | runs | tRUN | tCUM | tSET | tALA | tTRD | eSET | eALA | eTRD") + for item in self._pluginList: + logging.debug("- %-12s | %4d | %0.2f | %6.1f | %0.2f | %0.2f | %0.2f | %4d | %4d | %4d", + item["pluginName"], + item["pluginStatistics"]["runCount"], + item["pluginStatistics"]["sumTime"], + item["pluginStatistics"]["cumTime"], + item["pluginStatistics"]["setupTime"], + item["pluginStatistics"]["alarmTime"], + item["pluginStatistics"]["teardownTime"], + item["pluginStatistics"]["setupErrorCount"], + item["pluginStatistics"]["alarmErrorCount"], + item["pluginStatistics"]["teardownErrorCount"])