Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 29/01/2010, à 20:57

RastaYoupi

Problème script synchro

Salut à tous,
J'espère que je me suis pas gouré mais je vois pas où je pourrai mettre mon sujet.
Modo soyez indulgent ^^
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.
Je me suis inspiré du code de "koderez" dans ce topic http://forum.ubuntu-fr.org/viewtopic.php?id=82232&p=12
Attention c'est peu être un peu le fouillis, fin si vous comprenez pas certaines choses dite moi :-)

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

La partie qui ne fonctionne pas et la partie de l'affichage de la barre de progression et je capte pas vraiment pourquoi. Sinon la clef se monte bien et la synchro nickel.

Merci d'avance à tous smile

Dernière modification par RastaYoupi (Le 29/01/2010, à 21:21)

Hors ligne

#2 Le 31/01/2010, à 13:42

RastaYoupi

Re : Problème script synchro

Personne ? hmm

Hors ligne

Haut de page ↑