Forum debian-fr.org

Rechercher:

* Connexion   * M’enregistrer

* FAQ    * Rechercher





Poster un nouveau sujet Répondre au sujet  [ 35 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
 Sujet du message: Problème script de synchro
MessagePosté: 01 Fév 2010 13:30 
Hors ligne
Nouvel utilisateur

Inscription: 10 Jan 2010 02:00
Messages: 36
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 :-)

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
#------------------------------------------------------------------------------------


Merci à tous :-)

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


Haut
 Profil  
 
MessagePosté: 01 Fév 2010 19:33 
Hors ligne
Très bavard(e)!
Avatar de l’utilisateur

Inscription: 02 Avr 2009 22:14
Messages: 424
Localisation: Paris
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 $()


Haut
 Profil  
 
MessagePosté: 01 Fév 2010 23:31 
Hors ligne
Nouvel utilisateur

Inscription: 10 Jan 2010 02:00
Messages: 36
Oula oui je suis bête pour le coup du /bin/bash Merci :-)
Jvais test de remplacer les backquotes aussi.

Merci ;-)


Haut
 Profil  
 
MessagePosté: 01 Fév 2010 23:42 
Hors ligne
Très bavard(e)!
Avatar de l’utilisateur

Inscription: 02 Avr 2009 22:14
Messages: 424
Localisation: Paris
Code:
           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 ?


Haut
 Profil  
 
MessagePosté: 02 Fév 2010 13:45 
Hors ligne
Très bavard(e)!

Inscription: 29 Juil 2009 18:11
Messages: 294
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

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


Haut
 Profil  
 
MessagePosté: 02 Fév 2010 14:39 
Hors ligne
Très bavard(e)!
Avatar de l’utilisateur

Inscription: 02 Avr 2009 22:14
Messages: 424
Localisation: Paris
le gros bloc en sed, je crois que c'est le prix à payer pour la barre de progression


Haut
 Profil  
 
MessagePosté: 02 Fév 2010 15:12 
Hors ligne
Très bavard(e)!

Inscription: 29 Juil 2009 18:11
Messages: 294
BBT1 a écrit:
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.


Haut
 Profil  
 
MessagePosté: 02 Fév 2010 16:39 
Hors ligne
Très bavard(e)!
Avatar de l’utilisateur

Inscription: 02 Avr 2009 22:14
Messages: 424
Localisation: Paris
Bon, alors je te conseillerais de faire disparaître ça :
Code:
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 ^^


Haut
 Profil  
 
MessagePosté: 02 Fév 2010 19:24 
Hors ligne
Nouvel utilisateur

Inscription: 10 Jan 2010 02:00
Messages: 36
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


Haut
 Profil  
 
MessagePosté: 02 Fév 2010 21:35 
Hors ligne
Très bavard(e)!

Inscription: 29 Juil 2009 18:11
Messages: 294
Voilà qui remplacera ce pavé affreux :
Code:
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


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 14:47 
Hors ligne
Nouvel utilisateur

Inscription: 10 Jan 2010 02:00
Messages: 36
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 :/
La synchro se termine, le message s'affiche mais les valeurs sont vides, on a juste la taille totale transférée :s


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 15:39 
Hors ligne
Très bavard(e)!
Avatar de l’utilisateur

Inscription: 02 Avr 2009 22:14
Messages: 424
Localisation: Paris
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 :
Code:
for I in $(seq 7); do
    sleep 1;
    echo "100 - $I * 10" | bc;
done | zenity --progress


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 17:25 
Hors ligne
Très bavard(e)!

Inscription: 29 Juil 2009 18:11
Messages: 294
RastaYoupi a écrit:
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 :/
La synchro se termine, le message s'affiche mais les valeurs sont vides, on a juste la taille totale transférée :s


Il est possible que nous ayons des versions de rsync différentes et qui retournent des informations différentes. Que te retournent ces instructions :
Code:
rsync -rpvh --progress <SOURCE(S)> <DOSSIER_DEST>

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


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 17:45 
Hors ligne
Nouvel utilisateur

Inscription: 10 Jan 2010 02:00
Messages: 36
Je n'ai pas d'erreurs, tout marche sauf la progression qui ne défile pas... :/


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 17:49 
Hors ligne
Très bavard(e)!

Inscription: 29 Juil 2009 18:11
Messages: 294
RastaYoupi a écrit:
Je n'ai pas d'erreurs, tout marche sauf la progression... :/

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.
:roll:


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 17:50 
Hors ligne
Très bavard(e)!

Inscription: 29 Juil 2009 18:11
Messages: 294
Totor a écrit:
RastaYoupi a écrit:
Je n'ai pas d'erreurs, tout marche sauf la progression... :/

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.
:roll:


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


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 17:52 
Hors ligne
Nouvel utilisateur

