Script Fool
Fool (File tOOLkit) est un script écrit en bash sous licence GNU General Public License permettant de s'assurer de la bonne santé, de l'intégrité, de créer des sauvegardes de grosse quantité de gros fichiers.
Il à été conçu pour traiter de très grand nombre de fichiers d'assez grosse taille, notamment les photos, j'en dispose un assez grand nombre de photos (~120Go), cette taille m'empêche d'utiliser un outils de version comme Git ou Svn, c'est pour cela que j'ai créé ce script qui me permet de faire des synchronisations sur des disques dûrs, sur des serveurs distants ou encore de détecter les doublons, vérifier l'intégrité des données avec le calcul des sommes md5, etc...
Fool est un outils vous donnant les moyens de garder longtemps vos données auxquelles vous tenez à l'aide d'actions simples, le contrôle d'intégrité qui peut être lancé après une copie, la synchronisation vous permettant de multiplier les copies de vos données, etc...
Compatiblité
Fool fonctionne dans tout bon shell sur Gnu/Linux et sous MacOs, il ne devrait pas y avoir de souci à le faire fonctionner sur Windows avec cygwin.
Il a besoin pour fonctionner correctement de :
- md5sums sous Gnu/Linux, md5 sous MacOs
- rsync
Configuration
Voici la configuration qui se trouve au début de fool.sh :
<file>
[...]
+-------------------------+
| Begin configuration |
+-------------------------+
ROOT_PATH=cd "$(dirname $0)/../";pwd
MAX_DEPTH=2
RSYNC_ARGS='-azrv --progress --compress-level=9'
+-------------------------+
| End configuration |
+-------------------------+
[...]
</file>
ROOT_PATH est une variable de configuration importante car elle indique oû se trouve le dossier racine contenant vos données.
Pour ma part, je ne spécifie pas de chemin absolu (/mnt/raid/data/) car mes données étant stockées sur différents support, le chemin n'est jamais le même car je ne veux pas avoir à modifier la configuration à chaque fois, c'est pourquoi, je spécifie que des chemins relatifs (../) et que j'attribue à la variable ROOT_PATH la valeur « cd "$(dirname $0)/../";pwd
» qui correspond en fait à « ../ », soit le dossier parent du dossier d'oû est lancer Fool, suis-je clair ? non, lisez la suite.
Voici à quoi ressemble l'arborescence dans laquelle je stocke mes données et ce script :
/mnt/raid/Backup/event/2003
/2004
/...
/guest
/meta <- Contient les md5
/misc
/script <- Contient Fool
/tmp
Le dossier script contient Fool et le dossier meta contient les données générées par Fool, tous les autres dossiers sont les données que je souhaite surveiller, sauvegarder.
Les dossiers sauvegardés seront ceux présent dans « /mnt/raid/Backup », cependant, il serait inutile de sauvegarder le dossier script et meta, ces 2 dossiers sont définis dans le fichier « exclude.conf », voici le contenu de ce fichier :
<file>
./script
./meta
</file>
MAX_DEPTH permet de définir la profondeur de la recherche des fichiers, en fait, c'est assez subtile car Fool sauvegarde tous les fichiers sans aucune limite MAIS en définissant une MAX_DEPTH de 0, vous n'aurez qu'un seul fichier de somme md5 contenant l'ensemble de vos fichiers, pour un MAX_DEPTH de 1, vous aurez autant de fichiers de somme md5 qu'il y a de fichiers (non exclus) dans le dossier ROOT_PATH. Laissez la valeur par défaut en cas de doute.
RSYNC_ARGS permet de définir ses propres arguments à passer à rsync.
Hooks
La version 0.3 apporte un système de hook permettant d'exécuter des actions à des moments précis du déroulement du script, ainsi, il est possible de déclencher une action de montage de dossier au démarrage du script, de désactivation de l'indexation du système de fichiers afin de gagner en vitesse durant la synchronisation, etc...
Le fichier contenant les actions à déclencher est hook.sh, voici les fonctions qu'il contient :
- hook_start_script sera appelé au démarrage du script, qu'une action soit exécutée ou non
- hook_end_script sera appelé à la fin du script
- hook_start_local_rsync (2 paramètres : la source, la destination) sera appelé au début du synchronisation locale
- hook_end_local_rsync (2 paramètres : la source, la destination) appelé à la fin du synchronisation locale
- hook_start_remote_rsync (2 paramètres : la source, la destination) sera appelé au début du synchronisation distante
- hook_end_remote_rsync (2 paramètres : la source, la destination) appelé à la fin du synchronisation distante
Il vous suffit simplement d'ajouter du code dans la fonction voulue et il sera executé automatiquement au bon moment.
Fonctionnement
L'outils s'utilise très simplement en ligne de commande de la façon suivante :
$ ./fool.sh -arg action
Voici la liste des actions disponibles :
- clean : Supprime tous les fichiers définis dans le fichier clean.conf
- md5 md5 : Calcule la somme md5 de tous les fichiers de l.arborescence et stocke le tout
- duplicate duplicate : Cherche les fichiers en double à partir des sommes md5 calculées précédemment
- checkmd5 checkmd5 : Vérifie la somme md5 des fichiers avec celle stockée
- diff diff : Affiche les différences entre les dernières sommes calculées.
- size size : Renvoie la taille de l'arborescence de fichiers
- batch batch : Exécute les actions md5, duplicate, checkmd5
- cbatch cbatch : Identique à l'action batch mais en procédant par avance à un clean (clean, md5, duplicate, checkmd5)
- sync sync : Lance une commande synchronisation rsync
- info info : Renvoie des informations sur la configuration de l'application
Les arguments optionnels :
- -v Mode verbeux
- -s Mode silencieux
- -p ./path Limite l'action au chemin spécifié
- -d YYYY-MM-DD Date
- -D YYYY-MM-DD Date (utilisé lors de la commande diff)
- -l XX Limité la bande passante lors de sync (en kilo octets)
- -y Mode non interactif (réponds oui à toutes les questions), utile lorsque le script est appelé par un cron
Traitement des erreurs
Les erreurs sont enregistrées dans le fichier ./meta/errors.log, selon le niveau de verbosité, il est indiqué à la suite d'une action si elle s'est bien déroulée ou non.
Exemple :
$ ./fool.sh md5
Calculate md5 in ./a dir [ok]
Calculate md5 in ./b dir [ok]
Calculate md5 in ./c dir [ok]
Calculate md5 in ./z dir [error] : find: `./z': No such file or directory
La lecture des 3 dossiers a, b et c s'est correctement déroulée mais a échouée sur le dossier z qui n'existe pas.
Les actions
Voici la liste des actions en détail
Clean
La commande clean va supprimer tous les fichiers ou fichiers correspondant à l'expression définie dans le fichier de configuration clean.conf.
Exemple de fichier clean.conf :
<file>
.DS_Store
._.DS_Store
*.toto
</file>
Avec cet exemple, tous les fichiers .DS_Store et ._.DS_Store seront supprimés ainsi que ceux satisfaisant à l'expression *.toto
Md5
Calcule la somme md5 de tous les fichiers rencontrés dans l'arborescence et stocke les valeurs dans le dossier ./meta/md5///DATE_DU_JOUR///
Ainsi, si vous executez le script le 12 mai 2010, l'arborescence ressemblera à ceci :
./meta/md5/2010-05-12/a.md5sums
b.md5sums
files.log
Le fichier files.log contient le contenu de tous les fichiers md5sums, dans l'exemple ci-dessus, il contiendra alors le contenu de a.md5sums et b.md5sums.
Duplicate
Cherche tous les fichiers en double dans les sommes md5 calculées précédemment par l'action md5, stocke le contenu dans le fichier ./meta/md5///DATE_DU_JOUR///files.duplicate et affiche le résultat.
Exemple de contenu de fichier files.duplicate contenant 3 fichiers différents dupliqués :
<file>
112362de827cc76ff6ac5f30a200b75e ./a/2003/p7190001.jpg
112362de827cc76ff6ac5f30a200b75e ./a/2004/p7190001.jpg
f6f99b387aa061d04c2b255982eed149 ./a/2003/a/p7190003 (copy).jpg f6f99b387aa061d04c2b255982eed149 ./a/2003/a/p7190003.jpg f6f99b387aa061d04c2b255982eed149 ./a/2004/a/p7190003 (copy).jpg f6f99b387aa061d04c2b255982eed149 ./a/2004/a/p7190003.jpg
3e181c0e3cb3bd71e603342630b2c415 ./b/2003/a/p7190002.jpg
3e181c0e3cb3bd71e603342630b2c415 ./b/2004/a/p7190002.jpg
</file>
Nous apercevons la somme md5 à gauche suivi du fichier, on remarque que l'adresse fournie est relative au dossier racine des dossiers, ainsi, les chemins sont les mêmes quelques soit le support.
Checkmd5
Vérifie que les sommes md5 calculées correspondent bien avec celle des fichiers.
Diff
Affiche les différences entre les 2 dernières sommes calculées.
Il est possible de spécifier les dossiers sur lesquelles faire le calcul de différence à l'aide des arguments -d YYYY-MM-JJ et -D YYYY-MM-JJ.
Exemple :
$ ./fool.sh -d 2010-05-12 -D 2010-05-11 diff
Check integrity on 2010-05-12 2010-05-11
diff -r 2010-05-12/files.log 2010-05-11/files.log
La commande ci-dessus lancera un check entre les versions du 11 mai 2010 et du 10 mai 2010, vous verrez alors les différences entre ces 2 dates.
Size
Calcule la taille de l'arborescence et l'affiche.
Exemple :
$ ./fool.sh size
447M .
443M event
4.0K guest
4.0K tmp
[info] Executed in 0 second(s)
Batch
Exécute les actions md5, duplicate et checkmd5 à la chaine.
Cbatch
Pareil que l'action batch mais exécute un clean avant les autres actions (md5, duplicate et checkmd5)
Sync
Cette commande permet de synchroniser les fichiers avec un dossier local ou distant.
Les dossiers / serveurs de destination sont définis dans le fichier sync.conf, ce dernier contient la définition d'un dossier de synchronisation différent par ligne.
Une ligne est constituée de 3 éléments séparés par des dièses :
- Le nom de la méthode de sauvegarde
- Le dossier ou serveur / dossier distant
- Le dossier local de départ
Exemple de fichier sync.conf :
<file>
test#http://www.example.org/foo/bar/#/bar
testlocal#/tmp/out
</file>
Elle comporte 3 sous actions : 1. list Affiche sous une forme facilement lisible le contenu du fichier de configuration sync.conf 2. to Synchronise les fichiers vers la destination spécifiée 3. from Synchronise depuis la source spécifiée
Exemple :
Affiche la configuration de la synchronisation :
$ ./foo.sh sync list
test
url : http://www.example.org/foo/bar/
local path : /bar
testlocal
url : /tmp/out
local path :
Exécute une synchronisation vers test (http://www.example.org/foo/bar/) :
$ ./foo.sh sync to test
Sync '/home/user/files' to 'http://www.example.org/foo/bar/' ? (yes/no)
[...]
Exécute une synchronisation depuis testlocal (/tmp/out/) :
$ ./foo.sh sync from testlocal
Sync '/home/user/files' to '/tmp/out/' ? (yes/no)
[...]
Info
Renvoie des informations sur la configuration de l'application et test les dépendances.
$ ./fool.sh
Configuration :
- Version : 0.1
- Root path : /mnt/raid/data
- Md5 path : ./meta/md5
- Error logs : ./meta/errors.log
- File logs : ./meta/md5/2010-05-18/files.log
- Conf file : ./script/sync.conf
- Date : 2010-05-18
- Rsync args : -azrv --progress --compress-level=9
- Data paths :
- ./event
- ./event/2004
- ./event/2003
- ./event/2002
- ./tmpd/a
- ./tmpd/b
- Exclude (./script/exclude.conf) :
- ^.$
- ^./script
- ^./meta
- Os : linux
- Verbose : Normal
Dependencies :
Check for md5sum [ok]
Check for rsync [ok]
Téléchargement
Fool est constitué de 3 fichiers sources et 3 fichiers de configuration et la licence :
- fool.sh qui contient le code principal
- include.sh contenant des fonctions appelées par fool.sh
- clean.conf contient les fichiers devant être supprimés par l'action clean
- sync.conf contenant la configuration pour les synchronisation, voir sync
- exclude.conf qui contient les fichiers / dossiers à exclure des traitements, voir Configuration pour plus d'informations à ce sujet
- hook.sh contenant le code des actions déclenchées (hooks) à certain moment précis
Ou sur GitHub : GitHub