Travail terminé, corrections

[quote=“MisterFreez”]Un petit détail.

Que ce passe t’il quand la sauvegarde se passe bien ?[/quote]On sort !
Voici les dernières lignes d’une sauvegarde complète, avec la même annonce au milieu quand il passe de la sauvegarde de ‘/’ à celle de ‘~/’

[code]ricardo/site_web/attente/
deleting ricardo/site_web/attente/CD-live.jpg
deleting ricardo/site_web/attente/0-IMG_9869_1.jpg

sent 272793760 bytes received 8105 bytes 7085762.73 bytes/sec
total size is 2276125153 speedup is 8.34

Sauvegarde de /home/ricardo : OK
ricardo@sid-sda8:~/Documents$ [/code]

EDIT :
Et j’ai vérifié que le démontage se fait bien ou ne se fait pas si déjà monté au départ.

EDIT 2 :
Bien vu :013
J’ai placé un test de sortie sur la fonction sortie_propre() et il n’y va pas pas :018
Je répare et je reviens.

[quote=“MisterFreez”]
Petit trucs cosmétique : la fonction test_sauvegarde() se content-elle de tester si la sauvegarde s’est bien passée ?[/quote]
Je suppose que tu veux parler du titre de la fonction ? :wink:
Si oui, je me suis posé la même question mais je ne sais pas par quoi remplacer qui soit suffisamment court et explicite.

T’as vraiment les yeux partout :023
Alors, j’ai placé un test dans sortie_propre()

[code]function sortie_propre()
{

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.
	sync
fi

echo ‘test de sortie’ #########################
exit
}
[/code]
J’ai rajouté un ordre vers cette fonction dans la sauvegarde proprement dite :

