210 lines
7.0 KiB
Bash
Executable File
210 lines
7.0 KiB
Bash
Executable File
#!/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
|
|
#--------------------------------------------------------------------------------
|