Aaaaah, les sauvegardes !!!
Tout le monde est d'accord pour dire que faire des sauvegardes est nécessaire, personne ne les fait et au final tout le monde s'en mord les doigts le jour ou par malheur, le disque dur crâme. Moi le premier.
Amis Linuxiens, agissons ! Tous ensemble, disons non aux pertes de données pour cause de flemme de sauvegarder !
Voici donc ma contribution à la résolution de ce problème: un script permettant de faire des sauvegardes. Le problème majeur restant l'interface chaise/clavier, ce script permet de faire des sauvegardes automatiquement (il suffit de le mettre dans la crontab).
Ce script fonctionne de 2 manières différentes:
1) En mode manuel. On le lance sans argument ("sauvegardeSysteme.sh"), il sauvegarde votre home sur un disque dur externe. Si le disque n'est pas branché, il vous jette. Un fichier de log est mis à jour.
2) En mode automatique, typiquement appelé depuis la crontab, avec le paramètre "auto" ("sauvegardeSysteme.sh auto").
Dans ce mode, le script effectue 2 types de sauvegardes:
- Une sauvegarde journalière (il synchronise le home si la dernière synchro date de plus de 24h).
- Une sauvegarde mensuelle (il synchronise le home dans un second dossier tout les mois). Le but de la sauvegarde mensuelle est d'éviter de perdre un fichier que l'on a effacé par erreur. C'est un bonus.
Dans tous les cas, un fichier de log est mis à jour.
Voici le script en question:
#!/bin/bash
REPERTOIRE_SOURCE="/home/"
REPERTOIRE_DESTINATION="/media/sauvegarde/home/"
REPERTOIRE_DESTINATION_LONG="/media/sauvegarde/homeLongTerme/"
LOG="/media/sauvegarde/home/sauvegarde.log"
LOGLONG="/media/sauvegarde/homeLongTerme/sauvegarde.log"
ERREUR="/media/sauvegarde/home/error.log"
ERREURLONG="/media/sauvegarde/homeLongTerme/error.log"
# Détecter la présence du volume de destination et interrompre l'opération si nécessaire, avec message d'erreur en cas de lancement manuel
if [ ! -e "$REPERTOIRE_DESTINATION" ]
then
if [ -z $1 ]; then echo "Attention, le disque de sauvegarde n'est pas présent"
fi
exit 0
fi
if [ -z $1 ]
#Si mode manuel, on regarde le temps depuis la dernière sauvegarde et on propose une sauvegarde
then
#Recupération de la date de la dernière sauvegarde, en secondes Unix
let "lastSauvegarde = `tail -n 1 $LOG`"
let "delai = `date +%s` - lastSauvegarde"
let "delaiJour = delai/86400"
let "delaiHeure = (delai - delaiJour*86400)/3600"
echo "La dernière sauvegarde a été effectuée il y a $delaiJour jours $delaiHeure heures"
read -p 'Effectuer une nouvelle sauvegarde o/n ? : ' answer
if [ $answer = "o" ] || [ $answer = "O" ]
then
echo "Sauvegarde en cours..."
#Sauvegarde
rsync -a --copy-links --stats --progress --delete --filter "- .thumbnails/" --filter "- .Trash/" --filter "- *.tmp" --filter "- *.iso" --filter "- lost+found/" --filter "- .cache/" --filter "- .CACHE" --filter "- Cache/" --filter "- *.log" "$REPERTOIRE_SOURCE" "$REPERTOIRE_DESTINATION"
#Mise à jour du fichier de log court terme
echo "" >> $LOG
echo "Dernière sauvegarde effectuée manuellement le:" >> $LOG
date >> $LOG
date +%s >> $LOG
else
echo "Sortie sans sauvegarder"
fi
echo "Fin de la commande de sauvegarde. Sortie du programme"
exit 0
elif [ $1=="auto" ]
then
#Si lancement auto, on regarde si il s'est écoulé un temps suffisant depuis la dernière sauvegarde
#Recupération de la date de la dernière sauvegarde, en secondes Unix
let "lastSauvegarde = `tail -n 1 $LOG`"
let "delai = `date +%s` - lastSauvegarde"
if [ $delai -gt 86400 ]
then
#Sauvegarde si le délai est de plus de 24h
rsync -aq --copy-links --progress --delete --filter "- .thumbnails/" --filter "- .Trash/" --filter "- *.tmp" --filter "- *.iso" --filter "- lost+found/" --filter "- .cache/" --filter "- .CACHE" --filter "- Cache/" --filter "- *.log" "$REPERTOIRE_SOURCE" "$REPERTOIRE_DESTINATION" >> /dev/null 2> $ERREUR
#Mise à jour du fichier de log court terme
echo "" >> $LOG
echo "Dernière sauvegarde effectuée automatiquement le:" >> $LOG
date >> $LOG
date +%s >> $LOG
#Et gestion des erreurs:
if [ -s $ERREUR ]; then echo "Il y a eu des erreurs !" >> $LOG
fi
fi
#On vérifie si on écrase les données long termes, mode auto uniquement
#Recupération de la date de la dernière sauvegarde, en secondes Unix
let "lastSauvegarde = `tail -n 1 $LOGLONG`"
let "delai = `date +%s` - lastSauvegarde"
if [ $delai -gt 2592000 ]
then
#On sauvegarde si le délai est de plus de 1 mois
rsync -aq --copy-links --progress --delete --filter "- .thumbnails/" --filter "- .Trash/" --filter "- *.tmp" --filter "- *.iso" --filter "- lost+found/" --filter "- .cache/" --filter "- .CACHE" --filter "- Cache/" --filter "- *.log" "$REPERTOIRE_SOURCE" "$REPERTOIRE_DESTINATION_LONG" >> /dev/null 2> $ERREURLONG
#Et mise à jour du fichier de log
echo "" >> $LOGLONG
echo "Dernière sauvegarde complète effectuée le:" >> $LOGLONG
date >> $LOGLONG
date +%s >> $LOGLONG
#Et gestion des erreurs
if [ -s $ERREURLONG ]; then echo "Il y a eu des erreurs !" >> $LOGLONG
fi
fi
else
exit 0
fi
#Fin du programme
exit 0
Voilà, n'hésitez pas à commenter ce code, il est très certainement améliorable (c'est en effet mon premier script bash !)