#!/bin/bash
# Didier le 14 Septembre 2022
#
# TODO : Inclure un script post et pre. 
#
##################################################### 
#KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
KAZ_ROOT="/kaz"
. $KAZ_ROOT/bin/.commonFunctions.sh
setKazVars
. $DOCKERS_ENV
. $KAZ_ROOT/secret/SetAllPass.sh
VERSION="1.0"
PRG=$(basename $0)
RACINE=$(echo $PRG | awk '{print $1}')
IFS=' '
#
##################################################### 
MAILSOURCE="sauve@kaz.bzh"
VOLUME_SAUVEGARDES="/mnt/backup-nas1"
#SAUVE_REPO=${VOLUME_SAUVEGARDES}/SauveRepo
SAUVE_REPO=admin@nas-kaz1:/share/Backup/SauveRepo
MAIL_RAPPORT="didier@kaz.bzh;francois@kaz.bzh;fab@kaz.bzh;fanch@kaz.bzh"
##################################################### 
SCRIPTLOG="/mnt/disk-nas1/log/${PRG}-$(date +%d-%m-%Y-%H-%M-%S).log"
FICLOG="/var/log/${PRG}.log"
##################################################### 
# - la liste des repertoires à sauver séparés par un espace
LISTREPSAUV="/var/lib/docker/volumes /kaz"
##################################################### 
# - Les sauvegardes à garder jour, semaines, mois
NB_BACKUPS_JOUR=15
NB_BACKUPS_SEM=8
NB_BACKUPS_MOIS=12
##################################################### 
# Recevoir un mail quand la sauvegarde est OK ?
MAILOK=true
##################################################### 

trap 'LogFic "script stoppé sur un SIGTERM ou SIGINT" >&2; exit 2' INT TERM

LogFic() {
        [ ! -w ${FICLOG} ] && { echo "Probleme d' ecriture dans $FICLOG" ; exit 1 ;}
        echo "$(date +%d-%m-%Y-%H-%M-%S) : $1" >> ${FICLOG}
}
#
ExpMail() {
	MAIL_SOURCE=$1
	MAIL_SUJET=$2
	MAIL_DEST=$3
	MAIL_TEXTE=$4
        docker exec -i mailServ mailx -a 'Content-Type: text/plain; charset="UTF-8"' -r ${MAIL_SOURCE} -s "${MAIL_SUJET}" ${MAIL_DEST} << EOF 
        ${MAIL_TEXTE}
EOF
}
Sauvegarde() {
	#$1 est le repertoire à sauver, on créé le sous repertoire dans le repo
	CODE_TMP=""
	if [ -r $1 ]
	then
		echo "Sauvegarde $1" >>${SCRIPTLOG}
		#mkdir -p ${SAUVE_REPO}/$1 >/dev/null 2>&1
		#rdiff-backup --verbosity 3 $1 ${SAUVE_REPO}/$1 >>${SCRIPTLOG} 2>>${SCRIPTLOG}
		rsync -aAHXh --del --stats --exclude 'files_trashbin' $1 ${SAUVE_REPO} >>${SCRIPTLOG} 2>>${SCRIPTLOG}
		CODE_TMP=$?
	else
		LogFic "$1 n' existe pas ou n' est pas accessible en lecture"
		CODE_TMP=1
	fi
	LogFic "Code Retour de la sauvegarde de $1 : ${CODE_TMP}"
	BACKUP_EXIT=$(expr ${BACKUP_EXIT} + ${CODE_TMP} )
}
#
Purge() {
	echo "Commande prune de rdiff-backup"
	PRUNE_EXIT=$?
}
# ****************************************************** Main *******************************************************************
# Création du fichier de log
touch ${FICLOG} 
#
LogFic "#########################################################################################################################"
LogFic "                         ***************  ${PRG} Version ${VERSION}  ***************"
LogFic "#########################################################################################################################"
# test si les variables importantes sont renseignées et sortie si tel n' est pas le cas
if [ -z "${VOLUME_SAUVEGARDES}" ] || [ -z "${SAUVE_REPO}" ]
then
	echo "VOLUME_SAUVEGARDES et SAUVE_REPO à verifier"
	LogFic "VOLUME_SAUVEGARDES et SAUVE_REPO à verifier"
	LogFic "Sortie du script"
	exit 1
