DigitalSpirit / Wiki / Fool

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 :

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 :

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 :

Les arguments optionnels :

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 :

  1. Le nom de la méthode de sauvegarde
  2. Le dossier ou serveur / dossier distant
  3. 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 :

Télécharger la version 0.3 :

Ou sur GitHub : GitHub