<h2>But de ce document</h2>
<p class="spip">Ce document me sert de <strong class="spip">mémo</strong> pour installer, configurer et utiliser le logiciel « <strong class="spip"> UNISON </strong> » sous Linux Debian. Je le diffuse en espérant qu’il serve à d’autres personnes.</p>

<p class="spip"><strong class="spip">UNISON</strong> est un programme permettant de synchroniser des dossiers locaux ou distants (via SSH) dans les deux sens (il gère les collisions).</p>

<h2>Installation</h2>
<p class="spip">Installation du programme de base utilisable en ligne de commande :</p>

<p class="spip"><code class='spip_code' dir='ltr'># aptitude install unison</code></p>

<p class="spip">Installation de l’interface graphique pour les réfractaires à la ligne de commande :</p>

<p class="spip"><code class='spip_code' dir='ltr'># aptitude install unison-gtk</code></p>

<p class="spip"><strong class="spip">Remarque </strong> : L’utilisation de cette interface graphique ne sera pas détaillée dans ce document, car nous allons nous contenter de la ligne de commande.</p>

<h2>Premier test en local</h2>
<p class="spip">Pour ce test, nous allons créer les deux dossiers suivants :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>$ mkdir /tmp/DossierTestLocal<br />
$ mkdir /tmp/DossierTestDistant</code></div>
<p class="spip">Ensuite, vous pouvez créer des sous-dossiers ou des fichiers dans ces deux dossiers de tests. Exemple :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>$ touch /tmp/DossierTestLocal/Test1<br />
$ touch /tmp/DossierTestDistant/Test2</code></div>
<p class="spip">La commande suivante, permet de synchroniser le contenu des deux dossiers :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>$ unison /tmp/DossierTestLocal /tmp/DossierTestDistant<br />
Contacting server...<br />
Looking for changes<br />
Reconciling changes<br />
<br />
DossierTe...   DossierTe...<br />
new file ---->            Test1  [f]<br />
         <---- new file   Test2  [f]<br />
<br />
Proceed with propagating updates? [] y<br />
Propagating updates</code></div>
<p class="spip">Pour chaque modification, <strong class="spip">unison</strong> demande ce qu’il faut faire. En validant, nous autorisons <strong class="spip">unison</strong> à effectuer la mise à jour indiquée.</p>

<p class="spip">Pour la dernière question, il faut répondre « y » ou « g » pour valider et lancer la synchronisation des dossiers.</p>

<p class="spip"><strong class="spip">Remarque </strong> : Pour chaque question, il est possible de saisir «  ? » pour connaître la liste des réponses possibles.</p>

<h2>Deuxième test en utilisant le fichier de configuration</h2>
<p class="spip">Le fichier de configuration par défaut est enregistré dans le répertoire home de l’utilisateur et se nomme « <strong class="spip"> /.unison/default.prf</strong> ».</p>

<p class="spip">Par exemple, pour éviter de saisir à chaque fois les répertoires, il est possible d’ajouter les lignes suivantes dans ce fichier :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># Répertoire distant<br />
root = /tmp/DossierTestDistant<br />
# Répertoire local<br />
root = /tmp/DossierTestLocal</code></div>
<p class="spip"><strong class="spip">Remarque </strong> : Les lignes commençant par des « # », sont des commentaires.</p>

<p class="spip">Ensuite, il suffit de saisir la commande suivante pour synchroniser vos dossiers :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ unison</code></p>

<h2>Utilisation de plusieurs fichiers de configuration</h2>
<p class="spip">Dans l’exemple précédent, nous avons utilisé le fichier de configuration par défaut « <strong class="spip">default.prf </strong> ». Cependant, il est possible de créer d’autres fichiers de configuration dans le dossier « <strong class="spip">.unison</strong> » et de les appeler avec la commande suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ unison MonAutreFichierDeConfiguration.prf</code></p>

<p class="spip"><strong class="spip">Remarque </strong> : Il faut obligatoirement enregistrer ces fichiers dans le dossier « <strong class="spip">.unison</strong> » et ne pas indiquer le chemin de ceux-ci dans la ligne de commande.</p>

