Synchronisation de fichiers légère, pour ownCloud et WebDAV

J’ai récemment commencé à utiliser ownCloud pour la synchronisation de fichiers. En fin de compte, malgré quelques problèmes à la marge, l’expérience est vraiment satisfaisante, à tel point que j’ai déplacé sur ownCloud tout mon « nuage personnel », précédemment sur un partage NFS. Néanmoins, si le client ownCloud standard convient lorsqu’il est disponible, il ne l’est pas toujours. En particulier :

  • Je transporte avec moi sur clef USB un bureau Linux léger basé sur TinyCore Linux, et pour lequel ce client n’existe pas.
  • Je possède aussi un vieil ordinateur portable qui doit se contenter d’un système d’exploitation obsolète à cause d’un composant vidéo bogué, qu’aucun système plus récent ne supporte (bien que cette même référence de composant graphique sur un autre ordinateur portable soit parfaitement supportée…).

Pour de telles situations, j’ai essayé d’utiliser DavFS, qui s’est avéré bien trop lent ; cela reste toutefois un bon second choix. Puis j’ai essayé le programme Java WebDAV-Sync, mais bien que celui-ci ait correctement effectué l’import initial, on ne peut pas dire que la synchronisation ait vraiment fonctionné : l’ensemble des données était à nouveau intégralement téléchargé à chaque nouvelle tentative de synchronisation !

Donc j’ai créé mon propre outil de synchronisation, dont les seules dépendances sont curl et bash, et optionnellement ssh. Ces dépendances sont disponibles partout, même sur Windows et quelques systèmes embarqués ;-)

This article is also available in English.

Avec un total manque d’imagination, j’ai appelé mon outil miniOCsync, puisque c’est un script bash léger pour synchroniser avec ownCloud un répertoire local. Cet outil peut néanmoins communiquer avec n’importe quel serveur WebDAV. Mais si le serveur fait tourner ownCloud, et si un accès SSH est possible vers ce serveur, alors miniOCsync peut tirer partie de la connexion ssh pour fortement accélérer la phase du processus de synchronisation qui consiste à inventorier le contenu du serveur ! En bonus, l’utilisation de ssh rend possible le calcul sur le serveur des sommes de contrôle « md5sum » pour fiabiliser les comparaisons de fichiers ; sans ssh, ces dernières ne se basent que sur les tailles des fichiers. Il se peut que j’ajoute à terme la comparaison des dates et heures des fichiers, mais je ne suis pas sûr que ces informations soient véhiculées de manière fiable sur ownCloud par le client officiel et par DavFS.

L’outil est très simple. miniOCsync ne consiste qu’en un script nommé miniOCsync.sh. Ce script gère quelques données de travail dans le répertoire ~/.cache/miniOCsync et synchronise les données du serveur avec le répertoire local ~/ownCloud. Un fichier de configuration nommé ~/.config/miniOCsync.conf doit exister ; en voici un exemple :

LOG_FILE=~/.cache/miniOCsync/miniOCsync.log
LOG_LEVEL=1
IGNORE=(
'~$' '\.part$' '^(.*/)?\.owncloudsync.log$' '^(.*/)?Thumbs\.db$' '^(.*/)?desktop\.ini$'
'^(.*/)?\.Trash' '^(.*/)?\.~lock\.' '^(.*/)?\..*\.swp$' '^(.*/)?~.*\.tmp$'
)
EXCLUDE=(
'^Public' '^Téléchargements'
)
OC_ROOT=https://example.org/owncloud/remote.php/webdav
OC_USER=utilisateur_owncloud
OC_PASS=mot_de_passe_owncloud
OC_SCAN_BACKEND=ssh
OC_DATA=/var/owncloud_data

La commande « miniOCsync.sh -h | less » donne bien plus d’informations (en anglais), y compris le moyen de configurer l’accès ssh de manière sure. Pour la première exécution de l’outil, un mode d’initialisation doit être choisi :

  • Les paramètres « -i l » entraînent l’initialisation des méta-données de référence à partir des données locales. Par conséquent, les données locales apparaîtront comme étant à jour vis à vis de la référence, tandis que toute donnée différente sur le « cloud » (le serveur WebDAV) sera vue comme différence de la référence et donc plus récente. En bref, ces paramètres donnent la priorité aux données du serveur pour la première exécution.
  • À l’inverse, les paramètres « -i c » entraînent l’initialisation des méta-données de référence à partir du « cloud ». Par conséquent, les données du serveur apparaîtront comme étant à jour vis à vis de la référence, tandis que toute donnée différente en local dans ~/ownCloud sera vue comme différente de la référence et donc plus récente. En bref, ces paramètres donnent la priorité aux données locales pour la première exécution.

L’algorithme du script est vraiment simple :

  • Si une donnée locale diffère de la référence, mais que la même donnée sur le serveur n’a pas changé, alors la donnée locale est téléversée vers le serveur.
  • Si une donnée du serveur diffère de la référence, mais que la même donnée n’a pas changé localement, alors la donnée distante est téléchargée du serveur.
  • Lorsque les données locale et distante ont toutes deux été modifiées depuis la dernière synchronisation, la donnée locale est déplacée vers le répertoire ~/ownCloud/lost+found/ et la donnée distante est téléchargée pour prendre sa place.

Avec le paramètre « -n », miniOCsync suit son algorithme de synchronisation comme d’ordinaire et trace ses actions comme configuré, mais sans jamais modifier aucune donnée, que ce soit localement ou sur le serveur. C’est un bon moyen de tester l’issue de la synchronisation sans prendre le moindre risque.

miniOCsync peut être lancé ponctuellement, ou bien être planifié par un outil de type cron. Le script s’arrête proprement s’il constate qu’une autre instance est déjà en cours d’exécution pour le même utilisateur ; il est ainsi possible de planifier une exécution toutes les 5 minutes par exemple, même si le temps de synchronisation excède parfois cette durée.

Attaché à cet article se trouve le script, qui peut être librement utilisé et adapté conformément aux conditions de la licence GPLv3.

Mises à jour :

  • 2015-08-06 — Prise en charge de l’initialisation en ayant un des « côtés » initialement vide (je n’étais pas concerné par ce cas jusqu’à présent) ; amélioration des performances ; quelques corrections mineures.
  • 2015-08-07 — Correction d’un bug important concernant la gestion des méta-données de référence, et contournement du bug nº 1063 de curl. Il faut refaire l’étape d’initialisation avec la nouvelle version du programme pour rétablir la situation.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

La discussion continue ailleurs

URL de rétrolien : http://yalis.fr/cms/index.php/trackback/79

Fil des commentaires de ce billet