added sd-backup.sh

This commit is contained in:
Vezpi 2020-03-01 14:44:43 +01:00
parent 3b4b6a38d9
commit a52a184617

209
sd-backup.sh Executable file
View File

@ -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 <n> 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
#--------------------------------------------------------------------------------