first commit
This commit is contained in:
385
bin/scriptBorg.sh
Executable file
385
bin/scriptBorg.sh
Executable file
@ -0,0 +1,385 @@
|
||||
#!/bin/bash
|
||||
# --------------------------------------------------------------------------------------
|
||||
# Didier
|
||||
#
|
||||
# Script de sauvegarde avec BorgBackup
|
||||
# la commande de creation du dépot est : borg init --encryption=repokey /mnt/backup-nas1/BorgRepo
|
||||
# la conf de borg est dans /root/.config/borg
|
||||
# Le repository peut etre distant: BORG_REPO='ssh://user@host:port/path/to/repo'
|
||||
# la clé ssh devra être copiée sur le site distant et l' init se fera sous la forme
|
||||
# borg init --encryption=repokey ssh://user@host:port/path/to/repo
|
||||
# la clé est modifiable avec la commande borg key change-passphrase
|
||||
# toutes les variables sont dans la config générale de KAZ
|
||||
# scripts PRE et Post
|
||||
# les script pre et post doivent s' appelle pre_xxxxx.sh ou post_xxxx.sh
|
||||
# La variable BORGSCRIPTS est le chemin du repertoire des scripts dans la config générale de Kaz
|
||||
#####################################################
|
||||
#KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
|
||||
KAZ_ROOT=/kaz
|
||||
. $KAZ_ROOT/bin/.commonFunctions.sh
|
||||
setKazVars
|
||||
. $DOCKERS_ENV
|
||||
. $KAZ_ROOT/secret/SetAllPass.sh
|
||||
|
||||
VERSION="V-18-05-2024"
|
||||
PRG=$(basename $0)
|
||||
RACINE=$(echo $PRG | awk '{print $1}')
|
||||
#IFS=' '
|
||||
#####################################################
|
||||
# Variables générales
|
||||
#####################################################
|
||||
# le volume monté ou sera le repo
|
||||
# impérativement laisser vide dans le cas d' un repo distant
|
||||
VOLUME_SAUVEGARDES=${borg_VOLUME_SAUVEGARDES}
|
||||
# le repo Borg
|
||||
export BORG_REPO=${borg_BORG_REPO}
|
||||
# Le mot de passe du repo
|
||||
export BORG_PASSPHRASE=${borg_BORG_PASSPHRASE}
|
||||
# les personnes qui recevront le rapport de sauvegarde
|
||||
MAIL_RAPPORT=${borg_MAIL_RAPPORT}
|
||||
# Recevoir un mail quand la sauvegarde est OK ?
|
||||
MAILOK=${borg_MAILOK}
|
||||
MAILWARNING=${borg_MAILWARNING}
|
||||
MAILDETAIL=${borg_MAILDETAIL}
|
||||
# repertoire de montage des sauvegardes pour les restaurations
|
||||
BORGMOUNT=${borg_BORGMOUNT}
|
||||
# - la liste des repertoires à sauver séparés par un espace
|
||||
LISTREPSAUV=${borg_LISTREPSAUV}
|
||||
# - Les sauvegardes à garder jour, semaines, mois
|
||||
NB_BACKUPS_JOUR=${borg_NB_BACKUPS_JOUR}
|
||||
NB_BACKUPS_SEM=${borg_NB_BACKUPS_SEM}
|
||||
NB_BACKUPS_MOIS=${borg_NB_BACKUPS_MOIS}
|
||||
# Le Repertoire ou sont les pré traitement
|
||||
BORGSCRIPTS=${borg_BORGSCRIPTS}
|
||||
BORGLOG="${borg_BORGLOG}/BorgBackup-$(date +%d-%m-%Y-%H-%M-%S).log"
|
||||
DEBUG=false
|
||||
|
||||
#####################################################
|
||||
#
|
||||
FICLOG="/var/log/${PRG}.log"
|
||||
|
||||
#####################################################
|
||||
|
||||
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
|
||||
# a mettre ailleurs
|
||||
mailexp=${borg_MAILEXP}
|
||||
mailpassword=${borg_MAILPASSWORD}
|
||||
mailserveur=${borg_MAILSERVEUR}
|
||||
#
|
||||
#sendemail -t ${MAIL_DEST} -u ${MAIL_SUJET} -m ${MAIL_TEXTE} -f $mailexp -s $mailserveur:587 -xu $mailexp -xp $mailpassword -o tls=yes >/dev/null 2>&1
|
||||
printf "Subject:${MAIL_SUJET}\n${MAIL_TEXTE}" | msmtp ${MAIL_DEST}
|
||||
#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
|
||||
}
|
||||
|
||||
Pre_Sauvegarde() {
|
||||
if [ -d ${BORGSCRIPTS} ]
|
||||
then
|
||||
cd ${BORGSCRIPTS}
|
||||
for FicPre in $(ls )
|
||||
do
|
||||
if [ -x ${FicPre} ] && [ $(echo ${FicPre} | grep -i ^pre_) ]
|
||||
then
|
||||
LogFic " - Pré traitement de la sauvegarde : ${FicPre}"
|
||||
[ "$DEBUG" = true ] && echo " - Pré traitement de la sauvegarde : ${FicPre}"
|
||||
./${FicPre}
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
Post_Sauvegarde() {
|
||||
if [ -d ${BORGSCRIPTS} ]
|
||||
then
|
||||
cd ${BORGSCRIPTS}
|
||||
for FicPre in $(ls )
|
||||
do
|
||||
if [ -x ${FicPre} ] && [ $(echo ${FicPre} | grep -i ^post_) ]
|
||||
then
|
||||
LogFic " - Post traitement de la sauvegarde : ${FicPre}"
|
||||
[ "$DEBUG" = true ] && echo " - Post traitement de la sauvegarde : ${FicPre}"
|
||||
./${FicPre}
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
Sauvegarde() {
|
||||
Pre_Sauvegarde
|
||||
BACKUP_PRE=$?
|
||||
borg create \
|
||||
--filter AME \
|
||||
--exclude-caches \
|
||||
--stats \
|
||||
--show-rc \
|
||||
--exclude 'home/*/.cache/*' \
|
||||
--exclude 'var/tmp/*' \
|
||||
::$(date +%Y-%m-%d-%H-%M-%S-%A)-{hostname} \
|
||||
${LISTREPSAUV} >>${BORGLOG} 2>>${BORGLOG}
|
||||
BACKUP_EXIT=$?
|
||||
Post_Sauvegarde
|
||||
BACKUP_POST=$?
|
||||
}
|
||||
|
||||
Purge() {
|
||||
borg prune \
|
||||
--prefix '{hostname}-' \
|
||||
--keep-daily ${NB_BACKUPS_JOUR} \
|
||||
--keep-weekly ${NB_BACKUPS_SEM} \
|
||||
--keep-monthly ${NB_BACKUPS_MOIS} \
|
||||
|
||||
PRUNE_EXIT=$?
|
||||
}
|
||||
|
||||
Compact() {
|
||||
|
||||
borg compact --progress ${BORG_REPO}
|
||||
|
||||
}
|
||||
|
||||
usage() {
|
||||
|
||||
echo "-h : Usage"
|
||||
echo "-c : Permet de compacter ${BORG_REPO}"
|
||||
echo "-d : Permet de verifier les variables de sauvegarde"
|
||||
echo "-i : Mode interractif"
|
||||
echo "-l : Liste les sauvegardes sans monter ${BORG_REPO}"
|
||||
echo "-m : Monte le REPO (${BORG_REPO} sur ${BORGMOUNT})"
|
||||
echo "-p : Permet de lancer la phase de purge des backup en fonctions des variables: jour=${NB_BACKUPS_JOUR},semaine=${NB_BACKUPS_SEM},mois=${NB_BACKUPS_MOIS}"
|
||||
echo "-s : Lance la sauvegarde"
|
||||
echo "-u : Demonte le REPO (${BORG_REPO} de ${BORGMOUNT})"
|
||||
echo "-v : Version"
|
||||
exit
|
||||
}
|
||||
|
||||
Borgvariables() {
|
||||
echo "-----------------------------------------------------------"
|
||||
echo " Variables applicatives pour le site ${site}"
|
||||
echo "-----------------------------------------------------------"
|
||||
for borgvar in $(set | grep borg_ | sed -e 's/borg_//' -e 's/=.*$//' | grep ^[A-Z])
|
||||
do
|
||||
echo "$borgvar=${!borgvar}"
|
||||
done
|
||||
if grep borgfs /etc/mtab >/dev/null 2>&1
|
||||
then
|
||||
echo -e "${RED}WARNING${NC}: ${BORG_REPO} est monté sur ${BORGMOUNT}"
|
||||
fi
|
||||
}
|
||||
|
||||
Borgmount() {
|
||||
LogFic "Montage du repo ${BORG_REPO} sur ${BORGMOUNT} .. "
|
||||
echo -en "Montage du repo ${BORG_REPO} sur ${BORGMOUNT} .. "
|
||||
borg mount ${BORG_REPO} ${BORGMOUNT} >/dev/null 2>&1
|
||||
if [ $? = 0 ]
|
||||
then
|
||||
LogFic "Ok"
|
||||
echo -e "${GREEN}Ok${NC}"
|
||||
else
|
||||
LogFic "Error"
|
||||
echo -e "${RED}Error $?${NC}"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
Borgumount() {
|
||||
LogFic "Demontage du repo ${BORG_REPO} sur ${BORGMOUNT} .. "
|
||||
echo -en "Demontage du repo ${BORG_REPO} sur ${BORGMOUNT} .. "
|
||||
borg umount ${BORGMOUNT} >/dev/null 2>&1
|
||||
if [ $? = 0 ]
|
||||
then
|
||||
LogFic "Ok"
|
||||
echo -e "${GREEN}Ok${NC}"
|
||||
else
|
||||
LogFic "Error"
|
||||
echo -e "${RED}Error $?${NC}"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
Borglist() {
|
||||
LogFic "Borg list demandé"
|
||||
borg list --short ${BORG_REPO}
|
||||
exit
|
||||
}
|
||||
|
||||
main() {
|
||||
|
||||
# ****************************************************** Main *******************************************************************
|
||||
# Création du fichier de log
|
||||
touch ${FICLOG}
|
||||
type -P sendemail || { echo "sendemail non trouvé";exit 1;}
|
||||
#
|
||||
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 "${BORG_REPO}" ] || [ -z "${BORG_REPO}" ] || [ -z "${BORG_PASSPHRASE}" ] || [ -z "${MAIL_RAPPORT}" ]
|
||||
then
|
||||
echo "Les variables VOLUME_SAUVEGARDES, BORG_REPO, BORG_PASSPHRASE, MAIL_RAPPORT sont à verifier"
|
||||
LogFic "Les variables VOLUME_SAUVEGARDES, BORG_REPO, BORG_PASSPHRASE, MAIL_RAPPORT sont à verifier"
|
||||
LogFic "Sortie du script"
|
||||
exit 1
|
||||
fi
|
||||
# test si le volume de sauvegarde est ok
|
||||
if [ ! -z ${VOLUME_SAUVEGARDES} ]
|
||||
then
|
||||
[ !$(grep "${VOLUME_SAUVEGARDES}" /etc/mtab >/dev/null 2>&1) ] || { echo "le volume de sauvegarde ${VOLUME_SAUVEGARDES} n' est pas monté"; LogFic "Erreur de montage du volume ${VOLUME_SAUVEGARDES} de sauvegarde" ; exit 1;}
|
||||
else
|
||||
[ ! $(echo ${BORG_REPO} | grep -i ssh 2>/dev/null) ] && { echo "Problème avec le repo distant ";exit 1;}
|
||||
fi
|
||||
|
||||
# Test si le REPO est monté : on sort
|
||||
if grep borgfs /etc/mtab >/dev/null 2>&1
|
||||
then
|
||||
echo "le REPO : ${BORG_REPO} est monté , je sors"
|
||||
LogFic "le REPO : ${BORG_REPO} est monté , je sors"
|
||||
ExpMail borg@${domain} "${site} : Sauvegarde en Erreur !!!!" ${MAIL_RAPPORT} "le REPO : ${BORG_REPO} est monté, sauvegarde impossible"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Tout se passe bien on continue
|
||||
LogFic " - Repertoire a sauver : ${LISTREPSAUV}"
|
||||
LogFic " - Volume Nfs monté : ${VOLUME_SAUVEGARDES}"
|
||||
LogFic " - Repertoire des sauvegardes : ${BORG_REPO}"
|
||||
[ ! -d ${BORGSCRIPTS} ] && LogFic "Pas de repertoire de PRE et POST" || LogFic " - Repertoire des scripts Post/Pré : ${BORGSCRIPTS}"
|
||||
[ "${DEBUG}" = true ] && [ -d ${BORGSCRIPTS} ] && echo "Rep des scripts PRE/POST :${BORGSCRIPTS}"
|
||||
LogFic " - Rapport par Mail : ${MAIL_RAPPORT}"
|
||||
LogFic " - Backups jour : ${NB_BACKUPS_JOUR} , Backups semaines : ${NB_BACKUPS_SEM} , Backups mois : ${NB_BACKUPS_MOIS}"
|
||||
[ "${DEBUG}" = true ] && echo "${LISTREPSAUV} sauvé dans ${BORG_REPO}, Rapport vers : ${MAIL_RAPPORT}"
|
||||
LogFic "#########################################################################################################################"
|
||||
LogFic " - Démarrage de la sauvegarde"
|
||||
[ "$DEBUG" = true ] && echo "Demarrage de la sauvegarde : "
|
||||
LogFic " - Log dans ${BORGLOG}"
|
||||
Sauvegarde
|
||||
[ "$DEBUG" = true ] && echo "code de retour de backup : ${BACKUP_EXIT}"
|
||||
LogFic " - Code de retour de la commande sauvegarde : ${BACKUP_EXIT}"
|
||||
LogFic " - Démarrage du nettoyage des sauvegardes"
|
||||
[ "$DEBUG" = true ] && echo "Nettoyage des sauvegardes: "
|
||||
Purge
|
||||
LogFic " - Code retour du Nettoyage des sauvegardes (0=OK; 1=WARNING, 2=ERROR) : ${PRUNE_EXIT}"
|
||||
[ "$DEBUG" = true ] && echo "code de retour prune : ${PRUNE_EXIT}"
|
||||
#
|
||||
########################################################################################
|
||||
# si la variable MAILDETAIL est true alors on affecte le contenu du log sinon LOGDATA est VIDE
|
||||
LOGDATA=""
|
||||
[ "$MAILDETAIL" = true ] && LOGDATA=$(cat ${BORGLOG})
|
||||
[ "$DEBUG" = true ] && [ "$MAILDETAIL" = true ] && echo "Envoi du mail à ${MAIL_RAPPORT}"
|
||||
# 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
|
||||
|
||||
BorgBackup
|
||||
|
||||
"
|
||||
LogFic " - la sauvegarde est OK"
|
||||
[ "$MAILOK" = true ] && ExpMail borg@${domain} "${site} : Sauvegarde Ok" ${MAIL_RAPPORT} ${MESS_SAUVE_OK}${LOGDATA}
|
||||
IFS=' '
|
||||
;;
|
||||
'1' )
|
||||
IFS=''
|
||||
MESS_SAUVE_ERR="
|
||||
Salut
|
||||
|
||||
La sauvegarde est en warning
|
||||
Code de retour de la commande sauvegarde : ${BACKUP_EXIT}
|
||||
Le log contenant les infos est ${BORGLOG}
|
||||
|
||||
BorgBackup
|
||||
|
||||
"
|
||||
LogFic " - Sauvegarde en Warning: ${BACKUP_EXIT}"
|
||||
[ "$MAILWARNING" = true ] && ExpMail borg@${domain} "${site} : Sauvegarde en Warning: ${BACKUP_EXIT}" ${MAIL_RAPPORT} ${MESS_SAUVE_ERR}${LOGDATA}
|
||||
IFS=' '
|
||||
;;
|
||||
* )
|
||||
IFS=''
|
||||
MESS_SAUVE_ERR="
|
||||
Salut
|
||||
|
||||
La sauvegarde est en Erreur
|
||||
Code de retour de la commande sauvegarde : ${BACKUP_EXIT}
|
||||
Le log à consulter est ${BORGLOG}
|
||||
|
||||
BorgBackup
|
||||
|
||||
"
|
||||
LogFic " - !!!!! Sauvegarde en Erreur !!!!! : ${BACKUP_EXIT}"
|
||||
ExpMail borg@${domain} "${site} : Sauvegarde en Erreur !!!! : ${BACKUP_EXIT}" ${MAIL_RAPPORT} ${MESS_SAUVE_ERR}${LOGDATA}
|
||||
IFS=' '
|
||||
;;
|
||||
esac
|
||||
LogFic " - Fin de la sauvegarde"
|
||||
exit
|
||||
}
|
||||
|
||||
[ ! "$#" -eq "0" ] || usage
|
||||
# On teste les arguments pour le script
|
||||
for ARG in $@; do
|
||||
case "${ARG}" in
|
||||
'-h' | '-help' )
|
||||
usage
|
||||
;;
|
||||
'-m' )
|
||||
shift
|
||||
Borgmount
|
||||
;;
|
||||
'-u' )
|
||||
shift
|
||||
Borgumount
|
||||
;;
|
||||
'-l' )
|
||||
shift
|
||||
Borglist
|
||||
;;
|
||||
'-i' )
|
||||
shift
|
||||
DEBUG=true
|
||||
;;
|
||||
'-v' )
|
||||
shift
|
||||
echo "Version : ${VERSION}"
|
||||
exit
|
||||
;;
|
||||
'-d' )
|
||||
shift
|
||||
Borgvariables
|
||||
exit
|
||||
;;
|
||||
'-c' )
|
||||
shift
|
||||
Compact
|
||||
exit
|
||||
;;
|
||||
'-s' )
|
||||
main
|
||||
;;
|
||||
'-p' )
|
||||
shift
|
||||
read -p "Ok pour lancer la purge en fonction de ces valeurs : jour=${NB_BACKUPS_JOUR},semaine=${NB_BACKUPS_SEM},mois=${NB_BACKUPS_MOIS} ? O/N : " READPURGE
|
||||
[[ ${READPURGE} =~ ^[oO]$ ]] && Purge || echo "pas de purge"
|
||||
exit
|
||||
;;
|
||||
* | ' ' )
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
done
|
Reference in New Issue
Block a user