From a52a1846171eb1848449ac4f65e895bd424548e5 Mon Sep 17 00:00:00 2001 From: Vezpi Date: Sun, 1 Mar 2020 14:44:43 +0100 Subject: [PATCH] added sd-backup.sh --- sd-backup.sh | 209 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100755 sd-backup.sh diff --git a/sd-backup.sh b/sd-backup.sh new file mode 100755 index 0000000..82a72f6 --- /dev/null +++ b/sd-backup.sh @@ -0,0 +1,209 @@ +#!/bin/bash + +# Importation des fonctions externes +. /home/vezpi/.local/lib/V_init_function + +# Déclaration des variables +LOG=/var/log/sd-backup.log +VERSION=1.9.2 + +# Répertoire local des sauvegardes +SAVEDIR=/backup +# Répertoire cible des sauvegardes +ARCHDIR=/media/HDDUSB/sd-backup +# Base du nom des archives +ARCHBASE="backup_" +# Nom de l'archive final +ARCHNAME="$ARCHBASE$(date +"%d%m%Y")" +# Suffixe temporaire de l'archive +TIMESTAMP=`date +"%d%m%Y_%H%M%S"` +# Fichiers temporaires +FTMP=/tmp/paquets +FTMP[1]="$SAVEDIR/$ARCHBASE$TIMESTAMP.tar" +# Liste des fichiers/répertoires à sauvegarder +LIST=/home/vezpi/script/sd-backup/file_to_save +# Compteur d'erreur +FAIL=0 + +# Déclaraition des fonctions + +#-------------------------------------------------------------------------------- +# Sauvegarde $TOSAVE en une archive ${FTMP[1]} ($SAVEDIR/$ARCHBASE$TIMESTAMP.tar) +#-------------------------------------------------------------------------------- +function Sauvegarde { + V_log -t "Sauvegarde $LOGGING... \c" + cd "${TOSAVE%/*}/" # Se déplace dans le répertoire parent du répertoire à sauvegarder + if [[ -f "${FTMP[1]}" ]]; then # Crée l'archive temporaire si elle n'existe pas, sinon l'ajoute à l'achive + tar rf "${FTMP[1]}" --exclude='*.log*' "${TOSAVE##*/}" || return 1 + else + tar cf "${FTMP[1]}" --exclude='*.log*' "${TOSAVE##*/}" || return 1 + fi + return 0 +} + +#-------------------------------------------------------------------------------- + +# Préparation à recevoir des signaux d'interruption +trap 'V_log "\033[31;1mInterruption\033[0m"; V_log -t -q "==== Interruption du processus de sauvegarde $TYPE_SAVE ===="; V_exit 1' INT TERM + +# Test de l'utilisateur +[ $(whoami) = 'root' ] || V_exit -e "Permission non accordée, à lancer en root." 1 + +# Gestion des options +while getopts ":DhVven:l:t:aofb" OPTION; do + # Message de mauvaise option + VV_OPTION="" + V_option "$0" + case $OPTION in + # Edite la liste des répertoires à sauvegarder + e) vi $LIST + V_exit $? + ;; + # Change le nom de la sauvegarde (et empêche la rotation des sauvegardes) + n) ARCHNAME=$OPTARG + NO_SUPPRESSION=0 + ;; + # Affiche les dernières logs + l) tac $LOG | grep '#\{10\}' -m $OPTARG -B 20 | tac | sed -e '1d' -e 's/#\{10\}/ /g' + V_exit $? + ;; + # Change le dossier cible de la sauvegarde + t) SAVEDIR="$OPTARG" + FTMP[1]="$SAVEDIR/$ARCHBASE$TIMESTAMP.tar" + NO_SUPPRESSION=0 + ;; + # Affiche l'arborescence du fichier de sauvegarde + a) tree $ARCHDIR + V_exit $? + ;; + # Affiche la taille et le nom de la sauvegarde + o) ls -lth $SAVEDIR | head -2 | tail -1 | awk '{print $5,$9}' + V_exit $? + ;; + # Force la sauvegarde + f) FORCE=0 + ;; + # Lance en arrière-plan + b) PREVOPT="$(echo "$@" | sed 's/ -b//')" + nohup sd-backup -f $PREVOPT > /dev/null 2>&1 & + V_exit -k + ;; + :) # Si -n n'a pas d'argument associe, demande le nom de l'archive + [ $OPTARG = "n" ] && { echo "Nom de l'archive ?"; read ARCHNAME < /dev/tty;} + # Si -l n'a pas d'argument associe, affiche uniquement la dernière sauvegarde + [ $OPTARG = "l" ] && { tac $LOG | grep '#\{10\}' -m 1 -B 20 | tac | sed '1d'; V_exit $?;} + # Si -t n'a pas d'argument associe, sort du script + [ $OPTARG = "t" ] && { echo "Destination manquante, annulation."; V_exit 1;} + ;; + esac +done + +# Type de sauvegarde +if [ "$0" = "/home/vezpi/bin/sd-backup" ]; then # Si la sauvegarde a été lancé manuellement, intéraction avec l'utilisateur + TYPE_SAVE=manuelle + if [ ! $FORCE ]; then + echo -e "Voulez-vous lancer la sauvegarde ? (o/n) \c" + read -n 1 CHOIX < /dev/tty + case $CHOIX in + o|O|y|Y) echo "" + ;; + * ) V_exit -e "\nAbandon." + ;; + esac + fi + [ ! $VERBOSE ] && echo -e "Sauvegarde en cours \c" +else # Sinon automatique + TYPE_SAVE=automatique +fi + +#-------------------------------------------------------------------------------- +# Début du script +#-------------------------------------------------------------------------------- + +V_log -q "##########" +V_log -t -q "==== Début du processus de sauvegarde $TYPE_SAVE du $(date +"%d/%m/%y") ====" + +# Test du répertoire de destination de l'archive +[[ -d $SAVEDIR ]] || { V_log -t "Dossier de destination $SAVEDIR introuvable."; V_exit -l "[$(date +"%T")] ==== Fin du processus de sauvegarde $TYPE_SAVE ====" 1;} + + +# Récupération de la liste des paquets +dpkg --get-selections > $FTMP || V_exit -e "Sauvegarde de la liste des paquets impossible." 1 + +# Dump de la base de données des mots de passes +/root/bin/pw -s + +# Sauvegarde de la liste des fichiers/répertoires définis dans la liste +while read TOSAVE LOGGING; do + if Sauvegarde; then + V_log "\033[32;1mOK\033[0m." + [ $TYPE_SAVE = "manuelle" ] && [ ! $VERBOSE ] && echo -e ".\c" + else + ((FAIL++)) + V_log "\033[31;1mErreur\033[0m." + [ $TYPE_SAVE = "manuelle" ] && [ ! $VERBOSE ] && echo -e "!\c" + fi +done < $LIST + +# Compression de l'archive en gzip +V_log -t "Compression de l'archive... \c" +if gzip -1 "${FTMP[1]}"; then + V_log "\033[32;1mOK\033[0m." +else + V_log "\033[31;1mErreur\033[0m." + ((FAIL++)) +fi + +# Nommage de l'archive en .tgz +V_log -t "Renommage de l'archive... \c" +if mv "${FTMP[1]}".gz "$SAVEDIR/$ARCHNAME".tgz; then + V_log "\033[32;1mOK\033[0m." +else + V_log "\033[31;1mErreur\033[0m." + ((FAIL++)) +fi + +# Nettoyage du dossier de sauvegarde temporaire des anciennes sauvegardes +if [[ $FAIL -eq 0 ]]; then + find $SAVEDIR -maxdepth 1 ! -name "$ARCHNAME.tgz" -type f | xargs rm 2> /dev/null +fi + +if [ -d $ARCHDIR ]; then + # Rotation des anciennes sauvegardes si pas d'erreurs lors des sauvegardes + if [[ $FAIL -eq 0 ]]; then + # Rotations des sauvegardes + if [ ! $NO_SUPPRESSION ]; then + V_log -t "Rotation des anciennes archives... \c" + for DAY in 01 05 10 15 20 25 30; do + # Déplace les sauvegardes du 01 05 10 15 20 25 30 du mois qui ont plus de 5 jours dans le dossier oldbackup + find $ARCHDIR -maxdepth 1 ! -name "*$TIMESTAMP*" -name "$ARCHBASE$DAY*" -type f -mtime +4 | xargs mv -t $ARCHDIR/oldbackup 2> /dev/null + # Supprime les sauvegardes du 05 10 15 20 25 30 du mois qui ont plus de 30 jours du dossier oldbackup + [ ! $DAY = 01 ] && find $ARCHDIR/oldbackup -maxdepth 1 -name "$ARCHBASE$DAY*" -mtime +30 -type f | xargs rm 2> /dev/null + done + # Supprime les sauvegardes de plus de 5 jours + find $ARCHDIR -maxdepth 1 ! -name "*$TIMESTAMP*" -name "$ARCHBASE*" -type f -mtime +4 | xargs rm 2> /dev/null + V_log "\033[32;1mOK\033[0m." + fi + else + V_log -t "Une erreur est survenue lors d'une sauvegarde, pas de rotation des anciennes archives." + fi + + # Copie de l'archive sur un disque externe + V_log -t "Copie de l'archive sur le disque externe... \c" + if cp "$SAVEDIR/$ARCHNAME.tgz" "$ARCHDIR"; then + V_log "\033[32;1mOK\033[0m." + else + V_log "\033[31;1mErreur\033[0m." + fi +else + V_log -t "\033[31;1mAttention !\033[0m Dossier de destination $ARCHDIR introuvable." +fi + +[ $TYPE_SAVE = "manuelle" ] && [ ! $VERBOSE ] && echo -e "\033[32;1m OK\033[0m." +V_log -t -q "==== Fin du processus de sauvegarde $TYPE_SAVE ====" + +V_exit + +#-------------------------------------------------------------------------------- +# Fin du script +#--------------------------------------------------------------------------------