Script double sauvegarde : deux réflexions

La première n’est pas à proprement parler du domaine de la programmation mais plutôt de la logique :
Dans le cas présent qui propose une “double sauvegarde alternée”, qui, dans un exemple de sauvegarde hebdomadaire, offre un “cliché” de ‘jour -7’ et un plus ancien de ‘jour - 14’.
Sachant que quand on effectue la sauvegarde, on va remplacer le “cliché” ‘jour -14’ par le “clich锑jour’, il n’est ptet pas utile d’effectuer une copie ‘backup’, puisque celle-ci sera identique au “cliché” ‘jour -7’, lequel n’est pas concerné par l’actuelle sauvegarde.
Je sais que mon explication n’est pas très claire mais si vous arrivez à me traduire, j’aimerais votre avis.

La seconde réflexion est ce qui pourrait être une erreur que je viens de relever.
Voici d’abord un rappel du script complet :

[code]#!/bin/bash

BEGIN INIT INFO

Nom du script : sauvegarde

Auteur : Ricardo, aidé de l’équipe de ‘debian-fr.org

Date de création : juillet 2011

Utilité : faciliter les sauvegardes

Version : cette version est écrite pour l’utilisation avec deux partitions de sauvegarde, à alterner dans le temps.

#+ Il est souhaitable que ces partitions soient sur un DD différent de celui qui abrite le système.
#+ Ce script a été écrit de façon à ce qu’il soit le plus générique possible. Les seules données que vous devriez devoir changer,
#+ se trouvent dans la partie droite des variables.

Pre-requis : voir tuto = http://www.debian-fr.org/sauvegarde-clonage-d-une-sid-t25179.html

#+ et page du WIKI = http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_alternée

Description : script permettant d’effectuer, régulièrement et de façon simple, les sauvegardes de son système

Droits : entièrement libres mais en cas de copie, la citation de “debian-fr.org” nous serait agréable

Modifié le : 22 août 2011

Objet de la modification : améliorations diverses

END INIT INFO

#----------------- Fonctions ----------------------------
function sauvegarde()
{
sudo rsync -av --del --backup --backup-dir="$1" --exclude-from="$2" “$3” “$4”

	# Teste si la sauvegarde a abouti ( = 0), sinon, on sort.
	if (("$?" > 0))
	then
			printf "\nErreur lors de la sauvegarde de %s\n" "$3" 
	else
			printf "\nSauvegarde de %s : OK\n" "$3"
			sleep 10
	fi  

}

function sortie_propre()
{
# Si la partition de sauvegarde n’était pas montée lors de l’appel, on la démonte avant de sortir.
if [ “${deja_montee}” = 0 ]
then
sudo umount "${mount_rep}"
else
# Si la partition de sauvegarde était déjà montée lors de l’appel, on sort sans la démonter mais en s’assurant que les données ont bien été écrites.
sync
fi
exit
}

#----------------- Variables -------------------

CETTE PARTIE DOIT RETENIR TOUTE VOTRE ATTENTION, C’EST LÀ QUE VOUS PERSONNALISEREZ CE SCRIPT

#+ POUR CE FAIRE, JE VOUS CONSEILLE DE VOUS RÉFÉRER AU TUTO ET AU SCRIPT INDIQUÉS DANS LE “PRE-REQUIS” DU “BEGIN INIT INFO”

mount_rep="/mnt/autre"

la première donnée, vide, figure le [0], de façon à commencer par [1]

ddext=(’’ ‘/dev/sdb9’ ‘/dev/sdb10’)
systeme_fich=(’’ ‘ext3’ ‘ext2’)
controle=(’’ ‘/home/controle’ ‘/home/controle-ricardo’)
exclure=(’’ ‘/root/exclure’ ‘/home/ricardo/.exclure’)
sauve=(’’ ‘/mnt/autre/sauve’ ‘/mnt/autre/sauve-ricardo’)
dossier_a_sauver=(’’ ‘/’ ‘/home/ricardo’)

#----------------- Départ du script ----------------------------

