Image de la famille Peaudecerf

Sauvegarde automatique des comptes Zimbra open source :

Le 16 mai 2020

Cahier des charges:

  1. Détection de tous les comptes par domaine, utilisés sur le serveur zimbra.
  2. Sauvegarde des comptes utilisateurs.
  3. Renommer les sauvegardes.
  4. Gérer les logs
  5. Création d'un mail si problème.
  6. Automatisation avec cron

 

Bon à savoir: Chaque chapitre reprend la totalité du script précédent.

Téléchargez le script

1 Détection de tous les comptes utilisés du serveur zimbra.

La commande sudo /opt/zimbra/bin/zmprov -l gaa (nous nous limiterons à un domaine) renvoie la totalité des comptes du serveur mail. Il nous restera à différencier les comptes "système" des comptes utilisateurs:

sudo nano /var/backup.sh

 Le script:

#!/bin/bash
#
# Declarations des variables a modifier
DATE=$(date +%d/%m/%Y)
HEURED=$(date +%Hh:%Mm:%Ss)
DOMAINE="votre-domaine.fr"
ZIMBRA_CLI_PATH=/opt/zimbra/bin
# Fin des Declarations des variables
#
# Saisie de l'heure de debut
echo "#"
echo "##### Debut de la sauvegarde du" $DATE "a" $HEURED "#####"
for account in $(${ZIMBRA_CLI_PATH}/zmprov -l gaa ${DOMAINE})
do
# Filtre des comptes
if [[ $account =~ 'spam' ]] || [[ $account =~ 'ham' ]] || [[ $account =~ 'virus' ]] || [[ $account =~ 'galsync' ]]
then
echo "Pas de backup pour: $account"
else
echo "$account"
fi
done

Rendre le fichier exécutable:

chmod +x /var/backup.sh

Essai du script (la réponse du serveur prend plusieurs secondes):

cd /var
./backup.sh

 

2 Sauvegarde des comptes utilisateurs.

Avec la variable account, nous pouvons lancer une sauvegarde:

/opt/zimbra/bin/zmmailbox -z -m notre-compte-a-sauvegarder getRestURL "//?fmt=tgz" > /le-repertoire-de-sauvegarde/mon-backup.tgz

Le répertoire de sauvegarde doit exister, sinon création du rép.

sudo nano /var/backup.sh

#!/bin/bash
#
# Declarations des variables a modifier
BACKUPDIR="/var/testbackup"
DATE=$(date +%d/%m/%Y)
HEURED=$(date +%Hh:%Mm:%Ss)
DOMAINE=""
ZIMBRA_CLI_PATH=/opt/zimbra/bin
# Fin des Declarations des variables
#
# creer le repertoire
if [ ! -d ${BACKUPDIR} ];then
mkdir ${BACKUPDIR}
fi
#
# Saisie de l'heure de debut
echo "#"
echo "##### Debut de la sauvegarde du" $DATE "a" $HEURED "#####"
for account in $(${ZIMBRA_CLI_PATH}/zmprov -l gaa ${DOMAINE})
do
# Filtres des comptes
if [[ $account =~ 'spam' ]] || [[ $account =~ 'ham' ]] || [[ $account =~ 'virus' ]] || [[ $account =~ 'galsync' ]]
then
echo "Pas de backup pour: $account"
else
#echo "$account"
${ZIMBRA_CLI_PATH}/zmmailbox -z -m "$account" getRestURL "//?fmt=tgz" > $BACKUPDIR/"$account".tgz
fi
done

Essai du script. Attention, suivant le nombre de compte et la taille de chaque compte, la réponse du serveur peut prend plusieurs minutes.

cd /var
./backup.sh

A ce stade, nous avons dans le répertoire /var/testbackup les comptes sauvegardés.

 

3 Renommer les trois dernières sauvegardes des comptes.

Plusieurs stratégies peuvent être choisi. J'ai adopté celle ci:

Si le compte existe et si une sauvegarde existe, alors la renommer en sauvegarde N + 1

sudo nano /var/backup.sh

