Skip to main content

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