Teste l’existence du dossier de montage, sinon, on sort avec erreur 1.

mkdir -p "${mount_rep}" || { echo "Le dossier de montage n'existe pas !" >&2; exit 1; }	

Choix, puis test de la partition de sauvegarde. Si le montage ne s’effectue pas, on sort via la fonction sortie_propre()

deja_montee=0
PS3="Entrez le N° de la sauvegarde choisie : "
select choix_sauvegarde in “sauve” “sauve2” quitter
do
case ${REPLY} in
[1-2])
index=${REPLY}
if [ ! -e “${ddext[$index]}” ]
then
printf “\n Impossible de se connecter à %s \n Vérifiez qu’il s’agit de la bonne partition et recommencez \n” “${ddext[$index]}” >&2; exit 1;
else
if ! grep -q “^${ddext[$index]} “${mount_rep}” ${systeme_fich[$index]}” /etc/mtab
then
sudo mount -t “${systeme_fich[$index]}” “${ddext[$index]}” “${mount_rep}” || { deja_montee=1; sortie_propre; }
break
else
printf "Info : La partition ${ddext[$index]} est déjà montée\n"
deja_montee=1
break
fi
fi
;;
3) echo “On sort du script”; sortie_propre
;;
*) echo “Saisie non valide !”
;;
esac
done

Teste l’emplacement de la corbeille et si elle est pleine (présence de fichier(s) dans … /files). Si elle l’est, liste les fichiers qu’elle contient

echo -e “\033[4mCONTENU de la CORBEILLE\033[0m\n”

[ -z “$XDG_DATA_HOME” ] && chemin_trash="$HOME/.local/share/Trash" || chemin_trash="$XDG_DATA_HOME/Trash"
corbeille="$chemin_trash/files"

if [ -z $(ls -A "$corbeille") &> /dev/null ] 
then
	echo "LA CORBEILLE EST VIDE"		
else		 
	ls -a "$corbeille"	
	read -p "on peut la vider  ? o/* : " vider	 
		if [ "$vider" = o ] 
		then	
			shopt -s dotglob
			rm -rf "$chemin_trash"/{files/,info/,metadata}*
			shopt -u dotglob
			echo "CORBEILLE VIDÉE"
		else
			echo -e "\033[4mCORBEILLE CONSERVÉE PLEINE\033[0m"
		fi		
fi 		

Ordre de sauvegarde faisant appel à la fonction ‘sauvegarde()’

read -p "prêt pour la sauvegarde ? o/* : " onyva
if [ “$onyva” = o ]
then
for((index=1; index < ${#controle[@]}; index++))
do
sauvegarde “${controle[$index]}” “${exclure[$index]}” “${dossier_a_sauver[$index]}” "${sauve[$index]}"
done
fi
sortie_propre

[/code]

Dans cette partie des variables :
sauve=(’’ ‘/mnt/autre/sauve’ ‘/mnt/autre/sauve-ricardo’)
dossier_a_sauver=(’’ ‘/’ ‘/home/ricardo’)

Comme elle est proposée, /home/ricardo sera sauvegardé en créant un dossier supplémentaire ‘sauve-ricardo’
D’après ce que j’ai compris du man rsync, pour que seul le contenu soit ajouté, il faut placer une ‘/’ en fin de dossier source.
Ce qui devrait donc donner
dossier_a_sauver=(’’ ‘/’ ‘/home/ricardo[size=150]/[/size]’)

Bon, comme ma question n’a pas l’air de soulever les foules, j’ai testé ce que j’ai présenté plus haut et c’est bon :
ligne

est supprimée
ligne

devient

et lignes

for((index=1; index < ${#controle[@]}; index++)) do sauvegarde "${controle[$index]}" "${exclure[$index]}" "${dossier_a_sauver[$index]}" "${sauve[$index]}" done
deviennent

for((index=1; index < ${#exclure[@]}; index++)) do sauvegarde "${exclure[$index]}" "${dossier_a_sauver[$index]}" "${sauve[$index]}" done

ligne

devient