Salut,
Voici mon script de backup à base de
rsync, écrit à l'aide du
tuto et de ce fil de discussion.
Je l'utilise pour sauvegarder le répertoire utilisateur de mon netbook sur une carte SD formatée en ext2 et définie dans
/etc/fstab de façon à ce qu'elle ne soit montée qu'explicitement; je peux ainsi laisser la carte dédiée dans le lecteur sans qu'elle ne soit montée systématiquement ni visible sur le bureau ou dans les raccourcis.
Le script vérifie la présence de la carte, la monte effectue la sauvegarde et démonte la carte; il écrit un log qui est recopié sur la carte avant le démontage ce qui me permet de conserver un historique des opérations et éventuelles erreurs.
Il fait appel à un script python pour notifier le début et la fin de sauvegarde, ou un problème.
Je le lance pour le moment à l'aide d'un raccourci clavier.
Le script shell de backup:
#!/bin/bash
#------------------------------------------------------------------------------
# Script de sauvegarde de répertoire (utilisateur) sur un disque (amovible)
#------------------------------------------------------------------------------
# Préalable à la mise en œuvre:
# - création d'une partition ext2/3 sur le disque (amovible)
# - chmod 777 ou chown $USER: de la racine de cette partition
# - création dans cette partition d'un répertoire de destination ($USER)
# - définition du montage dans /etc/fstab en noauto et user, e.g:
# UUID=8f294944-6a86-4873-90e1-15fab465a0aa /mnt/sdBackup ext2 noauto,async,noatime,user,rw 0 0
#------------------------------------------------------------------------------
# Variables
# Identifiant du disque et point de montage
SDHC_UUID=8f294944-6a86-4873-90e1-15fab465a0aa
SDHC_MOUNT_POINT=/mnt/sdBackup
# Répertoire source et destination
SRC_DIR=$HOME
DST_DIR=$SDHC_MOUNT_POINT/$USER
# Fichiers de log horodatés
BKP_DATE=`date +"%Y-%m-%d_%H-%M"`
LOG_FILE=/tmp/sdBackup_${BKP_DATE}.log
BKP_LOG_FILE=$SDHC_MOUNT_POINT/sdBackup_${BKP_DATE}.log
# Script de notification
NOTIFY=backup-notify.py
#------------------------------------------------------------------------------
# Programme
# Initialisation du fichier de log
echo "Backup du $BKP_DATE" > $LOG_FILE
echo "Début à `date +'%H:%M:%S'`" >> $LOG_FILE
# Test de la présence du disque de backup
if [[ ! -e /dev/disk/by-uuid/$SDHC_UUID ]]
then
echo "sdhc absente" >> $LOG_FILE
$NOTIFY alert
else
echo "sdhc présente" >> $LOG_FILE
mount $SDHC_MOUNT_POINT >> $LOG_FILE 2>&1
MOUNT_ES=$?
# Test du statut de sortie du montage (0=ok; 32=déjà montée)
if [[ ( $MOUNT_ES -ne 0 ) && ( $MOUNT_ES -ne 32 ) ]]
then
echo "Problème inattendu au montage" >> $LOG_FILE
$NOTIFY alert
else
echo "sdhc montée, backup en cours" >> $LOG_FILE
$NOTIFY start
rsync -av --del --stats \
--filter "- .thumbnails/" \
--filter "- *~" \
--filter "- *.iso" \
--filter "- lost+found/" \
--filter "- .cache/" \
--filter "- tmp/" \
--filter "- *.mp3" \
--filter "- *.log" \
$SRC_DIR/ $DST_DIR/ >> $LOG_FILE 2>&1
RSYNC_ES=$?
# Test du statut de sortie de rsync
if [[ $RSYNC_ES -ne 0 ]]
then
echo "Problème en cours de backup: statut=$RSYNC_ES" >> $LOG_FILE
$NOTIFY alert
else
echo "Fin de backup à `date +'%H:%M:%S'`" >> $LOG_FILE
$NOTIFY end
fi
# Copie du log sur le disque de backup
cp -f $LOG_FILE $BKP_LOG_FILE
# Démontage
umount $SDHC_MOUNT_POINT >> $LOG_FILE 2>&1
MOUNT_ES=$?
# Test du statut de sortie du démontage
if [[ $MOUNT_ES -ne 0 ]]
then
echo "Problème inattendu au démontage" >> $LOG_FILE
$NOTIFY alert
fi
fi
fi
#eof---------------------------------------------------------------------------
Le script python de notification:
#!/usr/bin/env python
# coding=iso-8859-1
#------------------------------------------------------------------------------
# Script de notification appelé par sdBackup
#------------------------------------------------------------------------------
# Largement inspiré des scripts de elmurato, c.f.
# http://forum.eeeuser.com/viewtopic.php?pid=342940#p342940
# http://www.informatik.uni-bremen.de/~elmurato/EeePC/Ubuntu_ACPI_scripts-EeePC_900A_901_1000.tar.gz
#------------------------------------------------------------------------------
# Imports
import pygtk
pygtk.require('2.0')
import pynotify
import sys
import gtk
import os
#------------------------------------------------------------------------------
# Programme
if __name__ == '__main__':
if not pynotify.init("Backup Status"):
print "Unable to initialize Python Notify"
sys.exit(1)
if len(sys.argv) != 2:
print "USAGE: " + sys.argv[0] + " (start|end|alert)"
sys.exit(1)
# icone d'illustration du popup de notification
uri = "file:///usr/share/icons/gnome/scalable/devices/media-flash.svg"
if sys.argv[1] == "start":
n = pynotify.Notification(
"sdBackup",
"Sauvegarde du répertoire utilisateur " +
"<b><span color='blue'>en cours</span></b>. ",
uri)
n.set_timeout(3000)
elif sys.argv[1] == "end":
n = pynotify.Notification(
"sdBackup",
"Sauvegarde du répertoire utilisateur " +
"<b><span color='green'>terminée</span></b>. ",
uri)
n.set_timeout(3000)
elif sys.argv[1] == "alert":
n = pynotify.Notification(
"sdBackup",
"Problème lors de sauvegarde du répertoire utilisateur. \n" +
"<b><span color='red'>Consultez le log!</span></b>. ",
uri)
n.set_timeout(0)
else:
print "USAGE: " + sys.argv[0] + " (start|end|alert)"
sys.exit(1)
if not n.show():
print "Failed to send notification"
sys.exit(1)
#eof---------------------------------------------------------------------------
À+
Édit: corrections dans les scripts
* shell:
- commentaire de mise en œuvre pour écriture à la racine du disque
- majuscules dans les messages de log
- récupération d'un éventuel message de
umount (sortie standard et erreur)
* python:
- accord du participe passé... 😃