fi

#####################################################################################################################################################
################### Mise en commentaire de cette section puisque le repo est en rsync ( voir plus tard comment gérer ça )
# test si le volume de sauvegarde est ok
#grep "${VOLUME_SAUVEGARDES}" /etc/mtab >/dev/null 2>&1 
#if [ "$?" -ne "0" ]
#then 
#	echo "le volume de sauvegarde ${VOLUME_SAUVEGARDES} n' est pas monté"
#	LogFic "Erreur de montage du volume ${VOLUME_SAUVEGARDES} de sauvegarde"  
#	exit 1
#fi
# Test si j' ai le droit d' écrire dans le Repo
# [ ! -w ${SAUVE_REPO} ] && { echo "Verifier le droit d' écriture dans ${SAUVE_REPO}" ; LogFic "Verifier le droit d' écriture dans ${SAUVE_REPO}"; exit 1;}
#####################################################################################################################################################

#  Tout se passe bien on continue
LogFic " - Repertoire a sauver : ${LISTREPSAUV}"
#LogFic " - Volume Nfs monté : ${VOLUME_SAUVEGARDES}"
LogFic " - Destination des sauvegardes : ${SAUVE_REPO}"
LogFic " - Rapport par Mail : ${MAIL_RAPPORT}"
#LogFic " - Backups jour : ${NB_BACKUPS_JOUR} , Backups semaines : ${NB_BACKUPS_SEM} , Backups mois : ${NB_BACKUPS_MOIS}"
LogFic "#########################################################################################################################"
LogFic " - Démarrage de la sauvegarde"
LogFic " - Log dans ${SCRIPTLOG}"
BACKUP_EXIT=0
PRUNE_EXIT=0
for REPS in ${LISTREPSAUV}
do
	LogFic "Sauvegarde de ${REPS}"
	Sauvegarde ${REPS}
done
LogFic "Code retour compilé de toutes les sauvegardes : ${BACKUP_EXIT}"
################################## a gérer plus tard
#LogFic " - Démarrage du nettoyage des sauvegardes"
#Purge
#LogFic " - Code retour du Nettoyage des sauvegardes (0=OK; 1=WARNING, 2=ERROR)  : ${PRUNE_EXIT}"
#
########################################################################################
# On teste le code retour de la sauvegarde, on log et on envoie des mails
case "${BACKUP_EXIT}" in
	'0' )
		IFS=''
		MESS_SAUVE_OK="
Salut

La sauvegarde est ok, ce message peut être enlevé avec la variable MAILOK=false
Que la force soit avec toi

Ton esclave des sauvegardes"
		LogFic " - la sauvegarde est OK"
		[ "$MAILOK" = true ] && ExpMail ${MAILSOURCE} "Sauvegarde Ok" ${MAIL_RAPPORT} ${MESS_SAUVE_OK}
		IFS=' '
		;;
	* )
		IFS=''
		MESS_SAUVE_ERR="
Salut

La sauvegarde est en Erreur 
Le log à consulter est ${SCRIPTLOG}
Code retour de la Sauvegarde ( code Rsync ): ${BACKUP_EXIT}

Ton esclave des sauvegardes"
		LogFic " - !!!!! Sauvegarde en Erreur !!!!!"
		ExpMail ${MAILSOURCE} "!!!! Sauvegarde en Erreur !!!!" ${MAIL_RAPPORT} ${MESS_SAUVE_ERR}
		IFS=' '
		;;
esac
LogFic " - Fin de la sauvegarde"
