From d800674e06ddd02c21b55fdcc357a1e5a84756a6 Mon Sep 17 00:00:00 2001 From: Benjamin Braatz Date: Wed, 30 Jun 2021 03:18:05 +0200 Subject: [PATCH] Reload configuration on change. --- controlpi/__main__.py | 32 ++++++++++++++++++++++++++++++-- setup.py | 1 + 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/controlpi/__main__.py b/controlpi/__main__.py index 046820e..848e9b2 100644 --- a/controlpi/__main__.py +++ b/controlpi/__main__.py @@ -6,17 +6,23 @@ started by: """ import signal import sys +import os import json import asyncio +import pyinotify # type: ignore from controlpi import run, PluginConf from typing import Dict +restart = True + async def shutdown(sig: signal.Signals) -> None: """Shutdown the system in reaction to a signal.""" + global restart print(f"Shutting down on signal {sig.name}.") + restart = False for task in asyncio.all_tasks(): if task is not asyncio.current_task(): task.cancel() @@ -45,11 +51,33 @@ def read_configuration() -> Dict[str, PluginConf]: return conf +class ConfigChangeHandler(pyinotify.ProcessEvent): + def process_IN_MODIFY(self, event): + print("Configuration file modified.") + for task in asyncio.all_tasks(): + if task is not asyncio.current_task(): + task.cancel() + + +async def add_config_change_handler() -> pyinotify.AsyncioNotifier: + wm = pyinotify.WatchManager() + loop = asyncio.get_running_loop() + notifier = pyinotify.AsyncioNotifier(wm, loop, + default_proc_fun=ConfigChangeHandler()) + wm.add_watch(os.path.dirname(sys.argv[1]), pyinotify.ALL_EVENTS) + wm.add_watch(sys.argv[1], pyinotify.ALL_EVENTS) + return notifier + + async def main() -> None: """Set up signal handlers, read configuration file and run system.""" + global restart await add_signal_handlers() - conf = read_configuration() - await run(conf) + notifier = await add_config_change_handler() + while restart: + conf = read_configuration() + await run(conf) + notifier.stop() if __name__ == '__main__': asyncio.run(main()) diff --git a/setup.py b/setup.py index 08f106f..60fa604 100644 --- a/setup.py +++ b/setup.py @@ -17,6 +17,7 @@ setuptools.setup( zip_safe=False, install_requires=[ "jsonschema", + "pyinotify", ], extras_require={ "dev": [ -- 2.34.1