mirror of
https://github.com/BOSWatch/BW3-Core.git
synced 2026-01-10 18:49:59 +01:00
add pluginmanager class
This commit is contained in:
parent
aa5698471f
commit
c2a09ad7c3
111
boswatch/plugin/pluginManager.py
Normal file
111
boswatch/plugin/pluginManager.py
Normal file
|
|
@ -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"])
|
||||
Loading…
Reference in a new issue