#!/bin/bash
#
# Declarations des variables a modifier
BACKUPDIR="/var/testbackup"
DATE=$(date +%d/%m/%Y)
HEURED=$(date +%Hh:%Mm:%Ss)
DOMAINE=""
ZIMBRA_CLI_PATH=/opt/zimbra/bin
# Fin des Declarations des variables
#
# creer le repertoire
if [ ! -d ${BACKUPDIR} ];then
mkdir ${BACKUPDIR}
fi
#
# Saisie de l'heure de debut
echo "#"
echo "##### Debut de la sauvegarde du" $DATE "a" $HEURED "#####"
for account in $(${ZIMBRA_CLI_PATH}/zmprov -l gaa ${DOMAINE})
do
# Filtres des comptes
if [[ $account =~ 'spam' ]] || [[ $account =~ 'ham' ]] || [[ $account =~ 'virus' ]] || [[ $account =~ 'galsync' ]]
then
echo "Pas de backup pour: $account"
else
# renaime des backups precedents
file="${BACKUPDIR}"/"${account}"
if [ -e "${file}_2.tgz" ]
then
mv ${file}_2.tgz ${file}_3.tgz
fi
if [ -e "${file}_1.tgz" ]
then
mv ${file}_1.tgz ${file}_2.tgz
fi
if [ -e "${file}.tgz" ]
then
mv ${file}.tgz ${file}_1.tgz
fi
# sauvegardes
# Pour ne pas refaire encore une sauvegarde, j'ai commenté la ligne suivante
# ${ZIMBRA_CLI_PATH}/zmmailbox -z -m "$account" getRestURL "//?fmt=tgz" > $BACKUPDIR/"$account".tgz
fi
done

Essai du script.

cd /var
./backup.sh

 

4 Gérer un fichier de log.

Pour écrire les journaux, nous utiliserons la commande exec qui gère les entrés et sorties.

exec 1>> mon-repertoire/backup-mail.log
 Redirige les sortie à la fin du fichier de log

exec 2>> mon-repertoire/error.log
 Redirige les erreurs à la fin du fichier de log

sudo nano /var/backup.sh

#!/bin/bash
#
# Declarations des variables a modifier
BACKUPDIR="/var/testbackup"
BACKUPLOG="/var/log/sauvegardes-test"
DATE=$(date +%d/%m/%Y)
HEURED=$(date +%Hh:%Mm:%Ss)
DOMAINE=""
ZIMBRA_CLI_PATH=/opt/zimbra/bin
# Fin des Declarations des variables
total_erreur=0
# creer les 2 repertoire (log et backup)
if [ ! -d ${BACKUPLOG} ];then
mkdir ${BACKUPLOG}
fi
if [ ! -d ${BACKUPDIR} ];then
mkdir ${BACKUPDIR}
fi
# toute sortie sont logger
exec 1>> ${BACKUPLOG}/backup-mail.log
exec 2>> ${BACKUPLOG}/error.log
# Saisie de l'heure de debut
echo "#"
echo "##### Debut de la sauvegarde du" $DATE "a" $HEURED "#####"
for account in $(${ZIMBRA_CLI_PATH}/zmprov -l gaa ${DOMAINE})
do
# Filtres des comptes
if [[ $account =~ 'spam' ]] || [[ $account =~ 'ham' ]] || [[ $account =~ 'virus' ]] || [[ $account =~ 'galsync' ]]
then
echo "Pas de backup pour: $account"
else
# liste des comptes pour les log
list="$list"'
- '"$account"
# renaime des backups precedents
file="$BACKUPDIR"/"$account"
if [ -e "${file}_2.tgz" ]
then
mv ${file}_2.tgz ${file}_3.tgz
fi
if [ -e "${file}_1.tgz" ]
then
mv ${file}_1.tgz ${file}_2.tgz
fi
if [ -e "${file}.tgz" ]
then
mv ${file}.tgz ${file}_1.tgz
fi
# sauvegardes et j'envoie le resultat vers les fichier de log
${ZIMBRA_CLI_PATH}/zmmailbox -z -m "$account" getRestURL "//?fmt=tgz" > $BACKUPDIR/"$account".tgz 2>> ${BACKUPLOG}/error.log
# si la sortie gener une erreur
if [[ "$?" > 0 ]]
then
((total_erreur++))
fi
fi
done
# si erreur, je log
if [[ "$total_erreur" > 0 ]]
then
echo "#
Il y a eu "$total_erreur" erreur(s) dans la sauvegarde. regarder le fichier: "${BACKUPLOG}"/error.log"
echo "La ligne du dessus est du: "$DATE" a "$HEURED 1>> ${BACKUPLOG}/error.log
fi
echo "#"
echo "Liste des comptes sauvegardés: ${list-account}"
echo "##### Fin de la sauvegarde a" $(date +%Hh:%Mm:%Ss) "#####"

 Essai du script. Attention, suivant le nombre de compte et la taille de chaque compte, la réponse du serveur peut prend plusieurs minutes.

cd /var
./backup.sh

 

5 Envoie d'un mail si apparition d'un problème.

Nous utiliserons sendmail. Il est donc indispensable que sendmail soit installé est configuré.

Un fichier /tmp/mail-backup.txt est créé, puis il est utilisé pour envoyer le mail.

Pensez à bien renseigner votre mail.

sudo nano /var/backup.sh

