added sd-backup.sh
This commit is contained in:
parent
3b4b6a38d9
commit
a52a184617
209
sd-backup.sh
Executable file
209
sd-backup.sh
Executable 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
|
||||
#--------------------------------------------------------------------------------
|
Loading…
x
Reference in New Issue
Block a user