<h2>Test avec un serveur distant</h2>
<p class="spip"><strong class="spip">ATTENTION</strong> : Pour faire une synchronisation avec un ordinateur distant, il est nécessaire d’installer <strong class="spip">la même version d’unison</strong> sur les deux ordinateurs. Dans mon cas, j’avais installé la version 2.13 sur une Debian Sid et la version 2.9 sur une Debian Sarge et cela n’a pas fonctionné. J’ai du installer la version 2.9 sur la Debian Sid pour que cela fonctionne.</p>

<p class="spip">Pour accéder via ssh à un poste distant, voici à quoi peut ressembler le fichier de configuration :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># Répertoire distant<br />
root = ssh://LeServeur//tmp/DossierTestDistant<br />
# Répertoire local<br />
root = /tmp/DossierTestLocal</code></div>
<p class="spip">Et la synchronisation se passe toujours de la même manière avec la commande suivante :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ unison</code></p>

<p class="spip"><strong class="spip">Remarque </strong> : Pour éviter la saisie du mot de passe à chaque synchronisation, il faut que l’accès ssh se fasse par échange de clés publique/privée et non pas par la saisie d’un mot de passe. La mise en place de clés publique/privée dépasse le cadre de ce mémo, mais vous trouverez quelques explications dans cet article :
<br /></p>
<li> <a href="http://www.coagul.org/article.php3?id_article=168" class="spip_out">http://www.coagul.org/article.php3 ?id_article=168</a>
<h2>Automatiser la synchronisation</h2>
<p class="spip">L’option « <strong class="spip"> auto </strong> », permet de répondre avec la valeur par défaut à toutes les questions sauf la dernière demandant le lancement de la mise à jour :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ unison -auto</code></p>

<p class="spip">L’option « <strong class="spip"> batch </strong> », permet de lancer la mise à jour de façon entièrement automatique :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ unison -batch</code></p>

<p class="spip">L’option « <strong class="spip"> silent </strong> », permet de lancer la mise à jour automatiquement sans rien afficher :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ unison -silent</code></p>

<p class="spip">En cas de conflit avec l’option « <strong class="spip"> batch </strong> » ou l’option « <strong class="spip"> silent </strong> », la synchronisation ne sera pas effectuée automatiquement. Pour remédier à ce problème, il est possible d’ajouter des options dans le fichier de configuration pour indiquer les choix par défaut à effectuer.</p>

<p class="spip">L’option « <strong class="spip"> prefer </strong> » permet d’indiquer le dossier prioritaire en cas de conflit. Exemple :</p>

<p class="spip"><code class='spip_code' dir='ltr'>prefer = /tmp/DossierTestLocal</code></p>

<p class="spip">ou :</p>

<p class="spip"><code class='spip_code' dir='ltr'>prefer = ssh://LeServeur//tmp/DossierTestDistant</code></p>

<p class="spip">L’option « <strong class="spip">force = newer</strong> » (ou « <strong class="spip">force =older</strong> »), permet de choisir la version la plus récente (ou la plus ancienne) d’un fichier en cas de conflit. Pour utiliser cette option, il est obligatoire d’ajouter l’option « <strong class="spip">times = true</strong> », qui permet de synchroniser également la date de modification des fichiers. Exemple :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>times = true<br />
force = newer</code></div>
<p class="spip"><strong class="spip">ATTENTION</strong> : Avec l’option « <strong class="spip">force = newer</strong> », il ne sera plus possible de supprimer des fichiers et de faire une synchronisation automatique car les fichiers supprimés seront automatiquement recopiés à partir de l’autre dossier.</p>

<p class="spip">Pour lancer automatiquement par exemple une synchronisation toutes les 10mn, il faut ajouter cette ligne dans la crontab (crontab -e) de l’utilisateur :</p>

<p class="spip"><code class='spip_code' dir='ltr'>*/10 * * * * /usr/bin/unison -silent</code></p>

<h2>Faire une sauvegarde (backup) des fichiers avant la synchronisation</h2>
<p class="spip">L’option suivante, permet de sauvegarder dans le dossier « <strong class="spip"> /.unison/backup</strong> » tous les fichiers dont le nom (name) correspondant à l’expression rationnelle « * », soit tous les fichiers :</p>

