====== Indexation avec lib-inotify ======
Le kernel linux utilisé par synology supporte inotify, mais les utilisatires shell libinotify ne sont pas installés, et il s'avèrent difficile à installer, pour cette raison, nous utiliserons l'interface python [[https://pypi.python.org/pypi/pyinotify|pyinotify]].
====pyinotify====
Extrait de [[https://github.com/carljm/synology-mediamon|https://github.com/carljm/synology-mediamon]]
*Install Python from the DiskStation package manager.
*SSH into your DiskStation as root (e.g. ''%%ssh root@192.168.1.20%%'' -- use the right IP address for your DiskStation) and install pyinotify:
cd /root/
wget https://pypi.python.org/packages/source/p/pyinotify/pyinotify-0.9.4.tar.gz
tar -xzvf pyinotify-0.9.4.tar.gz
cd pyinotify-0.9.4/
python setup.py install
* Copy ''%%mediamon.py%%'' to the DiskStation's ''%%/root/%%'' directory (''%%scp mediamon.py root@192.168.1.20:/root/%%'').
* Copy ''%%S99mediamon.sh%%'' to the DiskStation's ''%%/usr/syno/etc/rc.d/%%'' directory (''%%scp S99mediamon.sh root@192.168.1.20:/usr/syno/etc/rc.d/%%'').
*SSH into the DiskStation again and run ''%%chmod 755 /usr/syno/etc/rc.d/S99mediamon.sh%%'', then ''%%/usr/syno/etc/rc.d/S99mediamon.sh start%%'' to start up the monitor.
*Add some media files to ''%%/volume1/photo%%'', ''%%/volume1/music%%'', or ''%%/volume1/video%%'', and check the log at ''%%/var/log/mediamon.log%%'' to verify that it's working. You should see a ''%%synoindex -a%%'' entry for each added file.
===mediamon.py===
# /root/mediamon.py
from datetime import datetime
import os.path
import sys
from subprocess import call
import signal
import pyinotify
log_file = open("/var/log/mediamon.log", "a")
def log(text):
dt = datetime.utcnow().isoformat()
log_file.write(dt + ' - ' + text + "\n")
log_file.flush()
def signal_handler(signal, frame):
log("Exiting")
sys.exit(0)
log("Starting")
signal.signal(signal.SIGTERM, signal_handler)
watched_paths = [["/volume1/music",|"/volume1/photo", "/volume1/video"]]
allowed_exts = {
"jpg",
"jpeg",
"png",
"tga",
"gif",
"bmp",
"mp3",
"flac",
"aac",
"wma",
"ogg",
"ogv",
"mp4",
"avi",
"m4v",
}
wm = pyinotify.WatchManager()
mask = (
pyinotify.IN_MODIFY |
pyinotify.IN_CLOSE_WRITE |
pyinotify.IN_DELETE |
pyinotify.IN_CREATE |
pyinotify.IN_MOVED_TO |
pyinotify.IN_MOVED_FROM
)
class EventHandler(pyinotify.ProcessEvent):
def __init__(self):
self.modified_files = set()
def process_IN_CREATE(self, event):
self.process_create(event)
def process_IN_MOVED_TO(self, event):
self.process_create(event)
def process_IN_MOVED_FROM(self, event):
self.process_delete(event)
def process_IN_DELETE(self, event):
self.process_delete(event)
def process_create(self, event):
arg = //
if event.dir:
arg = "-A"
else:
arg = "-a"
self.do_index_command(event, arg)
def process_delete(self, event):
arg = //
if event.dir:
arg = "-D"
else:
arg = "-d"
self.do_index_command(event, arg)
def process_IN_MODIFY(self, event):
if self.is_allowed_path(event.pathname, event.dir):
self.modified_files.add(event.pathname)
def process_IN_CLOSE_WRITE(self, event):
# ignore close_write unlesss the file has previously been modified.
if (event.pathname in self.modified_files):
self.do_index_command(event, "-a")
def do_index_command(self, event, index_argument):
if self.is_allowed_path(event.pathname, event.dir):
log("synoindex %s %s" % (index_argument, event.pathname))
call([["synoindex",|index_argument, event.pathname]])
self.modified_files.discard(event.pathname)
else:
log("%s is not an allowed path" % event.pathname)
def is_allowed_path(self, filename, is_dir):
# Don't check the extension for directories
if not is_dir:
ext = os.path.splitext(filename)[[1]][1:].lower()
if ext not in allowed_exts:
return False
if filename.find("@eaDir") > 0:
return False
return True
handler = EventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch(
watched_paths,
mask,
rec=True,
auto_add=True,
)
try:
notifier.loop(daemonize=True, pid_file='/var/run/mediamon.pid')
except pyinotify.NotifierError, err:
print >> sys.stderr, err
===S99mediamon.sh===
#!/bin/sh
# /usr/syno/etc/rc.d/S99mediamon.sh
case "$1" in
start|"")
#start the monitoring daemon
python /root/mediamon.py
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
kill `cat /var/run/mediamon.pid`
;;
*)
echo "Usage: S99mediamon.sh [[start|stop]]" >&2
exit 3
;;
esac