diff --git a/debian/changelog b/debian/changelog index fc18af4136e9c3832fe2187661db0af12bdc1548..2d3a7c8b8ca0aba3f118d4b483ff452d1f46c74f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +tempermonitor (2.0.4) buster; urgency=medium + + * improve plugin handling + + -- Michael Loipführer <ml@stusta.de> Thu, 23 Apr 2020 23:30:18 +0200 + tempermonitor (2.0.3) buster; urgency=medium * rename config file diff --git a/setup.py b/setup.py index 04c8983496d7545efba9823fb6a2565a54386138..54ee0b1e4ff244705fb08255365bcbbc0d689371 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import setup -VERSION = '2.0.3' +VERSION = '2.0.4' def readme(): diff --git a/tempermonitor/plugins/__init__.py b/tempermonitor/plugins/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..33f92ab1c5131d275e6308dbca35d2d6c644c049 100644 --- a/tempermonitor/plugins/__init__.py +++ b/tempermonitor/plugins/__init__.py @@ -0,0 +1,27 @@ +from abc import ABCMeta + +PLUGINS = dict() + + +class PluginMeta(ABCMeta): + """ + Metaclass for available container backends. + """ + def __init__(cls, name, bases, classdict): + super().__init__(name, bases, classdict) + PLUGINS[cls.plugin_name()] = cls + + +class Plugin(metaclass=PluginMeta): + + @classmethod + def plugin_name(cls): + return cls.__name__.lower() + + @property + def name(self): + return self.__class__.__name__.lower() + + +# import all plugins so metaclass can populare PLUGINS dict +from . import collectd, mail, prometheus, warnings diff --git a/tempermonitor/plugins/collectd.py b/tempermonitor/plugins/collectd.py index 349ab00573ff44ac7769e1d4988fb5db5e8ed942..d050634108329438ec6014bdad859bcbc9dc8df3 100644 --- a/tempermonitor/plugins/collectd.py +++ b/tempermonitor/plugins/collectd.py @@ -1,12 +1,10 @@ import asyncio import time +from . import Plugin -def init(monitor): - return PluginCollectd(monitor) - -class PluginCollectd: +class Collectd(Plugin): """ Implements a super simple collectd interface for only sending temperature data """ diff --git a/tempermonitor/plugins/mail.py b/tempermonitor/plugins/mail.py index f856488bd3233dd0197e83fda670056ed5c5adbd..d10205ca52f9cdf30410e9d1cdb4a404b2769a64 100644 --- a/tempermonitor/plugins/mail.py +++ b/tempermonitor/plugins/mail.py @@ -3,6 +3,8 @@ from email.mime.text import MIMEText from email.utils import formatdate import smtplib +from . import Plugin + UNKNOWN_SENSOR_SUBJECT = "WARNING: Unconfigured Sensor ID: {owid}" UNKNOWN_SENSOR_BODY = """Hello Guys, @@ -89,14 +91,7 @@ with love, Temperator""" -def init(monitor): - """ - Plugin initialization method to be called from the outside - """ - return PluginMail(monitor) - - -class PluginMail: +class Mail(Plugin): """ Handle all the mail sending stuff """ diff --git a/tempermonitor/plugins/prometheus.py b/tempermonitor/plugins/prometheus.py index 2edd460fe25d9c4aefffa584cf24d93b514a3b1b..a06c043d7abac27c502de4120200ad573284fb8f 100644 --- a/tempermonitor/plugins/prometheus.py +++ b/tempermonitor/plugins/prometheus.py @@ -1,13 +1,10 @@ import asyncio - from prometheus_client import start_http_server, Gauge - -def init(monitor): - return PluginPrometheus(monitor) +from . import Plugin -class PluginPrometheus: +class Prometheus(Plugin): def __init__(self, monitor): self.loop = asyncio.get_event_loop() self.config = monitor.config diff --git a/tempermonitor/plugins/warnings.py b/tempermonitor/plugins/warnings.py index 591912bfaf96b70e9e5e34f6fdc7cbeb8dfc9be6..6818afb6b7e181dd6b1af2361eda48daa5d45396 100644 --- a/tempermonitor/plugins/warnings.py +++ b/tempermonitor/plugins/warnings.py @@ -1,12 +1,9 @@ import time +from . import Plugin -def init(monitor): - """ Plugin interface method """ - return PluginWarning(monitor) - -class PluginWarning: +class Warnings(Plugin): """ Generate all kind of warnings whenever needed and observe the sensor if they see a problematic situation in the container diff --git a/tempermonitor/tempermonitor.py b/tempermonitor/tempermonitor.py index e6dac07347b1f4b863216a6706694a2754935a64..882859a28fca67797eee9cd2b35e97dc6ab9a5f9 100755 --- a/tempermonitor/tempermonitor.py +++ b/tempermonitor/tempermonitor.py @@ -27,6 +27,8 @@ from pathlib import Path import serial_asyncio import serial +from tempermonitor.plugins import PLUGINS + class Sensor: """ @@ -254,14 +256,6 @@ class TempMonitor: self._last_store = time.time() -def setup_plugin(filename, plugin): - """ - Setup and fix plugins - """ - if not getattr(plugin, "name", None): - plugin.name = filename - - def main(): """ Start the tempmonitor @@ -272,23 +266,17 @@ def main(): if len(sys.argv) == 2: configfile = sys.argv[1] - print("Configuring temperature monitoring system from {}.".format(configfile)) + print(f"Configuring temperature monitoring system from {configfile}.") monitor = TempMonitor(loop, configfile) - plugin_path = Path(__file__).resolve().parent / "plugins" - print("Loading plugins from {}".format(plugin_path)) active_plugins = monitor.config["general"]["plugins"].split(",") print(f"Active plugins: {active_plugins}") - for filename in plugin_path.glob("*.py"): - if (plugin_path / filename).exists() and filename.stem in active_plugins: - print("loading {}".format(filename.name)) - modname = "plugins." + filename.name.split('.')[0] - module = importlib.import_module(modname) - plugin = module.init(monitor) - setup_plugin(filename, plugin) - monitor.plugins.append(plugin) - print("Loaded: {}".format(plugin.name)) + for plugin in active_plugins: + if plugin in PLUGINS: + p = PLUGINS[plugin](monitor) + monitor.plugins.append(p) + print(f"Loaded plugin: {plugin}") try: loop.run_forever()