read -p "prêt pour la sauvegarde ? o/* : " onyva if [ "$onyva" = o ] then for((index=1; index < ${#controle[@]}; index++)) do test_sauvegarde "${controle[$index]}" "${exclure[$index]}" "${dossier_a_sauver[$index]}" "${sauve[$index]}" done sortie_propre ############### else sortie_propre fi
J’ai testé partition déjà montée et partition non montée au départ : c’est bien pris en compte à l’arrivée.
Ci-dessous, action complète épurée

[quote]ricardo@sid-sda8:~/Documents$ essai

  1. sauve
  2. sauve2
  3. quitter
    Entrez le N° de la sauvegarde choisie : 2
    CONTENU de la CORBEILLE

La corbeille est vide
prêt pour la sauvegarde ? o/* : o
sending incremental file list
etc/
etc/mtab

sent 20933218 bytes received 14268 bytes 821470.04 bytes/sec
total size is 4838480294 speedup is 230.98

Sauvegarde de / : OK

sending incremental file list

ricardo/Documents/modif-tuto
ricardo/Documents/modif-tuto~

sent 6492047 bytes received 3239 bytes 2598114.40 bytes/sec
total size is 2288048755 speedup is 352.26

Sauvegarde de /home/ricardo : OK
test de sortie
ricardo@sid-sda8:~/Documents$
[/quote]

C’est un peu mon job :smiley:

Pour la fonction test_sauvegarde(), je te propose tout simplement sauvegarde().

Pour ce qui est de la sortie c’est nickel, mais encore améliorable. Grosso modo ton algo c’est :

lire_valeur onyva
si onyva vaut o alors
   sauvegarde
   sortie_propre
sinon
   sortie_propre
finsi

sortie_propre() est appelée quelque soit la valeur de $onyva, non ? :wink:

(et là tu pourras me faire une remarque sur l’utilité d’avoir créé une fonction…)

C’est un peu mon job :smiley:

Pour la fonction test_sauvegarde(), je te propose tout simplement sauvegarde().

Pour ce qui est de la sortie c’est nickel, mais encore améliorable. Grosso modo ton algo c’est :

lire_valeur onyva
si onyva vaut o alors
   sauvegarde
   sortie_propre
sinon
   sortie_propre
finsi

sortie_propre() est appelée quelque soit la valeur de $onyva, non ? :wink:

(et là tu pourras me faire une remarque sur l’utilité d’avoir créé une fonction…)[/quote]
Oui mais pas que là :

if ! grep -q "^${ddext[$index]} "$mount_rep" ${systeme_fich[$index]}" /etc/mtab then sudo mount -t "${systeme_fich[$index]}" "${ddext[$index]}" "$mount_rep" || sortie_propre ################"" break
où j’ai remplacé le ‘exit’.

Pour le nom de la fonction : ok, je modifie. J’avais peur que ça induise en erreur un lecteur, et qu’il confonde avec

PS3="Entrez le N° de la sauvegarde choisie : " select sauvegarde ###############, que j’ai changé, lui, en ‘choix_sauvegarde’ pour éviter toute confusion.

Oui, tu as raison et tu as bien fais :slightly_smiling:

Tu as modifié la fin du script ?

[quote=“MisterFreez”]Oui, tu as raison et tu as bien fais :slightly_smiling:

Tu as modifié la fin du script ?[/quote]
oui :smiley:

do sauvegarde "${controle[$index]}" "${exclure[$index]}" "${dossier_a_sauver[$index]}" "${sauve[$index]}" done

En dehors de la question du ‘help’, tu vois encore quelque chose ?

[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 avoir à 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

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 :

Objet de la modification :

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"
	fi  

}

function sortie_propre()
{

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.
	sync
fi

exit
}

#----------------- Variables -------------------
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 des partitions de sauvegarde et celle du dossier de montage, sinon, on sort avec erreur 1.

[ -e "${ddext[1]}" ] && [ -e "${ddext[2]}" ] || { echo "Le DDext ne répond pas !" >&2; exit 1; } 

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

Choix de la sauvegarde. Si le montage ne s’effectue pas, on sort avec 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 ! grep -q “^${ddext[$index]} “$mount_rep” ${systeme_fich[$index]}” /etc/mtab
then
sudo mount -t “${systeme_fich[$index]}” “${ddext[$index]}” “$mount_rep” || sortie_propre
break
else
printf "Info : La partition ${ddext[$index]} est déjà montée\n"
deja_montee=1
break
fi
;;
3) echo “On sort du script”; sortie_propre
;;
*) echo “Saisie non valide !”
;;
esac
done

Teste si la corbeille est pleine (pé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"
if [ -e ~/.local/share/Trash/files/ ]
then
ls ~/.local/share/Trash/files
read -p "on peut la vider ? o/* : " corbeille
if [ “$corbeille” = o ]
then
rm -rf ~/.local/share/Trash/*
echo -e "\033[4mCORBEILLE VIDÉE\033[0m"
fi
else
echo "La corbeille est vide"
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
sortie_propre
else
sortie_propre
fi
[/code]

Excuse moi, j’ai pas du bien me faire comprendre :

# 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 sortie_propre else sortie_propre fi
La fonction sortie_propre, tu l’appelle quelque soit la valeur de $onyva. Donc tu devrais pouvoir le mettre en dehors du « if then else fi ».

Ensuite pour utiliser sortie propre ici :

Il faut que tu fasse une vérification supplémentaire dans la fonction. En effet si la partition n’est pas déjà montée et que mount rate. Tu va tenter de démonter une partition qui ne l’ai pas.

Dans ta fonction, ce qu’il faut c’est :
[ul]
[li]si la partition est montée (regarder ça dans /etc/mtab)
[list]
[]si elle n’était pas déjà montée
[list]
[
]la démonter[/li][/ul][/:m]
[li]sinon
[ul]
[
]lancer sync[/li][/ul][/:m][/list:u][/:m][/list:u]

Donc il ne te manque que la première condition et tu l’as déjà écrite ailleurs :slightly_smiling:

Putain de coupure chez Free ces jours-ci :013
Heureusement, ça revient assez vite.
Réponse à la première colle :
En effet, tu as raison :unamused: , comme toujours :laughing:
Bientôt, on va arriver à faire tout ce script en une seule ligne :mrgreen:
Donc, comme ça, ça colle (testé = bon dans les deux cas, monté ou pas) :

# 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

Pour le second point, je ne comprends pas car
if ! grep -q “^${ddext[$index]} “$mount_rep” ${systeme_fich[$index]}” /etc/mtab
== si la partition n’est pas monté
then
sudo mount -t “${systeme_fich[$index]}” “${ddext[$index]}” “$mount_rep” || sortie_propre
== tu le montes
break
== et tu continues
else
==sinon, c’est à dire "si elle est déjà montée
printf “Info : La partition ${ddext[$index]} est déjà montée\n”
== tu nous tiens au courant
deja_montee=1
== tu marques que l’index vaut '1’
break
== mais tu continues quand même


La sortie propre, ne sert qu’en cas d’erreur dans le système de fichier, comme c’est toi qui l’as dit plus haut. Rappelle-toi que je voulais la supprimer, pensant qu’elle faisait double fonction avec le 'else’
Je me goure ptet mais il faut que tu m’expliques ce que je n’ai pas assimilé

Oui, pour le point 2, je viens de me rendrer compte de ce que tu redoutes :
J’ai testé avec un mauvais ext ‘3’ au lieu de ‘2’

[code]ricardo@sid-sda8:~/Documents$ essai

  1. sauve
  2. sauve2
  3. quitter
    Entrez le N° de la sauvegarde choisie : 2
    mount: wrong fs type, bad option, bad superblock on /dev/sdb10,
    missing codepage or helper program, or other error
    In some cases useful info is found in syslog - try
    dmesg | tail or so

umount: /mnt/autre: not mounted
test
ricardo@sid-sda8:~/Documents$
[/code]

Ça donnerait ce qui suit alors ?

[code]function sortie_propre()
{
if grep -q “^${ddext[$index]} “$mount_rep” ${systeme_fich[$index]}” /etc/mtab
then
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.
sync
fi

fi

exit
}[/code]

Tu as tout compris :023
Je te félicite chaudement. Je sais pas si je me répète mais c’est rare que ce genre de script gèrent aussi bien les cas d’erreur.

Si tu veut faire le -h, je crois que tu n’a pas besoin de moi, mais si tu as une question je suis disponible :slightly_smiling:

Tu as mal lu car je me suis gouré en recopiant, je viens de voir que j’ai placé le ‘then’ en bas alors qu’il est aussitôt après le 1er if. Je rectifie mon message du dessus
Dans mon test, il était bien placé :laughing:
Donc maintenant, il n’y a plus de :

umount: /mnt/autre: not mounted
Mais il subsiste, c’est normal, l’alerte comme quoi il y a l’erreur que j’ai provoquée pour le test :

mount: wrong fs type, bad option, bad superblock on /dev/sdb10, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so

Je vais donc pouvoir placer ce dernier jet dans le wiki et aussi dans le tuto et passer au côté “aide” où, j’aurais besoin de toi quand même pour la forme à donner à ce genre d’exercice que je ne connais pas du tout.

:013 :013 :013 En fait, ça ne va pas encore !
comme ça : quand la partition n’est pas montée au départ, elle n’est pas “démontée”

function sortie_propre() { if grep -q "^${ddext[$index]} "$mount_rep" ${systeme_fich[$index]}" /etc/mtab then if [ "$deja_montee" = 0 ] then sudo umount "$mount_rep" else sync fi fi exit }
Si j’inverse le premier ‘if’ avec ‘!’, c’est comme avant, sans cette ligne, càd que j’ai une alerte “umount: /mnt/autre: not mounted” provoquée en cas d’erreur de système de fichiers. Par contre, les démontages ou pas sont bien respectés.
Toujours ce problème de fin de ligne du ‘mount’"|| sortie_propre"

function sortie_propre() { if ! grep -q "^${ddext[$index]} "$mount_rep" ${systeme_fich[$index]}" /etc/mtab then if [ "$deja_montee" = 0 ] then sudo umount "$mount_rep" else sync fi fi exit }

J’ai trouvé un autre système, qui n’est ptet pas très académique mais qui fonctionne dans les 3 cas.
Je suis revenu à la fonction antérieure et j’ai rajouté un “deja_montee=1” avant d’aller à "sortie_propre"
Tu vas certainement me trouver une façon plus belle de faire la même chose :wink:

function sortie_propre() { if [ "$deja_montee" = 0 ] then sudo umount "$mount_rep" else sync fi exit }

# Choix de la sauvegarde. Si le montage ne s'effectue pas, on sort avec 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 ! 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 ;; 3) echo "On sort du script"; sortie_propre ;; *) echo "Saisie non valide !" ;; esac done

ligne modifiée :

[quote=“ricardo”]:013 :013 :013 En fait, ça ne va pas encore !
comme ça : quand la partition n’est pas montée au départ, elle n’est pas “démontée”

function sortie_propre() { if grep -q "^${ddext[$index]} "$mount_rep" ${systeme_fich[$index]}" /etc/mtab then if [ "$deja_montee" = 0 ] then sudo umount "$mount_rep" else sync fi fi exit }[/quote]
Tu peut me dire quel chemin, il emprunte dans ce cas (la fonction fait juste un exit ou est ce qu’il fait aussi un sync) ?

J’ai abandonné ce système Michel.
Je suis revenu à l’état antérieur de la fonction sortie_propre() et j’ai rajouté une fin à la ligne de ‘mount’.
Reprends tout le message au dessus de ton dernier.

EDIT :
je viens de tester avec un echo juste après le ‘sync’ et en cas de montage au départ, il passe bien par le sync et il reste monté.
fin de sauvegarde :

[code]sent 268317135 bytes received 6547 bytes 10522497.33 bytes/sec
total size is 2286875351 speedup is 8.52

Sauvegarde de /home/ricardo : OK
juste apres le sync dans la fonction
ricardo@sid-sda8:~/Documents$ [/code]

edit 2 :
en fait, j’ai trouvé plus propre mais je ne sais pas l’écrire :

if ! grep -q "^${ddext[$index]} "$mount_rep" ${systeme_fich[$index]}" /etc/mtab ### AJOUTER ICI : "ET PAS D'ERREUR DE SYSTÈME DE FICHIER" then sudo mount -t "${systeme_fich[$index]}" "${ddext[$index]}" "$mount_rep" ### SUPPRIMER TTE LE FIN DE LIGNE || { deja_montee=1; sortie_propre; } break else printf "Info : La partition ${ddext[$index]} est déjà montée\n" deja_montee=1 break fi

[color=#0000FF]D’autre part, si on réfléchit bien, cette possibilité ne peut se rencontrer qu’une fois, la première.
Le ‘mount’ fait appel au système de fichier, à la partition qui accueille la sauvegarde et au dossier de montage.

mount_rep="/mnt/autre"
ddext=(’’ ‘/dev/sdb9’ ‘/dev/sdb10’)
systeme_fich=(’’ ‘ext3’ ‘ext2’)

Quels sont les risques d’erreur :
le répertoire de montage : si le gus le monte ailleurs, ce n’est pas grave
la partition de réception de la sauvegarde : si elle a assez de place, ça fonctionnera quand même
le système de fichier : la sauvegarde avorte et le message lui indique qu’il y a quelque chose qui déconne de ce côté, il vérifie, et il trouve.

mount: wrong fs type, bad option, bad superblock on /dev/sdb10, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so
Le “begin info” dans son ‘pre-requis’, renvoie au tuto de T&A. Là, tout est expliqué mais je vais reprendre ce tuto et l’améliorer.
Éventuellement, ça peut faire une réponse dans le futur 'help’
On peut aussi mettre une alerte en début de “variables”, précisant qu’il convient de bien prendre attention aux modifications qui suivent.
À mon avis, le mieux serait encore de supprimer purement et simplement cette vérification, qu’en penses-tu ?[/color]

Pour avoir une vue plus “aérée” du script ==> le wiki :
http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_altern%C3%A9e

[quote=“ricardo”]Pour avoir une vue plus “aérée” du script ==> le wiki :
http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_altern%C3%A9e[/quote]

Bonjour,
Je me permet en passant, :

Et très bon boulot !!!

[quote=“chris38”][quote=“ricardo”]Pour avoir une vue plus “aérée” du script ==> le wiki :
http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_altern%C3%A9e[/quote]

Bonjour,
Je me permet en passant, :

Et très bon boulot !!![/quote]

Merci de la communication des fautes qui sont passées malgré une relecture.
OK pour l’oubli du ‘s’ à avertissements et à partition ainsi que de l’excès de ‘s’ à souhaitable.
Par contre, je ne vois pas de faute à “teste” ni à “présence”. Tu peux me les expliquer ?

EDIT :
Rectifications faites.
Une relecture m’a permis d’en retrouver une de plus ainsi qu’une faute grave de syntaxe.