[quote=“ricardo”]
Là, je pense que c’est le ‘-q’ qui permet de sortir 0, sinon, ça devrait être 1, non ?[/quote]
nop !
le l’option -q permet d’être silencieux (“q” pour “quiet” je suppose) !
la valeur retournée dépend de l’existence du motif : si grep trouve le motif à chercher, il a pour statut 0. Si ne le trouve pas, son statut vaut 1.
Je ne comprends pas l’utilité de ‘exit 1’ dans la fonction "test_montage_partition()"
J’ai changé le ‘echo’ par un ‘printf’ avec la variable de la partition
Dans la commande de démontage, à la fin, je n’ai pas mis de ‘else’, pensant qu’il était inutile ???
EDIT :
La mouture suivante est rectifiée en tenant compte des dernières corrections au 01/08 - 11:52
[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
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
function test_montage_partition()
{
Teste si la partition qui recevra la sauvegarde n’est pas déjà montée.
$1 = type de système de fichier
$2 = partition à monter
$3 = point de montage
if ! grep -q "^$2 $3 $1" /etc/mtab
then
sudo mount -t "$1" "$2" "$3" || exit 1;
return 0
else
printf "Info : La partition %s est déjà montée\n" "$2"
return 1
fi
}
function test_sauvegarde()
{
Teste si la sauvegarde a abouti (premier paramètre = 0), sinon, on sort.
if (("$1" > 0))
then
printf "\nErreur lors de la sauvegarde de %s\n" "$2" >&2
exit 1
else
printf "\nSauvegarde de %s : OK\n" "$2"
fi
}
#-----------------Variables-------------------
ddext="/dev/sdb9"
ddext2="/dev/sdb10"
mount_rep="/mnt/autre"
systeme_fich=“ext3"
systeme_fich2=“ext2"
controle=”/home/controle"
controle_user=”/home/controle-ricardo"
exclure="/root/exclure"
exclure_user="/home/ricardo/.exclure"
sauve="/mnt/autre/sauve"
sauve_user="/mnt/autre/sauve-ricardo"
#---------------------------------------------
Teste l’existence des partitions de sauvegarde et celle du dossier de montage, sinon, on sort avec erreur 1.
[ -e "$ddext" ] && [ -e "$ddext2" ] || { 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 erreur 1.
deja_montee=0
read -p 'sauve ou sauve2 ? : ’ part
case $part in
sauve)
test_montage_partition “$systeme_fich” “$ddext” “$mount_rep” || deja_montee=1
;;
sauve2)
test_montage_partition “$systeme_fich2” “$ddext2” “$mount_rep” || deja_montee=1
;;
*)
echo “mauvaise entrée” >&2; exit 1;
;;
esac
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
Test de l’état de la sauvegarde avec la fonction “test_sauvegarde”, qui se chargera de quitter le script si celle-ci est KO
1er paramètre : $? = statut de la dernière commande, c.a.d le rsync
2nd paramètre : / puis ~/ = dossier à sauvegarder
read -p “prêt pour la sauvegarde ? o/* : " onyva
if [ “$onyva” = o ]
then
sudo rsync -av --del --backup --backup-dir=”$controle" --exclude-from="$exclure" / "$sauve"
test_sauvegarde $? /
sudo rsync -av --del --backup --backup-dir="$controle_user" --exclude-from="$exclure_user" ~/ "$sauve_user"
test_sauvegarde $? ~/
else
exit 1
fi
Si la partition de sauvegarde était déjà montée lors de l’appel, on sort sans la démonter.
if [ "$deja_montee" = 0 ]
then
sudo umount "$mount_rep"
else
sync
fi
[/code]
[quote=“ricardo”]Je ne comprends pas l’utilité de ‘exit 1’ dans la fonction “test_montage_partition()”
[/quote]
il a pour objectif de quitter le script si une erreur s’est produite lors du montage.
et bien si il est utile : pour lancer sync !
[quote=“Totor”][quote=“ricardo”]Je ne comprends pas l’utilité de ‘exit 1’ dans la fonction “test_montage_partition()”
[/quote]
il a pour objectif de quitter le script si une erreur s’est produite lors du montage.
et bien si il est utile : pour lancer sync ![/quote]
Je l’avais oublié celui-là
Est-ce que c’est suffisant ou il faut lui ajouter quelque chose ?
# Si la partition de sauvegarde était déjà montée lors de l'appel, on sort sans la démonter.
if [ "$deja_montee" = 0 ]
then
sudo umount "$mount_rep"
else
sync
fi
Question au sujet de 'exit 1’
Des fois je le vois terminé par un ‘;’ et des fois, sans.
Raison ?
le ‘;’ est facultatif sauf dans les cas suivants :
- dans un bloc { … } il faut le mettre avant l’} si l’} est précédée d’une ou plusieurs instructions.
- lorsqu’il y a au moins une instruction après le ‘;’
[quote=“Totor”]le ‘;’ est facultatif sauf dans les cas suivants :
- dans un bloc { … } il faut le mettre avant l’} si l’} est précédée d’une ou plusieurs instructions.
- lorsqu’il y a au moins une instruction après le ‘;’[/quote]
Autrement dit, si on l’ajoute systématiquement, ça ne mange pas de pain
Alors, si la dernière mouture (avec l’ajout de ‘sync’ à la fin) est valable, tu peux envoyer ton idée, ça me donnera le temps de réfléchir
ok alors voici :
il existe une structure en bash permettant d’afficher des menus et d’en connaitre la réponse de l’utilisateur.
Pour la doc sur cette structure :
man bash|less +/"select name"
ou cette url.
cette doc ne te sera probablement pas facilement compréhensible. C’est pourquoi, je te donne un exemple (que tu peux tester en ligne de commande) :
PS3="Entrer le n° du film choisi : "
select film in "Film 1" "Film 2" "Film 3" Quitter
do
case ${REPLY} in
[1..3]) printf "lecture du film '%s'\n" "${film}";;
4) echo "On sort du menu"; break;;
*) echo "Saisie non valide !";;
esac
done
A terme, l’objectif est de ne pas utiliser toute ces variables ddext, ddext2, systeme_fich, systeme_fich2, controle, controle_user, exclure, exclure_user, sauve et sauve_user
mais 5 tableaux contenant chacun 2 valeurs. Ainsi, tu n’auras plus à tester la valeur de “part” pour déterminer les variables à utiliser pour monter la partition et effectuer rsync. Toutes les données seront accessibles via un indice correspondant à la saisie de l’utilisateur (auquel on aura soustrait 1 car les indices de tableau commencent à 0 et non 1) via le menu généré par le “select”.
Je te laisse te documenter sur les tableaux dans le man bash
Sympa ce petit script et très ‘causant’, on en comprend bien le principe.
Quant à l’application à mon truc, je n’ai pas encore bien assimilé mais demain, je vais faire un tour sur les tableaux et ptet que ça m’ouvrira un peu plus le neurone.
EDIT : après un coup d’oeil succinct sur les tableaux (idem qu’en Pascal, je crois me souvenir ?),
Les variables seraient modifiées ainsi :
#---------------------variables------------------
mount_rep="/mnt/autre"
#-----------------------------------------------
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')
Pour savoir si j’ai bien compris, on appellerait
la 1ère sauvegarde : ${ddext[0]}
le fichier d’exclusions de ~/ricardo : ${exclure[1]}
les deux fichiers de contrôle : ${controle[*]}
J’ai bon ?
Exactement !!!
Pour le pascal, j’en ai également fait il y a 20 ans… Depuis, de nombreux langages sont venus le remplacer
EDIT : le select serait pour remplacer read -p 'sauve ou sauve2 ? : ’ part
En soit, ce n’est pas un gain de code mais ça l’est par la suite.
À quoi correspond ce ‘PS3’ ?
Je me permets…
Les PS sont les “Prompt Statement”, ci après un lien (en anglais sorry) qui explique leur emploi
==>>http://www.thegeekstuff.com/2008/09/bash-shell-take-control-of-ps1-ps2-ps3-ps4-and-prompt_command/ <<==
@ M3t4Linux : merci pour le lien, assez explicatif.
@ Totor :
Je comprends éventuellement comment remplacer les premières lignes du ‘read -p’, mais je n’aboutis pas bien loin, et encore, si c’est bon :
PS3="Entrez le N° de la sauvegarde choisie : "
select sauvegarde in "sauve" "sauve2" quitter
do
case {REPLY} in
[1-2])
Tu y es presque !
la variable REPLY va permettre de faire le lien avec les tableaux (ddext et systeme_fich):
si REPLY = 1 alors ce sont les valeurs ayant pour indice 0 qui t’intéressent
si REPLY = 2 alors ce sont les valeurs ayant pour indice 1 qui t’intéressent
Donc l’indice souhaité est REPLY-1
Souviens-toi :
[quote=“Totor”]
Toutes les données seront accessibles via un indice correspondant à la saisie de l’utilisateur (auquel on aura soustrait 1 car les indices de tableau commencent à 0 et non 1) via le menu généré par le “select”.[/quote]
Note : pour faire une soustraction :
((indice=REPLY-1))
Pour les autres valeurs de REPLY :
si REPLY vaut 3, alors on quitte le script
si REPLY vaut tout autre chose, c’est qu’il y a erreur de saisie
Ensuite, tu n’as plus besoin d’un “case” pour savoir quelle partition monter et le code de la fonction test_montage_partition pourra être réintégré dans le script car elle ne sera plus appelée à 2 endroits.
edit : il faudra également modifier le code pour intégrer les tableaux “controle”, “exclure” et “sauve”
Je réapparais car il y a eu une coupure du Net hier en fin d’AM et retour seulement en fin de matinée.
Je ne voyais pas en effet comment lier la fonction et le script. Bien sûr, s’il n’y a plus de fonction, ça semble plus simple mais faut encore que j’y réfléchisse, ce que je vais ten,ter de faire cet AM
@ +
EDIT :
On déclare la partie rouge comme “tableaux” ou aussi comme “variables” ? simple question d’appellation.
Je suppose que c’est aussi à déclarer AVANT ?
#---------------------variables------------------
mount_rep="/mnt/autre"
#-----------------------------------------------
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’)
les tableaux sont des variables dont la structure est particulière.
ta déclaration est correcte mais si tu veux éviter la soustraction, tu peux procéder ainsi :
(par ex pour ddext)
ddext[1]='/dev/sdb9'
ddext[2]='/dev/sdb10'
ou :
ddext=('' '/dev/sdb9' '/dev/sdb10')
Ainsi, la valeur de REPLY donnera directement l’indice du tableau.
Note : je suis en congés vendredi soir … je ne serai donc plus dispo dès vendredi
[quote=“Totor”]les tableaux sont des variables dont la structure est particulière.
ta déclaration est correcte mais si tu veux éviter la soustraction, tu peux procéder ainsi :
(par ex pour ddext)
ddext[1]='/dev/sdb9'
ddext[2]='/dev/sdb10'
ou :
ddext=('' '/dev/sdb9' '/dev/sdb10')
Ainsi, la valeur de REPLY donnera directement l’indice du tableau.
Note : je suis en congés vendredi soir … je ne serai donc plus dispo dès vendredi
[/quote]
Je préfère la seconde méthode, qui est plus sympa
J’avais pensé à la première pour éviter la soustraction mais je me suis dit que ça faisait autant de lignes de déclaration qu’avant. Par contre, je découvre la seconde
OK pour tes congés, on va essayer de pédaler plus vite mais ça “monte”
Alors, avant que je continue, je te soumets ce qui suit car je suis loin d’être sûr d’avoir compris
PS3="Entrez le N° de la sauvegarde choisie : "
select sauvegarde in "sauve" "sauve2" quitter
do
case ${REPLY} in
[1-2]) #### if ! grep -q "^$2 $3 $1" /etc/mtab ###
if ! grep -q "^${ddext[%s]} "$mount_rep" ${systeme_fich[%s]}" "${sauvegarde}" /etc/mtab
;;
then ............... à partir de là, on verra la suite après .............
sudo mount -t
return 0
2e ligne remplace 1ère
EDIT :
Compte tenu des modifs ainsi :
[code]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’)[/code]
Là, mon fusible, il en est presque à la rupture
J’ai réussi à faire avec une seule partition mais pas trouvé le moyen du choix. Ce qui suit fonctionne pour la partition 1 = ‘sauve’
[code]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’)
PS3=“Entrez le N° de la sauvegarde choisie : “
select sauvegarde in “sauve” “sauve2” quitter
do
case ${REPLY} in
[1-2]) if ! grep -q “^${ddext[1]} “$mount_rep” ${systeme_fich[1]}” /etc/mtab
then
sudo mount -t “${systeme_fich[1]}” “${ddext[1]}” “$mount_rep” || exit 1;
break
else
printf “Info : La partition ${ddext[1]} est déjà montée\n” #”${ddext[%s]}” "${sauvegarde}"
break
fi
;;
3) echo “On sort du menu”; break;;
*) echo “Saisie non valide !”;;
esac
done
echo ‘OK’
[/code]
Ce qui me manque, c’est l’équivalent du '%s’
Ou que les [1-2] soient “variabilisées”
Il faut faire ainsi :
PS3="Entrez le N° de la sauvegarde choisie : "
select sauvegarde in "sauve" "sauve2" quitter
do
case ${REPLY} in
[1-2])
index=${REPLY}
;;
*)
echo 'Erreur de saisi'
exit 1
;;
esac
if ! grep -q "^${ddext[$index]} $mount_rep ${systeme_fich[$index]}" "${sauvegarde}" /etc/mtab
REPLY contiens la bonne valeur (tu la test quand tu fais case ${REPLY}), mais il vaut mieux la sauvegarder dans une autre variable pour ne pas qu’elle soit écrasée par un autre appel à read.
Ok merci Michel, c’est ce que j’avais envisagé : une variable. Par contre, je n’aurais jamais su où la placer.
Je teste tout ça ce soir.