Un script de sauvegarde en Python, sous GNU/Linux avec rsync

Il y a quelques temps, j’avais écrit un article expliquant comment réaliser une sauvegarde différencielle avec rsync sous GNU/Linux. J’ai récemment décidé de le réécrire en Python pour plusieurs raisons…

  • J’aime ce langage :-) et ça me permet de progresser.
  • Je ne suis pas un expert en script bash et le script Python m’autorise plus de souplesse ainsi qu’une maintenance plus aisée.

L’idée principale, outre l’utilisation de la sauvegarde différentielle (et donc la notion de snapshots pour pouvoir « remonter dans le temps ») est de pouvoir utiliser plusieurs media. Ainsi en passant un argument en ligne de commande, il est possible de choisir le medium à utiliser. Il peut être de deux types : local (autre disque dur, appareil USB…) ou sur une machine distante via ssh.

Vous pouvez télécharger le script complet. Pensez à changer l’extension .txt en .py !

Quelques explications sur les constantes du début du programme :

  • La variable NICE_LEVEL permet simplement d’indiquer la priorité avec laquelle la copie des données via rsync va être effectuée.
  • On définit ensuite la variable DIR_TO_BACKUP qui va préciser quels sont les répertoires à sauvegarder et ceux à éventuellement exclure.
  • BACKUP_DEST indique les paramètres de la destination vers laquelle les données seront copiées. Il s’agit d’un dictionnaire contenant un autre dictionnaire Python. Le premier identifie les différents media et le second les paramètres relatifs à ce dernier, qui sont :
    • dir : obligatoire indique le répertoire destination (qui doit exister).
    • server : optionnel, adresse du serveur en cas de copie par ssh.
    • port : optionnel, port du serveur en cas de copie par ssh.
    • login : optionnel, login utilisé pour se connecter au serveur en cas de copie par ssh.

    A noter qu’en cas de copie par ssh, je fais l’hypothèse qu’on utilise une clé ssh pour se connecter et qu’il n’y a donc pas besoin de mot de passe.

  • ARCHIVE_NB précise le nombre de sauvegarde à conserver.

Ensuite il y a la fonction backup qui effectue comme son nom l’indique la sauvegarde :

Je n’expliquerai pas ici le détail de la programmation, car il n’y a en principe rien à toucher à ce niveau. Voici les grandes étapes :

  • On commence par supprimer l’archive la plus ancienne.
  • On effectue un décalage des archives : la 1 devient 2, la 2 devient 3 etc.
  • On effectue une copie par hardlink de l’archive 0 vers l’archive 1. Cette technique permet d’éviter une duplication des données et économise beaucoup d’espace. Seules les données inexistantes sont copiées les autres sont des simples liens.
  • Enfin on effectue une synchronisation par rsync entre le(s) répertoire(s) à sauvegarder et l’archive 0.

A noter que pour les opérations sur disque (copie, déplacement…), je n’ai pas utilisé les commandes « natives » Python, car dans le cas d’un serveur distant elles ne sont pas utilisables.

L’analyse des paramètres passées en ligne de commande :

Si vous souhaitez ajouter / supprimer des media, il faudra effectuer des modifications dans la partie __main__ du programme ainsi que dans la traditionnelle fonction usage qui indique les arguments qui peuvent être passés à l’application. Je pense que le code parle de lui-même à ce niveau. A noter simplement que j’ai imposé d’être root pour pouvoir exécuter le programme et ainsi copier des dossiers système, mais il n’y a évidemment pas d’obligation…

Ce script peut très certainement être amélioré, n’hésitez pas à me faire part de vos commentaires.

Vus : 3370
Publié par Marco : 47