Inscription: 10 Jan 2010 02:00
Messages: 36
Ok, comment je peux voir ce que cela me renvoie ?


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 18:00 
Hors ligne
Très bavard(e)!

Inscription: 29 Juil 2009 18:11
Messages: 294
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é)


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 18:05 
Hors ligne
Nouvel utilisateur

Inscription: 10 Jan 2010 02:00
Messages: 36
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



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



Voilà :-)


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 18:30 
Hors ligne
Très bavard(e)!

Inscription: 29 Juil 2009 18:11
Messages: 294
huum, ça semble identique...
peux-tu refaire la manipulation avec la totalité du script mais en changeant la ligne
Citation:
done > >(zenity --progress --width=580 --title="svgrd - synchronisation" --text="Initialisation de la sauvegarde..." --percentage=0 --auto-kill)

par
Citation:
done

(tout simplement)


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 18:43 
Hors ligne
Nouvel utilisateur

Inscription: 10 Jan 2010 02:00
Messages: 36
Je ne peux pas tester le script à la main car c'est une action déclenchée par Udev.


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 18:55 
Hors ligne
Très bavard(e)!
Avatar de l’utilisateur

Inscription: 02 Avr 2009 22:14
Messages: 424
Localisation: Paris
@Totor: Y a t'il une raison pour utiliser cdm1 > >(cmd2) plutôt que cmd1 | cmd2 où c'est juste par goût ?


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 19:09 
Hors ligne
Nouvel utilisateur

Inscription: 10 Jan 2010 02:00
Messages: 36
Je reposte le script complet:

Code:
#! /bin/bash

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


#------------------------------------------------------------------------------------#
# Fonction                                #
#------------------------------------------------------------------------------------#

#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
USERNAME="leseb" # Indispensable pour l'affichage des fenêtres Zenity


# Répertoire source, destination, de montage de LiveUSB2, du montage du volume crypté, de backup du .img
SRC_DIR=/home/leseb/MOUNT/
DEST_DIR=/home/leseb/udevsync/
MONT_POINT=/home/leseb/MOUNT/
CRYPT_MOUNT=/home/leseb/CRYPT/
CONTENEUR=/home/leseb/MOUNT/luks-home.img
BKP_CONT=/home/leseb/Backup_IMG/


# 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

# Action à l'insertion de la clef
if [ "$ID_FS_TYPE" = "ext2" ] ; then  # Variable de UDev pour l'insertion de clef

   # Montage de la partition contenant le volume crypté
   mount $KEY_SYNC $MONT_POINT
   
   # Demande de synchronisation
   su - ${USERNAME} -c "DISPLAY=:0.0 zenity --question  --title='Bienvenue' --text='Clef montée. \nVoulez-vous synchroniser le <b>/home</b> de la clef ?'"

   if [ "$?" = 0 ]; then # Si on clique sur "Valider"

      if [ -f $CONTENEUR ] ; then # vérifie si le volume crypté existe

         # Cherche un loop libre
         #loop=$(losetup -f)
         #losetup $loop $MONT_POINT

         # Ouverture du conteneur et saisie de mot de passe, choix de saisir ou d'annuler l'opération avec le if

         #if MDP=$(${USERNAME} -c "DISPLAY=:0.0 zenity --entry \
         #         --title='Ouverture du conteneur chiffré' \
         #         --text='Entrez le mot de passe pour ouvrir le conteneur chiffré' \
         #         --hide-text')")
         #         then echo $?
         #else    su - ${USERNAME} -c "DISPLAY=:0.0 zenity --info --title='Champ vide' --text='Opération abandonnée'"
         #fi

         #cryptsetup luksOpen $loop LUKS # Esseyé de renvoyer MDP dans cryptsetup MAIS COMMENT ?

         # Monter
         #mount -o loop /dev/mapper/LUKS $CRYPT_MOUNT
         
         # Barre de progression
         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  > >(su - ${USERNAME} -c "DISPLAY=:0.0 zenity --progress --width=580 --title='Synchronisation' --text='Initialisation de la sauvegarde...' --auto-close")
         }
          #Synchro
         rsync -rpvh --progress $SRC_DIR "$DEST_DIR" > >(awk ' BEGIN { RS="\n|\r" } { print; fflush() }' > >(affiche))

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

          #   rsync -av --delete --ignore-errors --force --progress \
          #   $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
          #   }
          #   ' | su - ${USERNAME} -c "DISPLAY=:0.0 zenity --progress --width=580 --title='Synchronisation' --text='Initialisation de la sauvegarde...' --percentage=0 auto-close"

         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")
      
         # Vérifie la sortie de rsync
         ERR=$(cat $RSYNC_ERR)
         if [[ ${#ERR} -ne 0 ]]; then
            su - ${USERNAME} -c "DISPLAY=:0.0 zenity --error --title='Erreur de copie' --text='Problème lors de la sauvegarde du répertoire <b>$MOUNT_POINT</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))
            su - ${USERNAME} -c "DISPLAY=:0.0 zenity --info --title='Terminé' --text='Sauvegarde du répertoire\n<b>$MONT_POINT</b> effectuée avec succès.\n$NB_FICH fichiers synchronisés\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

         # Précaution de backup du conteneur crypté
         cp $CONTENEUR $BKP_CONT
      else
         su - ${USERNAME} -c "DISPLAY=:0.0 zenity --error \
         --title='Erreur' \
         --text='Aucun volume crypté trouvé !'"

      fi

   fi
fi

if [ "$ACTION" = "remove" ] ; then  # Variable de UDev

   # Démonter le volume crypté
   #umount $CRYPT_MOUNT

   # Fermer le volume crypté
   #cryptsetup luksClose LUKS

   # Libérer le loop
   #losetup -d $loop

   # Démontage de la clef
   umount -f $KEY_SYNC >> $LOG_FILE
   echo "Clef "$ID_MODEL" démontée ("$ACTION")" >> $LOG_FILE
fi

#------------------------------------------------------------------------------------#
# EOF                                   #
#------------------------------------------------------------------------------------#


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 21:22 
Hors ligne
Contributeur
Avatar de l’utilisateur

Inscription: 18 Juil 2007 16:57
Messages: 8602
Code:
        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))

peut être remplacé par :
Code:
data=$(awk '/sent/{ print "("$2" "$6" "$9")"}')
ENVOI=$(afficheTaille ${data[0]})
RECU=$(afficheTaille ${data[1]})
VITESS=$(afficheTaille ${data[2]})

Les avantages ?
  • on évite la mauvaise utilisation de cas
  • on évite des pipe assez consommateurs
  • on utilise qu'un seul programme
  • on ne parse qu'une seul fois le rapport (même s'il est en cache)

