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