#!/bin/bash
#
# Declarations des variables a modifier
BACKUPDIR="/var/testbackup"
BACKUPLOG="/var/log/sauvegardes-test"
DATE=$(date +%d/%m/%Y)
HEURED=$(date +%Hh:%Mm:%Ss)
DOMAINE=""
ZIMBRA_CLI_PATH=/opt/zimbra/bin
#### Mail
SENDMAIL="/usr/sbin/sendmail"
DE="Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.";
A="Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.";
# Fin des Declarations des variables
total_erreur=0
# creer les 2 repertoire (log et backup)
if [ ! -d ${BACKUPLOG} ];then
mkdir ${BACKUPLOG}
fi
if [ ! -d ${BACKUPDIR} ];then
mkdir ${BACKUPDIR}
fi
# toute sortie sont logger
exec 1>> ${BACKUPLOG}/backup-mail.log
exec 2>> ${BACKUPLOG}/error.log
# Saisie de l'heure de debut
echo "#"
echo "##### Debut de la sauvegarde du" $DATE "a" $HEURED "#####"
for account in $(${ZIMBRA_CLI_PATH}/zmprov -l gaa ${DOMAINE})
do
# Filtres des comptes
if [[ $account =~ 'spam' ]] || [[ $account =~ 'ham' ]] || [[ $account =~ 'virus' ]] || [[ $account =~ 'galsync' ]]
then
echo "Pas de backup pour: $account"
else
# liste des comptes pour les log
list="$list"'
- '"$account"
# renaime des backups precedents
file="$BACKUPDIR"/"$account"
if [ -e "${file}_2.tgz" ]
then
mv ${file}_2.tgz ${file}_3.tgz
fi
if [ -e "${file}_1.tgz" ]
then
mv ${file}_1.tgz ${file}_2.tgz
fi
if [ -e "${file}.tgz" ]
then
mv ${file}.tgz ${file}_1.tgz
fi
# sauvegardes et j'envoie le resultat vers les fichier de log
${ZIMBRA_CLI_PATH}/zmmailbox -z -m "$account" getRestURL "//?fmt=tgz" > $BACKUPDIR/"$account".tgz 2>> ${BACKUPLOG}/error.log
# si la sortie gener une erreur
if [[ "$?" > 0 ]]
then
((total_erreur++))
fi
fi
done
# si erreur, je log et j'envoie un mail
if [[ "$total_erreur" > 0 ]]
then
echo "#
Il y a eu "$total_erreur" erreur(s) dans la sauvegarde. regarder le fichier: "${BACKUPLOG}"/error.log"
echo "La ligne du dessus est du: "$DATE" a "$HEURED 1>> ${BACKUPLOG}/error.log
# Creation du mail
SUBJECT="Subject: Erreur pendant la sauvegarde des comptes Zimbra";
BODY="Bonjour,

Le script de sauvegarde des mails a généré "$total_erreur" erreur(s).
Il est important de verrifier ces 2 fichiers:
"${BACKUPLOG}/error.log"
et
"${BACKUPLOG}/backup-mail.log"

Ce message est envoyé par: /var/testbackup.sh"
# Envoie du Mail
echo "from:"$DE > /tmp/mail-backup.txt
echo "to:"$A >> /tmp/mail-backup.txt
echo "$SUBJECT" >> /tmp/mail-backup.txt
echo "MIME-Version: 1.0" >> /tmp/mail-backup.txt
echo "Content-Type: text/plain; charset=\"utf-8\"" >> /tmp/mail-backup.txt
echo "$BODY" >> /tmp/mail-backup.txt
cat /tmp/mail-backup.txt | "$SENDMAIL" -t
fi
echo "#"
echo "Liste des comptes sauvegardés: ${list-account}"
echo "##### Fin de la sauvegarde a" $(date +%Hh:%Mm:%Ss) "#####"

Pour recevoir un mail, glisser une erreur dans cette ligne modifiant le dossier des comptes à sauvegarder:

Modifier cette ligne:

${ZIMBRA_CLI_PATH}un-chemin-fail/zmmailbox -z -m "$account" getRestURL "//?fmt=tgz" > $BACKUPDIR/"$account".tgz 2>> ${BACKUPLOG}/error.log

cd /var
./backup.sh

Suite à l'erreur, un mail doit etre envoyé.  :-)

Pensez à enlever l'erreur !

 

6 Automatisation avec une tache cron

Ajoutez une tache cron. si elle est crée par sudo, root lancera la tache ...

sudo crontab -e

A la fin du fichier, ajoutez votre tache. La syntaxe est celle-ci en enlevant les guillemets:

"minute" "heure" "jours dans le mois" "mois" "jour de la semaine" "La commande à lancer"

Si espace: champ suivant
si virgule autre parametre du champ
si tirait: tous les nombres compris du premier nombre au deuxième nombre
si étoile: tous les nombres possible du champ

14 5 * * 3,5 /var/backup.sh

Notre sauvegarde se lance à 5h14 (tous les jours du mois en cours) et (tous les mois) et le troisieme et cinquieme jour de la semaine (le dimanche est le 0, le samedi est le 6).

 

Téléchargez le script

 

Ajouter un commentaire