"""
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()
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())