Script de sauvegarde
Prérequis :
- avoir un accès ssh sur un serveur de sauvegarde
- avoir installé rsync 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 exécutable
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 cron
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
No comments to display
No comments to display