]> git.graph-it.com Git - graphit/controlpi.git/commitdiff
Feature #9438: Replace pyinotify with asyncinotify master v0.4.0
authorBenjamin Braatz <bb@bbraatz.eu>
Mon, 9 Mar 2026 16:04:45 +0000 (17:04 +0100)
committerBenjamin Braatz <bb@bbraatz.eu>
Mon, 9 Mar 2026 17:13:06 +0000 (18:13 +0100)
controlpi/__init__.py
controlpi/__main__.py
setup.py

index 970e130fde820c7fb80fbf21de56e5b134ef283c..155beccf6ab94498fa7bd90c0d120aba3d3ae3be 100644 (file)
@@ -90,10 +90,7 @@ async def run(conf: Dict[str, PluginConf]) -> None:
     """
     message_bus = MessageBus()
     coroutines = _process_conf(message_bus, conf)
     """
     message_bus = MessageBus()
     coroutines = _process_conf(message_bus, conf)
-    try:
-        await asyncio.gather(*coroutines)
-    except asyncio.CancelledError:
-        pass
+    await asyncio.gather(*coroutines)
 
 
 async def test(
 
 
 async def test(
index 7f0b7f592603cde6208bc2a2fd68bd7846fc531c..ef02d61ca661b43b37348be40c56641c87fffbe9 100644 (file)
@@ -7,12 +7,11 @@ started by:
 
 import signal
 import sys
 
 import signal
 import sys
-import os
 import json
 import asyncio
 import json
 import asyncio
-import pyinotify
+import asyncinotify
 
 
-from controlpi import run, PluginConf
+import controlpi
 
 from typing import Dict
 
 
 from typing import Dict
 
@@ -22,6 +21,8 @@ async def shutdown(sig: signal.Signals) -> None:
     print(f"Shutting down on signal {sig.name}.")
     for task in asyncio.all_tasks():
         task.cancel()
     print(f"Shutting down on signal {sig.name}.")
     for task in asyncio.all_tasks():
         task.cancel()
+    global restart
+    restart = False
 
 
 async def add_signal_handlers() -> None:
 
 
 async def add_signal_handlers() -> None:
@@ -31,7 +32,7 @@ async def add_signal_handlers() -> None:
         loop.add_signal_handler(sig, lambda s=sig: asyncio.create_task(shutdown(s)))
 
 
         loop.add_signal_handler(sig, lambda s=sig: asyncio.create_task(shutdown(s)))
 
 
-def read_configuration() -> Dict[str, PluginConf]:
+def read_configuration() -> Dict[str, controlpi.PluginConf]:
     """Read configuration from JSON file."""
     conf = {}
     try:
     """Read configuration from JSON file."""
     conf = {}
     try:
@@ -46,34 +47,28 @@ def read_configuration() -> Dict[str, PluginConf]:
     return conf
 
 
     return conf
 
 
-class ConfigHandler(pyinotify.ProcessEvent):
-    """Handler for changes of the configuration file on disk."""
-
-    def process_IN_MODIFY(self, event):
-        """Cancel all tasks if configuration file changed."""
-        if event.pathname == os.path.abspath(sys.argv[1]):
-            print(f"Configuration file modified: {event.pathname}")
+async def watch_config() -> None:
+    """Watch the configuration file for modifications."""
+    with asyncinotify.Inotify() as inotify:
+        inotify.add_watch(sys.argv[1], asyncinotify.Mask.MODIFY)
+        async for event in inotify:
+            print("Configuration file modified.")
             for task in asyncio.all_tasks():
                 task.cancel()
 
 
             for task in asyncio.all_tasks():
                 task.cancel()
 
 
-async def add_config_change_handler() -> pyinotify.AsyncioNotifier:
-    """Add handler for configuration file."""
-    wm = pyinotify.WatchManager()
-    loop = asyncio.get_running_loop()
-    notifier = pyinotify.AsyncioNotifier(wm, loop, default_proc_fun=ConfigHandler())
-    wm.add_watch(os.path.dirname(sys.argv[1]), pyinotify.ALL_EVENTS)
-    return notifier
-
-
 async def main() -> None:
     """Set up signal handlers, read configuration file and run system."""
     await add_signal_handlers()
 async def main() -> None:
     """Set up signal handlers, read configuration file and run system."""
     await add_signal_handlers()
-    notifier = await add_config_change_handler()
     conf = read_configuration()
     conf = read_configuration()
-    await run(conf)
-    notifier.stop()
+    await asyncio.gather(controlpi.run(conf), watch_config())
 
 
 if __name__ == "__main__":
 
 
 if __name__ == "__main__":
-    asyncio.run(main())
+    global restart
+    restart = True
+    while restart:
+        try:
+            asyncio.run(main())
+        except asyncio.exceptions.CancelledError:
+            pass
index 47bed5dc766a6689b23a99086481da63da678bce..abd0834c1afd51df8e1b505c5dbc2d5ce846a886 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -5,7 +5,7 @@ with open("README.md", "r") as readme_file:
 
 setuptools.setup(
     name="controlpi",
 
 setuptools.setup(
     name="controlpi",
-    version="0.3.0",
+    version="0.4.0",
     author="Graph-IT GmbH",
     author_email="info@graph-it.com",
     description="Control-Pi Infrastructure",
     author="Graph-IT GmbH",
     author_email="info@graph-it.com",
     description="Control-Pi Infrastructure",
@@ -17,7 +17,7 @@ setuptools.setup(
     zip_safe=False,
     install_requires=[
         "fastjsonschema",
     zip_safe=False,
     install_requires=[
         "fastjsonschema",
-        "pyinotify",
+        "asyncinotify",
     ],
     classifiers=[
         "Programming Language :: Python",
     ],
     classifiers=[
         "Programming Language :: Python",