Activité : Réaliser un script de backup

Situation

En tant que web master, vous êtes chargé d’assurer la sauvegarde du cms de votre entreprise.

Consigne

Vous devez réaliser un script de sauvegarde qui suit un schéma rotation des sauvegarde communément appeléGrandfather-Father-Son ou GFS. Ce schéma de sauvegarde demande d’avoir trois jeux de sauvegardes : un jeu de sauvegarde journalière, un jeu de sauvegardes hebdomadaires, et un jeu de sauvegardes mensuelles.

Le script est exécuté chaque jour et doit se comporter comme suit :

  • Si c’est le premier janvier, le script effectue la sauvegarde annuelle ;
  • sinon, si c’est le premier d’un autre mois, le script effectue une sauvegarde mensuelle ;
  • sinon, si c’est samedi, le script effectue une sauvegarde hebdomadaire ;
  • sinon, le script effectue une sauvegarde journalière.

Le nom des fichiers de sauvegarde journalière doit avoir le format suivant :

<nom du site>-<nom du jour>.tar.gz

Le nom des fichiers de sauvegarde hebdomadaire doit avoir le format suivant :

<nom du site>-semaine-<numéro de la semaine du mois>.tar.gz

Puisque le premier de chaque mois est le jour de la sauvegarde mensuelle, il y a au plus, quatre samedi dans un mois. Les semaines du mois sont donc numéroté de 1 à 4. Si un mois de février d’une année non bissextile commence par un samedi, il n’y aura que trois sauvegardes hebdomadaires.

Le nom des fichiers de sauvegarde mensuelle doit avoir le format suivant :

<nom du site>-<nom du mois>.tar.gz

Le nom des fichiers de sauvegarde annuelle doit avoir le format suivant :

<nom du site>-<année sur quatre chiffre>.tar.gz

À chaque fois que le script est exécuté, il doit laisser une trace dans un fichier de log en spécifiant la date et l’heure du début, la date et l’heure de la fin, le type de backup effectué, le nom du fichier et le résultat de l’exécution.

Objectifs

À la fin de ce travail, vous devez :

  1. Connaître la notion de substitution de commande (command substitution) en bash.
  2. Savoir rediriger la sortie standard d’une commande dans un fichier sans remplacer le contenu du fichier avec >>
  3. Connaître quelques-unes des possibilités de la commande date.

Résultat attendu

  • Un bref rapport qui décrit votre travail et votre démarche.
  • Votre script Bash.

Ressources

Document:

Logiciel :

Mise en route

Pour réaliser ce script, on a besoin de pouvoir d’une part déterminer un certain nombre de choses. D’abord, pour créer le nom du fichier de la sauvegarde journalière on doit connaître le jour de la semaine au moment de l’exécution du script. Pour cela, la commande datepeut nous aider.

Essayer les commandes suivantes :

1
2
dev@vmdev:~/projects/site-backup$ date +%A
dev@vmdev:~/projects/site-backup$ date +%u
Fig. 1 – Obtenir le jour de la semaine

Sans arguments, la commande date renvoie la date courante. Le signe + permet de spécifier le format dans lequel on souhaite voir la date s’afficher. Dans l’exemple ci-dessus, la séquence %A signifie que l’on veut voir uniquement le nom complet du jour alors que la séquence %usignifie qu’on ne veut voir que le numéro du jour de la semaine, 1 représentant le lundi.

On peut spécifier des formats plus complexes en combinant plusieurs séquences comme le montre la figure 2. Dans cet exemple, on utilise %Y pour afficher la date sur quatre chiffres, %m pour afficher la date sur deux chiffres et %d pour afficher le jour du mois sur deux chiffres également. Les caractères - sont affichés tels quels.

1
dev@vmdev:~/projects/site-backup$ date +%Y-%m-%d
Fig. 2 – Afficher la date au format ISO 8601

La commande date a encore bien d’autres possibilités. Par exemple, si l’on veut savoir quelle était la date deux jours plus tôt, on peut utiliser l’une des commandes suivantes :

1
2
dev@vmdev:~/projects/site-backup$ date -d "2 day ago"
dev@vmdev:~/projects/site-backup$ date -d "-2 day"
Fig. 3 – Afficher la date d’avant-hier

On peut bien sûr combiner l’argument -d et la spécification d’un format. Par exemple, pour connaître le jour d’une date donnée :

1
dev@vmdev:~/projects/site-backup$ date -d "2017-01-01T00:00:00" +%A
Fig. 4 – Quel jour était le premier de l'an ?

Pouvoir afficher la date comme on le souhaite, c’est bien, mais pour faire un script, on a besoin d’avoir ces informations sous forme de chaînes de caractères que l’on peut utiliser pour construire un nom de fichier ou prendre une décision. C’est ici qu’intervient la notion de substitution de commande.

La substitution de commande permet de construire des chaînes de caractères à partir de la sortie standard d’un programme. La syntaxe générale est la suivante : $(ligne_de_commandes). Dans l’exemple suivant, on affecte une chaîne qui représente la date courante au format ISO 8601 à la variable date_iso, puis on crée une nouvelle chaîne en utilisant la valeur de cette variable avant de l’afficher.

1
2
3
dev@vmdev:~/projects/site-backup$ date_iso=$(date +%Y%m%d)
dev@vmdev:~/projects/site-backup$ nom_fichier="sauvegarde_${date_iso}.tar.gz"
dev@vmdev:~/projects/site-backup$ echo $nom_fichier
Fig. 5 – Affecter la date à une variable

Vous êtes maintenant armé pour accomplir votre tâche. Créez un répertoire pour votre projet et commencez à coder. N’essayez pas de faire un script complet d’un seul coup, faites de petites étapes et essayez. Il n’est pas nécessaire de réellement faire un backup, une commande echo qui dit que le backup est fait peut suffire. Si vous souhaitez vraiment effectuer le backup, vous pouvez utiliser la commande tar.