Problème script de synchro

Salut à tous,

Le topo, j’ai un système live sur une clef usb et je veux synchroniser le home de ma clef avec un répertoire de mon poste fixe.
Pour cela j’ai commencé par identifier ma clef de façon unique avec Udev, au passage si quelqu’un sait pourquoi je ne vois plus ma clef en faisant un fdisk -l, je devrai '“normalement” voir /dev/lenomdemaclef.
Bref à chaque connexion de la clef une règle Udev appelle u script pour faire une synchro.
J’ai un peu pris pas mal de bout de script à droite, à gauche et presque tout marche sauf l’affichage graphique.
Du moins je veux juste une barre de progression et un pop up pour dire que la synchro est terminée.
Attention c’est peu être un peu le fouillis, fin si vous comprenez pas certaines choses dite moi :slightly_smiling:

Le code:

[code]#! /bin/sh
######################################################################################

Script de gestion de connexion et sauvegarde du /home de la clef sur le poste fixe

######################################################################################

afficheTaille () {
taille=$(sed ‘/./! s/^.*$/&.00/’ <<< $1)
i=1
while [[ ${#taille} -ge 7 ]]; do
taille=$(bc <<< “scale=2;$taille/1024”)
((i+=1))
done

case $i in
1) taille+=" octets" ;;
2) taille+=" Ko" ;;
3) taille+=" Mo" ;;
4) taille+=" Go" ;;
esac

echo $taille
}

#-------------------------------------------------------------------------------------

Déclaration des variables

#-------------------------------------------------------------------------------------

Paramètres d’identification de la clef

DEVTYPE="usb"
ID_SERIAL_SHORT="A500000000026452"
KEY_SYNC=/dev/LiveUSB2

Répertoires sources et destination

SRC_DIR=/home/leseb/MOUNT/
DEST_DIR=/home/leseb/udevsync/
MONT_POINT=/home/leseb/MOUNT/

Fichiers de log horodatés

BKP_DATE=date +"%Y-%m-%d_%H-%M"
LOG_FILE=/tmp/Logs_Sync/sdBackup_${BKP_DATE}.log
BKP_LOG_FILE=$DEST_DIR/Logs_Sync/sdBackup_${BKP_DATE}.log
RSYNC_ERR=/tmp/rsync.err

#------------------------------------------------------------------------------------

Algo

#------------------------------------------------------------------------------------

Initialisation du fichier de log

echo “Backup du $BKP_DATE” >> $LOG_FILE
echo "Début à date +'%H:%M:%S'" >> $LOG_FILE

if [ “$ACTION” = “add” ] ; then
mount $KEY_SYNC $MONT_POINT
echo “Clef “$ID_MODEL” montée (”$ACTION"), backup en cours" >> $LOG_FILE

echo "0" > nb
    DEBUT=$(date +%s)

rsync -p -r $SRC_DIR "$DEST_DIR" 

    $SRC_DIR/ $DEST_DIR 2>>$RSYNC_ERR | sed '
    /to-check=/! {
     /^sending/  {d;q;}
    /\/$/       {d;q;}
    /^sent/     {s/^.*$/echo "&" \>\/tmp\/rapport\.txt/e;d;q;};
    /^total/    {s/^.*$/echo "&" \>\>\/tmp\/rapport\.txt/e;d;q;};
    /^.\{43\}/  {s/\(^.\{20\}\).*\(.\{20\}$\)/echo \$\(\(\$\(cat nb\) + 1\)\) \> nb; echo "\1\[...\]\2" \>\/tmp\/svgrd_sed\.txt/e;d;q;};
    /^.\{43\}/! {s/^.*$/echo \$\(\(\$\(cat nb\) + 1\)\) \> nb; echo "&" \>\/tmp\/svgrd_sed\.txt/e;d;q;};
    }
   /to-check=/ {
     s/.*=\(.*\)\/\(.*\))/echo "#`echo "scale=2;\(\2-\1\)\*100\/\2" | bc | cut -d\. -f1`% (\$\(\(\2 - \1\)\) fichiers sur \2\) > \$\(cat \/tmp\/svgrd_sed\.txt\)"\; echo "scale=2;\(\2-\1\)\*100\/\2" | bc/e
    }
   ' | zenity --progress --width=580 --title="Home - synchronisation" --text="Initialisation de la sauvegarde..." --percentage=0 --auto-close &

        while true; do
          sleep 1
              if [ -z "$(pidof zenity)" ]; then
            pkill rsync
                   break
              fi
        done