Pour la barre de progression je ne connais pas zenity.

_________________
Je suis Pitta, cartésien, irritable, irritant et névrosé (de plus je fais de l'entrisme pour zsh), si l'un de mes messages vous insupporte essayez d'y voir de l'ironie ou de ne pas en tenir compte. Bonne journée et gardez le sourire. :)


Haut
 Profil  
 
MessagePosté: 03 Fév 2010 23:32 
Hors ligne
Très bavard(e)!

Inscription: 29 Juil 2009 18:11
Messages: 294
BBT1 a écrit:
@Totor: Y a t'il une raison pour utiliser cdm1 > >(cmd2) plutôt que cmd1 | cmd2 où c'est juste par goût ?

Dans le cas présent, c'est plus part habitude. Sinon, y'a une raison :
L'utilisation de pipe engendre la création de processus impliquant que les variables utilisées au sein de ces processus n'ont qu'une portée locale à ces processus. Alors que l'utilisation de la substitution de processus permet de modifier des variables (et de conserver ces modifications) qui ont été définies en dehors des commandes enchainées.

Pour le reste du script, je donnerai une réponse demain

EDIT : j'ai pas trop le temps de travailler sur le script aujourd'hui. Et ce soir, je suis de sortie
Par contre, quelque chose m'interpèle :
Pourquoi utiliser su pour afficher zenity ? Il n'y a pas d'intérêt à moins que tu ne planifies le script en crontab...
Est-ce le cas ?

Si c'est le cas, il est préférable de définir la variable DISPLAY avant d'appeler le script (où en tout débit de script)
L'utilisation de su devient alors inutile.

MisterFreez a écrit:
Code:
data=$(awk '/sent/{ print "("$2" "$6" "$9")"}')

Oh làlà, y'a quelques trucs qui ne vont pas :
- Il manque la source des données
- la construction du tableau est complètement erronée
Code:
data=( $(awk '/sent/ {print $2,$6,$9}' /tmp/rapport.txt) )


Mais toujours est-il que l'utilisation du fichier temporaire est inutile. Il suffit de lire le flux de données via read et de le décomposer.


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 35 messages ]  Aller à la page 1, 2  Suivante

Index du forum » Divers » Programmation


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Aller à:  
Flux RSS Flux RSS Liste des flux Liste des flux
Powered by phpBB® Forum Software © phpBB Group
Traduction par: phpBB-fr.com
SEO
[ Time : 0.448s | 12 Queries | GZIP : Off ]