Bonjour,
afin de ne pas risquer de perdre ses données importantes à cause d'une panne ou d'un crash la prudence conseille de sauvegarder ses données, on y pense une fois, deux fois et après on oublie et c'est le drame 😉
je vous fais donc profiter d'un script que j'ai amélioré au cours du temps (merci PP pour la base) et qui sauvegarde tous les jours le contenu de plusieurs dossiers de travail sur un serveur.
Prérequis :
- avoir un accès ssh sur un serveur de sauvegarde
- avoir installé [doc]rsync[/doc] sur la machine et le serveur
- avoir installé zenity
Fonctionnalités :
- juste besoin de lister les dossiers et fichiers à sauvegarder dans un fichier texte une fois le script configuré
- vérifie l'état de la connexion et fait un ping sur le serveur avant la sauvegarde
- crée un log hebdomadaire des fichiers sauvegardés
- affiche une jolie notification à la fin de la sauvegarde
- si on clique sur l'icone de notification, affiche la liste des fichiers sauvegardés
Voici le contenu du script
#!/usr/bin/env bash
# rsync from this host to the backup server
#options de sauvegarde manuelle interactive
if [ "$*" = "-m" -o "$*" = "--manual" ]; then
MODE="Manual"
else
MODE="Automatic"
fi
#vérification de la connection réseau et boucle en attente de connexion
# eth est à adapter en fonction du nom de votre carte réseau, ici eth pour eth0 + eth1 (ethernet ou wifi)
ETH="eth"
WAIT=0
while [ `ifconfig | grep -A1 ${ETH} | sed -n 's/.*adr:\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' | wc -c` = 0 ]; do
WAIT=1
sleep 5
echo waiting
done
#laisse un peu de temps si la connexion était coupée
if [ ${WAIT} = 1 ]; then
sleep 5
fi
#définition des variables
#------------------------
SCRIPT_PATH=~/scripts/backup #chemin du dossier contenant le script
SRC_FOLDER=~/ #chemin du dossier local contenant les fichiers à sauvergarder
SAVELIST=${SCRIPT_PATH}/savelist #fichier texte contenant la liste des fichiers et sous-dossiers de SRC_FOLDER à sauvegarder
#------------------------
USER=nom_utilisateur #nom d'utilisateur ssh sur le serveur
REMOTE_HOST=server.domain.fr #adresse distante du serveur de sauvegarde
ALT_HOST=server.local #adresse locale du serveur de sauvegarde
DST_FOLDER=backup #nom du dossier de sauvegarde sur le serveur
#------------------------
NICE=5 #priorité donnée au script
#------------------------
#teste si on est en local, auquel cas changement de nom de serveur
ping -c 2 -d ${ALT_HOST} && REMOTE_HOST=${ALT_HOST}
LOGIN=${USER}@${REMOTE_HOST}
DATE=`date +%k:%M`
#création du dossier de log si inexistant
if [ ! -e ${SCRIPT_PATH} ] ; then mkdir ${SCRIPT_PATH}/log; touch ${SCRIPT_PATH}/log/last ; fi
#fonction de notification
notification() {
# ${1} = "terminée" ou "annulée"
# ${2} = durée d'affichage en secondes
echo message:"${DATE}\nLa sauvegarde sur ${REMOTE_HOST} est ${1}" | zenity --notification --listen --window-icon="info" | zenity --notification --timeout=${2} --window-icon="info" --text="Sauvegarde sur ${REMOTE_HOST} ${1} (${DATE})" && if cat ${SCRIPT_PATH}/log/list | grep ""; then cat ${SCRIPT_PATH}/log/list | grep -v /$ | zenity --text-info --title="Fichiers synchronisés" --width=800 --height=600; else zenity --info --text="Aucun fichier synchronisé"; fi
}
#fonction de sauvegarde et log
save() {
#synchronisation et log
{
echo "# ${MODE} backup"
echo "# Starting: "`/bin/date`
nice -n ${NICE} rsync -avrz --delete \
--files-from=${SAVELIST} \
${SRC_FOLDER} \
${LOGIN}:${DST_FOLDER}
echo "# Ending: "`/bin/date`
echo "# -------------------------------------------------------------"
echo
} >> ${SCRIPT_PATH}/log/`date +%G-%V`.log
date >> ${SCRIPT_PATH}/log/last
#sauvegarde du nom des derniers fichiers synchronisés
tac ${SCRIPT_PATH}/log/`date +%G-%V`.log | sed -n '2,/#\ -/p' | tac | sed -e '1,5d' | sed -e :a -e '$d;N;2,5ba' -e 'P;D' >${SCRIPT_PATH}/log/list
#notification
notification "terminée" 1200
}
#dialogue si mode interactif
if [ ${MODE} = "Automatic" ]; then
save
else
zenity --question --title="Sauvegarde Manuelle sur ${REMOTE_HOST}" --text="Sauvegarder sur ${REMOTE_HOST} maintenant?
La dernière sauvegarde date du :
`tail -1 ${SCRIPT_PATH}/log/last | sed 's/ (UTC.*//'`
Les modifications ultérieures seront tranférées sur ${REMOTE_HOST}.
"
if [ $? = "0" ]
then
save
else
notification "annulée" 60
fi
fi
rendez ensuite le script executable
chmod u+x /chemin/vers/backup.sh
adaptez la partie du script contenant les variables à votre configuration
#définition des variables
#------------------------
SCRIPT_PATH=~/scripts/backup #chemin du dossier contenant le script
SRC_FOLDER=~/ #chemin du dossier local contenant les fichiers à sauvergarder
SAVELIST=${SCRIPT_PATH}/savelist #fichier texte contenant la liste des fichiers et sous-dossiers de SRC_FOLDER à sauvegarder
#------------------------
USER=nom_utilisateur #nom d'utilisateur ssh sur le serveur
REMOTE_HOST=server.domain.fr #adresse distante du serveur de sauvegarde
ALT_HOST=server.local #adresse locale du serveur de sauvegarde
DST_FOLDER=backup #nom du dossier de sauvegarde sur le serveur
#------------------------
NICE=5 #priorité donnée au script
#------------------------
et créez le fichier contenant la liste des dossiers à sauvegarder (ici /chemin/vers/savelist )
/!\ les fichiers et dossiers listés sont des sous-fichiers/dossiers du dossier défini auparavant par SRC_FOLDER (par défaut le home)
/!\ attention à la casse des caractères
Documents/Travail
Images/Travail
autres/dossier_super_important
Pour lancer le script
/chemin/vers/backup.sh
pour le lancer avec une boîte de dialogue de confirmation (j'ai fait un lanceur sur le tableau de bord avec la commande "bash /chemin/vers/backup.sh --manual")
/chemin/vers/backup.sh --manual
et enfin pour automatiser les sauvegardes, il faut utiliser [doc]cron[/doc]
crontab -e
et ajouter les paramètres suivants pour lancer le script à midi du lundi au vendredi (le >>/chemin/vers/log/cronlog 2>&1 permet de créer un log pour debugger)
DISPLAY=":0.0"
USER="nom_utilisateur"
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow command
00 12 * * 1-5 /chemin/vers/backup.sh >>/chemin/vers/log/cronlog 2>&1
Merci de me faire part de votre avis ou de vos suggestions