FIN=$(date +%s)
TEMPS=$(($FIN-$DEBUT))
TP_HEU=$(sed 's/^.$/0&/' <<< $(($TEMPS/3600)))
TP_TMP=$(($TEMPS%3600))
TP_MIN=$(sed 's/^.$/0&/' <<< $(($TP_TMP/60)))
TP_SEC=$(sed 's/^.$/0&/' <<< $(($TP_TMP%60)))
TP=$(echo "$TP_HEU:$TP_MIN:$TP_SEC")

ERR=$(cat $RSYNC_ERR)
if [[ ${#ERR} -ne 0 ]]; then
    zenity --error --title="svgrd" --text="Problème lors de la sauvegarde du répertoire <b>$SRC</b>.\n\n<b><span color='red'>$ERR</span></b>."
    rm $RSYNC_ERR
else
    NB_FICH=$(cat nb)
    ENVOI=$(afficheTaille $(cat /tmp/rapport.txt | grep sent | cut -d' ' -f2))
    RECU=$(afficheTaille $(cat /tmp/rapport.txt | grep sent | cut -d' ' -f6))
    VITESS=$(afficheTaille $(cat /tmp/rapport.txt | grep sent | cut -d' ' -f9))
    zenity --info --title="svgrd" --text="Sauvegarde du répertoire\n<b>$SRC</b>\nefféctuée avec succès.\n$NB_FICH fichiers synchronisés\n\nEnvoyé:\t$ENVOI\nReçu:\t$RECU\nTemps:\t$TP\nTransfert:\t$VITESS/sec"
    rm nb
fi    

# Copie du log sur le répertoire de synchro
cp -f $LOG_FILE $BKP_LOG_FILE

fi

if [ “$ACTION” = “remove” ] ; then
umount -f $KEY_SYNC >> $LOG_FILE
echo “Clef “$ID_MODEL” démontée (”$ACTION")" >> $LOG_FILE
fi

#------------------------------------------------------------------------------------

EOF

#------------------------------------------------------------------------------------[/code]

Merci à tous :slightly_smiling:

Ps: ce script est basé sur celui-ci posté par Koderez chez vos grands amis =P forum.ubuntu-fr.org/viewtopic.php?id=82232&p=12

Quelques remarques mineures :

  • tu devrais remplacer le #!/bin/sh par #!/bin/bash à cause notamment du ‘<<<’ qui n’est pas apprécié par dash
  • les backquote sont dépréciées (et moi je les trouve peu lisibles), tu peux les remplaver par du $()

Oula oui je suis bête pour le coup du /bin/bash Merci :slightly_smiling:
Jvais test de remplacer les backquotes aussi.

Merci :wink:

while true; do sleep 1 if [ -z "$(pidof zenity)" ]; then pkill rsync break fi done

J’aime pas,
mais comme je suis fatigué je relirai ton script plus attentivement demain.

Sinon, j’ai pas bien suivi, qu’est-ce qui ne marche pas ?

[code]sed ‘
/to-check=/! {
/^sending/ {d;q;}
//$/ {d;q;}
/^sent/ {s/^.$/echo “&” >/tmp/rapport.txt/e;d;q;};
/^total/ {s/^.
$/echo “&” >>/tmp/rapport.txt/e;d;q;};
/^.{43}/ {s/(^.{20}).(.{20}$)/echo $(($(cat nb) + 1)) > nb; echo “\1[…]\2” >/tmp/svgrd_sed.txt/e;d;q;};
/^.{43}/! {s/^.
$/echo $(($(cat nb) + 1)) > nb; echo “&” >/tmp/svgrd_sed.txt/e;d;q;};
}
/to-check=/ {
s/.=(.)/(.*))/echo “#echo "scale=2;\(\2-\1\)\*100\/\2" | bc | cut -d\. -f1% ($((\2 - \1)) fichiers sur \2) > $(cat /tmp/svgrd_sed.txt)”; echo “scale=2;(\2-\1)*100/\2” | bc/e
}
’ | zenity --progress --width=580 --title=“Home - synchronisation” --text=“Initialisation de la sauvegarde…” --percentage=0 --auto-close &

        while true; do
          sleep 1
              if [ -z "$(pidof zenity)" ]; then
            pkill rsync
                   break
              fi
        done[/code]

c’est tout ce pavé qu’il faudrait changer…
c’est vraiment illisible.

le gros bloc en sed, je crois que c’est le prix à payer pour la barre de progression

y’a clairement moyen de faire plus propre.
je regarderais ce soir car pas le temps au TAF.

Bon, alors je te conseillerais de faire disparaître ça :

while true; do sleep 1 if [ -z "$(pidof zenity)" ]; then pkill rsync break fi done
En plus d’être moche, c’est dangereux (le pidof zenity et le pkill rsync ne vont pas forcément s’adresser aux processus que ton script vient de lancer…)

Et à la place, que dirais-tu de ne pas lancer zenity en arrière plan, sans le ‘&’ ?
Si tu as peur du comportement de rsync (j’ai pas testé comment il se comporte quand on lui ferme sa sortie standard), tu peux mettre un --auto-kill à zenity pour tuer tout ça si l’utilisateur appuie sur “Annuler”.

Après peut-être as tu vu des cas particuliers auxquels je n’aurai pas pensé,
si c’est le cas fais nous-en profiter ^^

Lol merci à tous pour vos réponses
Je n’ai pas décelé de cas particulier donc je vais le virer et mettre le --auto-kill

Voilà qui remplacera ce pavé affreux :

affiche()
{
	fichier=""
	numFichier=0
	nbFile=
	while read uneLigne
	do
	  [ "${uneLigne}" ]  && {
		  [[ "${uneLigne}" =~ [[:digit:]\.]+[A-Z]\ *[[:digit:]]+% ]] &&  {
			  infos=( ${uneLigne} )
			  
			  transfere=${infos[0]}
			  evolution=${infos[1]%\%}
			  indice=2
			  
			  [[ "${transfere}"  = *100% ]] && 
			  {
				   transfere=${transfere%100%}
				   evolution=100
				   indice=1
			  }
			  
			  debit=${infos[${indice}]}
			  tps=${infos[((${indice}+1))]}
			  
			  [ ! "${nbFile}" ] && [[ "${uneLigne}" = *to-check* ]] && {
				  indice=${#infos[@]}
				  ((indice--))
				  nbFile="${infos[${indice}]}"
				  nbFile=${nbFile%)}
				  nbFile=${nbFile#*/}
			  }
			  
			  echo "#Fichier : ${fichier}$( [ "${nbFile}" ] && echo " (${numFichier}/${nbFile})")\nTransféré : ${transfere}\nDébit : ${debit}\nTemps restant : ${tps}"
			  echo ${evolution}
			  
		  } || { 
			   fichier="${uneLigne}"
			   echo "#Fichier : ${fichier}$..."
			   echo 0
			   ((numFichier++))
		   }
       }
	done  > >(zenity --progress --width=580 --title="svgrd - synchronisation" --text="Initialisation de la sauvegarde..." --percentage=0 --auto-kill)
}
rsync -rpvh --progress <SOURCE(S)> <DOSSIER_DEST>> >(awk ' BEGIN { RS="\n|\r" } { print; fflush() }' > >(affiche))

Après, reste à :

  • modifier <SOURCE(S)> et <DOSSIER_DEST> et intégrer leur gestion (clé et point de montage …)
  • au besoin, ajouter les options rsync qui vont bien

en gros, l’intégrer au reste du script

Merci d’avoir retouché cette partie du code même si j’ai rien compris à ce que tu as fait.
La barre de progression s’affiche bien mais elle ne progresse pas, du moins elle se remplit une fois la sauvegarde terminée :confused:
La synchro se termine, le message s’affiche mais les valeurs sont vides, on a juste la taille totale transférée :s

Tu as quoi comme donnée en entrée du pipe pour zenity ? (enlève juste le code “| zenity bla bla bla…” pour voir ce que ça crache sur la sortie standard)

zenity attend qu’on lui envoie des nombre, de 0 à 100, pour refléter ça en pourcentage sur la barre de progression.
Lorsque le programme en entrée se termine, il ferme son côté du pipe. Zenity s’en rend compte et met la barre de progression à 100%.

petit exemple :

for I in $(seq 7); do sleep 1; echo "100 - $I * 10" | bc; done | zenity --progress

[quote=“RastaYoupi”]Merci d’avoir retouché cette partie du code même si j’ai rien compris à ce que tu as fait.
La barre de progression s’affiche bien mais elle ne progresse pas, du moins elle se remplit une fois la sauvegarde terminée :confused:
La synchro se termine, le message s’affiche mais les valeurs sont vides, on a juste la taille totale transférée :s[/quote]

Il est possible que nous ayons des versions de rsync différentes et qui retournent des informations différentes. Que te retournent ces instructions :

rsync -rpvh --progress <SOURCE(S)> <DOSSIER_DEST>

puis

rsync -rpvh --progress <SOURCE(S)> <DOSSIER_DEST> > >(awk ' BEGIN { RS="\n|\r" } { print; fflush() }')

Je n’ai pas d’erreurs, tout marche sauf la progression qui ne défile pas… :confused:

je me répète : que te retournent les 2 instructions que je t’ai fourni !
La barre de progression dépend de ces 2 informations.
:unamused:

je me répète : que te retournent les 2 instructions que je t’ai fourni !
La barre de progression dépend de ces 2 informations.
:unamused:[/quote]

EDIT : Comment puis-je savoir pourquoi il n’y a pas de progression sans aucune informations de ta part ? :unamused:

Ok, comment je peux voir ce que cela me renvoie ?

lance les instructions que je t’ai donné en ligne de commande en changeant <SOURCE(S)> et <DOSSIER_DEST> par leur valeur.
Puis poste les résultats (Ne mets pas forcément tout le pavé que cela va généré)

J’ai déjà fais ça et c’est bien ce que je disais je n’ai pas d’erreurs…
La première commande: [code]debian:/usr/bin# rsync -rpvh --progress /home/leseb/MOUNT /home/leseb/udevsync/
sending incremental file list
MOUNT/
MOUNT/lol
4 100% 0.00kB/s 0:00:00 (xfer#1, to-check=4/6)
MOUNT/luks-home.img
209.72M 100% 16.13MB/s 0:00:12 (xfer#2, to-check=3/6)
MOUNT/haha/
MOUNT/ll/
MOUNT/lost+found/

sent 209.74M bytes received 66 bytes 16.78M bytes/sec
total size is 209.72M speedup is 1.00
[/code]

La deuxième:

[code]debian:/home/leseb/udevsync# rsync -rpvh --progress /home/leseb/MOUNT /home/leseb/udevsync/ > >(awk ’ BEGIN { RS="\n|\r" } { print; fflush() }’)
sending incremental file list
MOUNT/
MOUNT/lol

       4 100%    0.00kB/s    0:00:00  
       4 100%    0.00kB/s    0:00:00 (xfer#1, to-check=4/6)

MOUNT/luks-home.img

  32.77K   0%   31.25MB/s    0:00:06  
  72.35M  34%   69.00MB/s    0:00:01  
 127.21M  60%   60.66MB/s    0:00:01  
 168.10M  80%   49.96MB/s    0:00:00  
 201.65M  96%   44.55MB/s    0:00:00  
 209.72M 100%   44.90MB/s    0:00:04 (xfer#2, to-check=3/6)

MOUNT/haha/
MOUNT/ll/
MOUNT/lost+found/

sent 209.74M bytes received 66 bytes 46.61M bytes/sec
total size is 209.72M speedup is 1.00
debian:/home/leseb/udevsync# ls
haha ll lol lost+found luks-home.img MOUNT
debian:/home/leseb/udevsync# rm -r *
debian:/home/leseb/udevsync# cd /usr/bin/
debian:/usr/bin# ./synchro.sh
debian:/usr/bin# rsync -rpvh --progress /home/leseb/MOUNT /home/leseb/udevsync/
sending incremental file list
MOUNT/
MOUNT/lol
4 100% 0.00kB/s 0:00:00 (xfer#1, to-check=4/6)
MOUNT/luks-home.img
209.72M 100% 16.13MB/s 0:00:12 (xfer#2, to-check=3/6)
MOUNT/haha/
MOUNT/ll/
MOUNT/lost+found/

sent 209.74M bytes received 66 bytes 16.78M bytes/sec
total size is 209.72M speedup is 1.00
debian:/usr/bin# rsync -rpvh --progress /home/leseb/MOUNT /home/leseb/udevsync/ > >(awk ’ BEGIN { RS="\n|\r" } { print; fflush() }’)
debian:/usr/bin# sending incremental file list
MOUNT/lol

       4 100%    0.00kB/s    0:00:00  
       4 100%    0.00kB/s    0:00:00 (xfer#1, to-check=4/6)

MOUNT/luks-home.img

  32.77K   0%   31.25MB/s    0:00:06  
  37.81M  18%   36.03MB/s    0:00:04  
  66.65M  31%   31.70MB/s    0:00:04  
  95.42M  45%   30.29MB/s    0:00:03  
 116.98M  55%   24.51MB/s    0:00:03  
 132.19M  63%   19.78MB/s    0:00:03  
 147.39M  70%   16.93MB/s    0:00:03  
 161.55M  77%   13.66MB/s    0:00:03  
 175.18M  83%   13.47MB/s    0:00:02  
 179.63M  85%   10.97MB/s    0:00:02  
 194.58M  92%   10.90MB/s    0:00:01  
 209.72M 100%   17.36MB/s    0:00:11 (xfer#2, to-check=3/6)

sent 209.74M bytes received 54 bytes 18.24M bytes/sec
total size is 209.72M speedup is 1.00

[/code]

Voilà :slightly_smiling:

huum, ça semble identique…
peux-tu refaire la manipulation avec la totalité du script mais en changeant la ligne

par

(tout simplement)