Sauvegarde (4/x)


Après vous avoir fait mariner pendant assez longtemps, voici la suite de la mise en place de la sauvegarde distante.

Nous allons aujourd’hui commencer le script qui va créer un répertoire de sauvegarde, le synchroniser avec les éléments que nous voulons sauvegarder et faire une image disque chiffrée à partir de ce répertoire. Au passage nous verrons deux petits trucs sympa dans le scripting shell. Les fonctions et la gestion des paramètres.

Début du script

Les scripts shells, ou perl, ou ruby ou autres commencent tous par la même chose:nbsp;: le « shebang ». Il s’agit d’annoncer quel interpréteur nous allons utiliser. En général, et pour des questions de portabilité on utilise sh.

Le shebang est alors :

1
#!/bin/sh

Ensuite, on place en général des informations sur le script lui même. Ce qu’il fait, quel en est l’auteur, à quelle date, quels sont les modifications qui y ont été apportées, par qui et quand. Même lorsque vous êtes seul, pensez à cette partie. Elle s’avéra très utile dans six mois lorsque vous replongerez dans le script.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/sh
# Script de sauvegarde a base de rsync et d’images chiffrees
#
# Auteur : Jacques Foucry
# Date   : 2007-19-10
#-----------------------------------------------------------
# Principe :
# A partir d'une liste de fichiers a inclure (include_fichiers)
# un rsync vers un repertoire cible a sauvegarder
#
# Creation d'une image chiffree de ce repertoire
#
# Envois de cette image sur un site distant#
# Remarque : faire une exclude list est plus# efficace qu'une include list

Une fonction

Les fonctions doivent êtres écrire et positionnée avant leurs appels dans le script. C’est donc le moment de créer une fonction usage qui retourne la façon d’appeler le script shell en cas d’erreur, par exemple dans les paramètres.

1
2
3
4
5
6
# Fonction qui affiche les options en cas d'erreur
usage()
{
	echo "Usage: $0 -i include list | -e exclude list [-f target folder] [-s source folder]"
	exit 0
}

Le code de la fonction est entre accolades et la phrase qui sera affichée est entre double quote. $0 représente le nom du script. Ainsi, une partie de cette fonction est facilement réutilisable. Les paramètres attendus sont -i avec une liste d’inclusion (les fichiers que nous voulons absolument sauvegarder) ou (le |) -e avec une liste d’exclusion (les fichiers que nous ne voulons surtout pas sauvegarder). Les paramètres -f et -s, respectivement le répertoire cible, celui qui sera à l’origine de l’image et le répertoire source, celui qui contient les fichiers que nous voulons sauvegarder, sont optionnels. Cela se reconnaît au fait qu’ils sont entourés de crochet ([]). C’est une convention sous Unix.

Valeur par défaut

Pour les paramètres qui ne sont pas obligatoires, il faut mettre des valeurs par défaut. Il est nécessaire qu’elles soient instanciées très tôt dans le script. Donc après la définition de la dernière fonction.

1
2
DESTINATIONFOLDER=/Volumes/Save/Sauvegarde
SOURCE=$HOME

Nous avons aussi besoin de la date sous une forme exploitable pour le nom de l’image.

1
DATUM=`date +"%Y%m%d-%H%M"` 

Gérer les paramètres

La gestion des paramètres se fait avec la fonction getopts. Voici le morceau de code qui réalise cette gestion :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# gestion des options
while getopts i:e:f:s: THEOPTIONS
do
	case $THEOPTIONS in
			i) INCLUDELIST=$OPTARG;;
			e) EXCLUDELIST=$OPTARG;;
			f) DESTINATIONFOLDER=$OPTARG;;
			s) SOURCE=$OPTARG;;
			?) usage;;
		esac
	done

Les options qui sont suivies d’un deux-points (:) sont celles qui requièrent un argument. Les options sont stockées dans la variable THEOPTIONS. Ensuite, en fonction des options, on récupère de la variable OPTARGS les arguments de ces options. Il faut penser au cas ou l’utilisateur demande de l’aide.

Tester les paramètres des options

Pour que le script fonctionne correctement, il est plus prudent de tester que les fichiers que l’on va utiliser en paramètres existent. C’est le rôle de cette partie de code ;:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Test des fichiers d'options
# Si ni EXCLUDELIST ni INCLUDELIST sont definis, on a une erreur
if [ -z $INCLUDELIST ] && [ -z $EXCLUDELIST ] ;then
	echo "Error: at least INCLUDELIST or EXCLUDELIST must be used"
	exit 1
fi
# si INCLUDELIST est definie (longueur > 0)
# et que le fichier n'existe pas, on a une erreur
if [ ! -z $INCLUDELIST ] ; then
	if [ ! -s $INCLUDELIST ] ; then
		echo "Error: INCLUDELIST must exist and not being empty"
		exit 1
	fi
fi
# si EXCLUDELIST est definie (longeur > 0)
# et que le ficher n'existe pas, on a une erreur
if [ !-z $EXCLUDLIST ] ;then
	if [ ! -s $EXCLUDELIST ] ;then
		echo "Error: EXCLUDELIST must exist and not being empty"
		exit 1
	fi
fi
# Si le repertoire cible n'existe pas, il est cree
if [ ! -d $DESTINATIONFOLDER ] ;then
	echo "Creation of $DESTINATIONFOLDER"
	mkdir -p $DESTINATIONFOLDER
fi

Les commentaires expliquent comment fonctionnent ses tests, il n’est pas nécessaire de s’appesantir dessus.

La synchronisation

L’étape suivante consiste à mettre dans le répertoire cible les fichiers qui ont été sélectionnés depuis le répertoire source. La sélection se fait grâce aux listes d’inclusion et d’exclusion. Pour faire cette synchronisation nous allons utiliser rsync. Celui-ci à des options qui permettent de ne recopier que ce qui a été modifié depuis la dernière opération de synchronisation, accélérant du coup le processus de sauvegarde en sont entier.

1
2
# Le rsync vers le repertoire de destination
/usr/bin/rsync -auvz --include-from=$INCLUDELIST --exclude-from=$EXCLUDELIST $SOURCE $DESTINATIONFOLDER

La création de l’image chiffrée

Voilà le point noir du script. Je n’ai pas trouvé comment récupérer un mot de passe depuis la keychain, le mot de passe est donc en clair dans le script. Pas super sécure. Si vous lisez le man de hdiutil, vous verrez que l’on peut utiliser des certificats ou des clefs GPG pour chiffrer les images. Ici c’est un cas d’école qui est présenté, à vous de l’améliorer. Nous allons donc passer à hdiutil le mot de passe que nous allons utiliser :

1
echo "mot_de_passe" | /usr/bin/hdiutil create -encryption -stdinpass -srcfolder $DESTINATIONFOLDER /tmp/mon_image.$DATUM.dmg

Fin pour aujourd’hui

Pensez à retourner 0 si le script s’est correctement terminé.

1
exit 0

La suite au prochain épisode

Il nous reste à ajouter la copie distante de l’image. Nous verrons cela la prochaine fois.


Billet Précédent | Billet Suivant

powered by FreeBSD