72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
|
#!/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))
|