From e7b340f1a05c4ef9a28a427d34ff12f14113c95c Mon Sep 17 00:00:00 2001 From: Alexander Schmidt Date: Mon, 19 Oct 2020 14:13:16 +0200 Subject: [PATCH] continue with daemon implementation --- src/bunch.py | 11 ++++++++--- src/dirtrigger.py | 43 ++++++++++++++++++++++++++++++++++++++--- src/photosort-daemon.py | 3 +++ 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/bunch.py b/src/bunch.py index 713a618..b61ffce 100644 --- a/src/bunch.py +++ b/src/bunch.py @@ -37,8 +37,12 @@ class Bunch: self._worker_thread.join() logging.info("Stopped bunch %s.", self._id) + def is_running(self): + return self._worker_thread.is_alive() + def _worker(self): - # start triggers + for source in self._sources: + source.trigger.start() while not self._stop: for source in self._sources: @@ -46,7 +50,7 @@ class Bunch: if source.trigger.is_triggering(): logging.info("Got source trigger for bunch %s.", self._id) source.trigger.reset() - source.migrator.migrate() + source.migrator.migrate(source.cleanup) if source.cleanup: source.migrator.cleanup() except Exception as e: @@ -54,4 +58,5 @@ class Bunch: self._id, str(e)) time.sleep(10.0) - # stop triggers + for source in self._sources: + source.trigger.stop() diff --git a/src/dirtrigger.py b/src/dirtrigger.py index f8f67cf..7978df3 100644 --- a/src/dirtrigger.py +++ b/src/dirtrigger.py @@ -1,6 +1,43 @@ -class DirTrigger: +import threading +import time +from watchdog.events import FileSystemEventHandler +from watchdog.observers import Observer + +class DirTrigger(FileSystemEventHandler): + COOL_TIME = 10 + MAX_TIME = 86400 + def __init__(self, dir_path): - pass + self._got_event = False + self._last_event_time = 0.0 + self._last_reset_time = 0.0 + self._lock = threading.Lock() + self._observer = Observer() + self._observer.schedule(self, path=dir_path, recursive=True) + + def start(self): + self._observer.start() + + def stop(self): + self._observer.stop() def is_triggering(self): - return False + self._lock.acquire() + try: + return ( self._got_event and + (time.time() - self._last_event_time > DirTrigger.COOL_TIME) ) or \ + time.time() - self._last_reset_time > DirTrigger.MAX_TIME + finally: + self._lock.release() + + def reset(self): + self._got_event = False + self._last_reset_time = time.time() + + def on_any_event(self, event): + self._lock.acquire() + try: + self._got_event = True + self._last_event_time = time.time() + finally: + self._lock.release() diff --git a/src/photosort-daemon.py b/src/photosort-daemon.py index 9bb7213..cdd652d 100755 --- a/src/photosort-daemon.py +++ b/src/photosort-daemon.py @@ -42,6 +42,9 @@ for bunch in bunches: bunch.start() while not stop: + for bunch in bunches: + if not bunch.is_running(): + stop = True time.sleep(2.0) for bunch in bunches: -- 2.39.5