#!/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 #--------------------------------------------------------------------------------