Synology offre de nombreux outils : Cloud Station synchronise les fichiers automatiquement entre l'ordinateur et le NAS Synology, et Photo Station a une interface web pour facilement partager des images avec famille et amis.

Malheureusement ces deux outils ne sont pas intégrés. Je veux pouvoir synchroniser mes images automatiquement entre mon ordinateur et mon NAS Synology et rendre ces photos accessibles depuis Photo Station. La solution Photo Station contient un outil de transfert mais ce n'est pas une solution automatique. J'utilise donc Cloud Station puisqu'il permet également de synchroniser d'autres types de fichiers. La solution proposée en 3 étapes :

  • Premièrement, installation de Cloud station et création d'un dossier qui contiendra les photos.
  • Ensuite, montage du dossier dans un sous dossier de "Photos" pour le rendre disponible dans Photo Station.
  • Dernièrement, ajout d'un script surveillant les changements dans le dossier afin de déclencher la génération de vignettes nécessaire à l'affichage dans Photo Station.

Installation de Cloud station

Je ne donne pas ici de procédure, il suffit de suivre la documentation de ce paquet fourni par Synolgoy : https://help.synology.com/dsm/?section=DSM&version=5.2&link=Tutorial%2Fcloud_sync_files.html Une fois installé, créez un dossier pour contenir les futures images.

Montage du dossier

En supposant que le dossier dans Cloud Station est nommé "Photos", son chemin absolu sur Synology doit ressembler à /volume1/homes/<username>/CloudStation/Photos. Pour rendre le dossier accessible depuis Photo Station, utiliser l'option --bind de mount :

mount --bind /volume1/homes/<username>/CloudStation/Photos /volume1/photo/<username>

Surveillance des changements

Pour détecter un changement dans le dossier, utilisons un script Python. Premièrement, installez le package Python à partir de l'interface web Synology pour pouvoir exécuter des scripts Python. Ensuite, installez pyinotifiy

~$ wget http://peak.telecommunity.com/dist/ez_setup.py
~$ python ez_setup.py pyinotify
Searching for pyinotify
Reading http://pypi.python.org/simple/pyinotify/
Best match: pyinotify 0.9.4
Downloading https://pypi.python.org/packages/source/p/pyinotify/pyinotify-0.9.4.tar.gz#md5=701c91854d241514ede7ffe72086566d
Processing pyinotify-0.9.4.tar.gz
Running pyinotify-0.9.4/setup.py -q bdist_egg --dist-dir /tmp/easy_install-wjy0eW/pyinotify-0.9.4/egg-dist-tmp-eOvHXs
zip_safe flag not set; analyzing archive contents...
Adding pyinotify 0.9.4 to easy-install.pth file

Installed /usr/local/packages/@appstore/Python/usr/local/lib/python2.7/site-packages/pyinotify-0.9.4-py2.7.egg
Processing dependencies for pyinotify
Finished processing dependencies for pyinotify

Maintenant place au script Python : il peut être créé à n'importe quel emplacement (j'ai créé un dossier /volume1/Extensions/scripts):

cat > /volume1/Extensions/scripts/monitor.py << EOF
import pyinotify
import sys
import os.path
from subprocess import call
import signal

log_file = open("/var/log/monitor.log", "a")

def log(text):
log_file.write(text + "\n")
log_file.flush()

def signal_handler(signal, frame):
log("Exiting")
sys.exit(0)


log("Starting")

signal.signal(signal.SIGTERM, signal_handler)

allowed_exts = ["jpg", "jpeg", "png", "tga", "gif", "bmp", "mp3", "flac", "aac", "wma", "ogg", "ogv", "mp4", "avi"]

wm = pyinotify.WatchManager()  # Watch Manager
mask = pyinotify.IN_CLOSE_WRITE | pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_MOVED_TO | pyinotify.IN_MOVED_FROM  # watched events


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])

# Remove from list of modified files.
try:
self.modified_files.remove(event.pathname)
except KeyError, e:
# Don't care.
pass
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(["/volume1/music", "/volume1/photo", "/volume1/video"], mask, rec=True, auto_add=True)

try:
notifier.loop(daemonize=True, pid_file='/var/run/monitor.pid')
except pyinotify.NotifierError, err:
print >> sys.stderr, err
EOF

Pour exécuter le script, il suffit de lancer :

python /volume1/Extensions/scripts/monitor.py

Automatisation de la solution

Cette dernière partie vise à garantir que cette configuration sera fonctionnelle après un upgrade du NAS ou un reboot. Créez un script de démarrage qui se chargera du montage, de l'installation d'inotify et de l'exécution du script de surveillance.

~$ cat > /usr/local/etc/rc.d/S99customMountPhotoStation.sh << EOF
~$ mount --bind /volume1/homes/<username>/CloudStation/Photos /volume1/photo/<username>
~$ # Install pyinotify package (in case Python package had an update on Synology).
~$ cd /tmp
~$ wget http://peak.telecommunity.com/dist/ez_setup.py
~$ python ez_setup.py pyinotify
~$ rm ez_setup.py
~$ # Start monitoring script
~$ python /volume1/Extensions/scripts/monitor.py
~$ EOF
~$ chmod u+x /usr/local/etc/rc.d/S99customMountPhotoStation.sh

Pour s'assurer que tout est fonctionnel, un redémarrage du NAS est nécessaire. Vous pouvez ensuite ajouter des images avec Cloud Station.

Source for Python notify script: http://codesourcery.wordpress.com/2012/11/29/more-on-the-synology-nas-automatically-indexing-new-files/