<p class="spip"><code class='spip_code' dir='ltr'>backup = Name *</code></p>

<p class="spip">Cette option permet d’indiquer qu’il faut sauvegarder seulement les trois dernières versions d’un même fichier (la valeur par défaut étant 2) :</p>

<p class="spip"><code class='spip_code' dir='ltr'>maxbackups = 3      </code></p>

<p class="spip">Pour changer le répertoire par défaut des fichiers sauvegardés, il faut modifier le contenu de la variable d’environnement « UNISONBACKUPDIR » avant de lancer unison :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>$ export UNISONBACKUPDIR=/tmp   <br />
$ unison</code></div>
<h2>Détail de quelques options du fichier de configuration</h2>
<h3>Gestion des logs</h3>
<p class="spip">Par défaut, les logs des opérations sont enregistrés dans le fichier « <strong class="spip">unison.log</strong> » dans le home du répertoire utilisateur. La commande suivante permet d’indiquer un autre chemin et un autre nom de fichier</p>

<p class="spip"><code class='spip_code' dir='ltr'>logfile = .unison/log</code></p>

<p class="spip">L’option suivante permet de désactiver les logs :</p>

<p class="spip"><code class='spip_code' dir='ltr'>log = false</code></p>

<p class="spip">L’option suivante permet d’activer les logs :</p>

<p class="spip"><code class='spip_code' dir='ltr'>log = true</code></p>

<p class="spip">Il est possible d’ignorer certains dossiers ou certains fichiers lors de la synchronisation avec les commandes suivantes :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>ignore = Name {core,*.pyc,*.dat,*.xcu, *.dvi, *.log, *.pid, *.out, unison.log}<br />
ignore = Path .unison<br />
ignore = Name toto</code></div>
<li> ignore = Name pour exclure de la synchronisation certains fichiers
<br /><li> ignore = Path pour ne pas synchroniser certains répertoires
<h3>Synchronisation de plusieurs répertoires avec l’option path</h3>
<p class="spip">L’option « <strong class="spip"> path </strong> » permet d’indiquer le ou les dossiers à synchroniser :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>path dossier1<br />
path dossier2<br />
path dossier3</code></div>
<h2>Consultation de la documentation fournie avec unison</h2>
<p class="spip">La commande « <strong class="spip"> less </strong> », permet de consulter directement la documentation au format .gz :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ less /usr/share/doc/unison2.9.1/unison-manual.txt.gz</code></p>

<p class="spip">Autrement, pour lire cette documentation avec votre éditeur favori, il faut commencer par la décompresser (sous root pour laisser le fichier décompressé à l’endroit original) :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># gunzip /usr/share/doc/unison2.9.1/unison-manual.txt.gz<br />
$ kate /usr/share/doc/unison2.9.1/unison-manual.txt </code></div>
<p class="spip">Pour finir, <strong class="spip">unison</strong> propose une méthode originale pour consulter la documentation par chapitre. La commande suivante permet de connaître la liste des chapitres de la documentation :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ unison -doc topics</code></p>

<p class="spip">Ensuite, il suffit d’indiquer le chapitre que l’on veut consulter. Exemple :</p>

<p class="spip"><code class='spip_code' dir='ltr'>$ unison -doc tutorial | less</code></p>

<h2>Autres documentations</h2>
<p class="spip">Site officiel :
<br /></p>
<li> <a href="http://www.cis.upenn.edu/~bcpierce/unison/" class="spip_out">http://www.cis.upenn.edu/ bcpierce/unison/</a>
<p class="spip">Manuel de référence :
<br /></p>
<li> <a href="http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html" class="spip_out">http://www.cis.upenn.edu/ bcpierce/unison/download/releases/stable/unison-manual.html</a>
<h2>Historique des modifications</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Version</strong></th><th scope='col'><strong class="spip">Date</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>0.2</td><td>13/08/06</td><td>Création par Tony GALMICHE</td></tr>
<tr class="row_odd"><td>0.3</td><td>16/08/06</td><td>Remarque sur l’option « force = newer »</td></tr>
<tr class="row_even"><td>0.4</td><td>24/02/07</td><td>Ajout lien vers ssh suite à remarque de Jibux</td></tr>
</tbody>
</table>