L'objectif était d'avoir un (ou plusieurs) script(s) permettant de synchroniser toute ou une partie d'une clé USB avec un répertoire choisi par l'utilisateur.
Tout a été réaliser sur un ordinateur portable IBM Thinkpad x31 sous Pardus 2009.2. Il est a noté que Unison n'est (au moment de la réalisation du script) pas disponible dans les dépôts. Il a donc dû être installé à partir des sources. Une demande à cependant était réaliser pour l'ajout d'Unison en mode texte dans les dépôts francophone.
Outils utilisés : Udev pour la reconnaissance d’évènements système (branchement de la clé)
http://fr.wikipedia.org/wiki/Udev Unison pour la synchronisation bi-directionnelle
unison]http://www.cis.upenn.edu/~bcpierce/unison/]unison
Udev.Udev est le gestionnaire de périphérique utilisé sur le système d'exploitation GNU/Linux. La gestion des différents périphérique se fait au travers de différentes règles rédigés dans un fichier texte. Ce principe le rend à la fois simple et extrêmement puissant.
Une très bonne page de documentation est disponible sur le site de la distribution Ubuntu à cette adresse :
http://doc.ubuntu-fr.org/udevLa première étape a donc été de récupérer l’évènement du branchement de la clé et de connaître un moyen de l'identifier de manière unique.
Cela a pu être réalisé à l'aide de la commande udevadm. Dans mon cas, j'ai utilisé la ligne de commande suivante :
udevadm info -a -n sdb
sdb correspondant à ma clé dans le répertoire /dev. C'est à partir des informations retournées par cette commande que l'on va pouvoir identifier le périphérique. Dans cet exemple, je me suis limité à l'attribut « vendor ».
Attention : Il est fortement conseiller de lire la documentation udev avec d’écrire une règle.
J'obtiens alors la règle udev suivante :
BUS=="scsi",ATTRS{vendor}=="Corsair ", SYMLINK+="Corsair%n", ENV{PROFIL}="Corsair", RUN+="/home/user/scripts/synchronisation.sh"
Pour que cette règle soit prise en compte, elle doit être placé dans un fichier possédant l’extension .rules dans le répertoire /etc/udev/rules.d (/etc/udev/rules.d/10-local.rules dans mon cas).
L'écriture dans le dossier rules.d nécessite les droits d'administrateur.
Cette règle permet de :
1. Regarder tout les branchement effectué sur un port usb
2. Si c'est un périphérique dont le constructeur est Corsair, alors il crée un liens symbolique dans /dev et lance le script « synchronisation.sh ». De plus, il est important de noter que le script lancé par udev sera exécuté avec les droits administrateur (lancé par root). Attention donc aux bêtises !!
Après modifications des règles, il est possible qu'elle ne soit pas pris en compte par votre noyau Linux. Pour forcer leurs rechargement, vous pouvez utiliser la commande :
sudo udevadm control –reload-rules
UnisonUnison est un logiciel de synchronisation bidirectionnel basé sur la notion de profil ce qui permet de pouvoir pré-configurer les synchronisations. Ces dernières sont alors enregistrées avec leurs différentes options.
Les fichiers de profils sont rangé dans le répertoire ~/.unison/ et ont pour convention de nommage nom_du_profil.prf.
Une documentation relativement complète est disponible à cette adresse :
http://doc.ubuntu-fr.org/unisonDans cet exemple, le profil s’appellera Corsair.prf. Le fichier est commanté afin d'en augmenter la compréhension.
# Fichiers à synchorniser : "source"
root = /home/user/Corsair/
# "Destination"
root = /media/Corsair/
# Options pour une meilleur gestion du fat32
ignorecase = true
perms = 0
# Sauvegarde des logs :
log = true
logfile = /home/user/scripts/unison_logs
# Synchronisation des dates
times = true
#mode auto
batch=true
# Permet une meilleur sécurité pour les médias amovible (style usb)
# Attention:Chemin relatif du point de montage du médias à partir du premier « root »
mountpoint=./././media/Corsair
Ceci est un profil basique qui synchronise l'intégralité de la clé dans un répertoire. Une gestion beaucoup plus précise est possible en ne synchronisant par exemple que certains sous répertoires, types de fichiers …
Pour plus d'informations, je vous renvoie au liens du début de section.
Script de synchronisationMaintenant que la règle udev est écrite et que Unison est configurer, il reste à écrire un script pour gérer tout ça. Pour ma part, j'ai fait cela avec un script bash (synchronisation.sh). Il n'est peut-être pas exempt de bugs et son usage est à vos risques et périls. Le script est commenté pour une meilleur compréhension
#!/bin/bash
# --
# Script écrit par Zolotaya
# Dernière modification le 27/07/2010
# --
# Fonction d'affichage de l'aide (to do)
usage () {
exit 1
}
# Points d'entrée dans le script. On check les arguments
if (( $# != 0 )) ; then
usage $0
fi
# On check si le profil à lancer existe
# profil_name est connu grâce à la variable d'environnement udev PROFIL (cf règle partie 1)
profil_name=$PROFIL
profil_file="/root/.unison/"$profil_name".prf"
#on regarde si le profil existe. Si c'est le cas, on créer le point de montage, on monte la clé, et lance Unison
if [ -e $profil_file ]; then
mkdir /media/$profil_name
mount -o uid=1000 /dev/$profil_name"1" /media/$profil_name
sudo /usr/bin/unison $profil_name # ne fonctionne pas sans le sudo avant (trouver pourquoi … )
# Après la synchro, on démonte la clé et supprime le point de montage (on reviens à l'état de départ)
umount /dev/$profil_name"1"
rmdir /media/$profil_name
echo "Synchronisation effectuée le `date +%D' à '%T`" > /home/user/scripts/sync_logs
# Une fois la synchro terminée, on ajuste les droits pour que l'utilisateur puisse avoir accès au dossier synchronisé (le script est lancé par root)
chown -R user:users /home/user/$profil_name
chown user:users /home/user/scripts/sync_logs
chown user:users /home/user/scripts/unison_logs
wait
else
echo -e "\033[031mErreur \033[0m: Le profil $profil_name ($profil_file) n'existe pas" > /home/user/scripts/sync_logs
exit 1
fi
exit 0