diff --git a/inotify-pictures.py b/inotify-pictures.py new file mode 100755 index 0000000..510dae3 --- /dev/null +++ b/inotify-pictures.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 + +#################### +# Inspiration / Further Reading +#################### +# https://github.com/chrisjbillington/inotify_simple +# https://stackoverflow.com/questions/16148735/how-to-implement-a-watchdog-timer-in-python + +#################### +# Dependencies +#################### +# apt install python3 python3-pip python3-dbus +# pip3 install inotify_simple + +from inotify_simple import INotify, flags +import os +from threading import Timer + +#################### +# Simple watchdog timer class +#################### +class Watchdog: + def __init__(self, timeout, userHandler=None): # timeout in seconds + self.timeout = timeout + self.handler = userHandler if userHandler is not None else self.defaultHandler + self.timer = Timer(self.timeout, self.handler) + # Do NOT start timer by default ; we want this triggered by reset events that come through + # via the inotify filesystem watcher + #self.timer.start() + + def reset(self): + self.timer.cancel() + self.timer = Timer(self.timeout, self.handler) + self.timer.start() + + def stop(self): + self.timer.cancel() + + def defaultHandler(self): + raise self + +#################### +# Setup inotify on folder(s) +#################### +inotify = INotify() +watch_flags = flags.CREATE | flags.DELETE +wd = inotify.add_watch('/tank/pictures', watch_flags) + +#################### +# Restart fim slideshow once inotify storm is over (3s timeout) +#################### +def inotify_handler(): + print('restarting fim slideshow') + import dbus + sysbus = dbus.SystemBus() + systemd1 = sysbus.get_object('org.freedesktop.systemd1', '/org/freedesktop/systemd1') + manager = dbus.Interface(systemd1, 'org.freedesktop.systemd1.Manager') + job = manager.RestartUnit('fim.service', 'fail') + +#################### +# Watch for inotify events in an infinate loop +# This will BLOCK waiting for events within inotify.read(None) +# This makes it pretty safe for an infinate loop scenario +#################### +watchdog = Watchdog(3.0, inotify_handler) +while True: + for event in inotify.read(None): + print(event) + watchdog.reset() + for flag in flags.from_mask(event.mask): + print(' ' + str(flag))