Zénity, rsync, script bash de sauvegarde de répertoires sur disque usb

cs_stooff Messages postés 15 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 19 janvier 2010 - 18 janv. 2010 à 15:43
cs_stooff Messages postés 15 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 19 janvier 2010 - 19 janv. 2010 à 14:39
Bonjour à tous.

Ne trouvant pas de rubrique bash, bourne shell ou assimilé, je poste dans la rubrique la plus proche du contenu de ce post.

Ne trouvant pas de logiciel à la fois hyper simple et surtout opensource, ceci afin de réaliser mes sauvegarde journalière sur disque USB. Je me suis mis en quête de le réaliser.

Il permet d'avoir une icone permettant de lancer la sauvegarde via zenity (simplissime) et utilisant rsync (puissant, robuste, etc ...). Malheureusement il y a un hic dans une des fonctions (not function) de zenity permettant de fermer la fenetre de sauvegarde et coupant ainsi rsync dans sa lancée. Mieux qu'un long discours : le script !

Merci de me donner vos impressions et vos commentaires. Et si vous pensez pouvoir m'aider, un grand merci à vous.

#!/bin/bash

## initialisation des variables de répertoire
HOME_SRC_REP=/home/$USER
HOME_DEST_REP=/media/NTFSDATA/BACKUP/$USER
DEST_REP=/media/NTFSDATA/BACKUP/
SYS_REP=/media/NTFSDATA/BACKUP

Finish="0"

#Test de REP_EXCLUS sinon creation
if ! test -e $REP_EXCLUS
then touch $REP_EXCLUS
fi

# Lancement de l'icone globale en barre des taches
exec 3> >(zenity --notification --window-icon="$SYS_REP/.icons/loaded.png" --listen --text="Sauvegarde USB")

## fonction de detection du disque USB via la presence du repertoire DEST_REP
function Detect_USBHDD
{
## Boucle de test du disque dur
if ! test -e $DEST_REP; then
echo "message:Veuillez brancher votre disque dur externe pour la sauvegarde !" >&3
else	zenity --notification --window-icon="$SYS_REP/.icons/info.png" --text="Disque USB détecté ! Cliquer pour commencer la sauvegarde"	
if [ $? -eq "0" ]; then
Ask_LAUNCH
else	Detect_USBHDD
fi
fi
} 

## demande a l'utilisateur confirmation de lancement de la sauvegarde
function Ask_LAUNCH 
{
zenity --question --text="Voulez-vous commencer la sauvegarde ?"

if [ $? -eq "1" ]; then
echo "message:Sauvegarde annulée." >&3
Detect_USBHDD
else	Launch_BACKUP
fi
} 

## Lancement de la sauvegarde
function Launch_BACKUP
{
rsync --verbose --progress --archive $HOME_SRC_REP $DEST_REP  |  
     awk -f $SYS_REP/.rsync.awk | 
     zenity --progress --width=400 --title "Sauvegarde en cours ..." --text="Scan en cours..." --percentage=0
     ###
     # Ici, quelque soit la methode utilisé, lorsque je catch le signal de sortie de zenity, le processus rsync ne se ferme pas en meme temps, en tant que processus parent de zenity c comprehensible, mais comment faire ? 
     ###
Finish="1"
}

Detect_USBHDD

## Prévient l'utilisateur de la fin de la synchronisation
if [ $Finish -eq "1" ]; then
zenity --info \
  --window-icon="$SYS_REP/.icons/info.png" \
  --text="Sauvegarde USB terminée avec succès !"
if [ $? -eq "1" ]; then
Detect_USBHDD
fi
else	zenity --info \
  --window-icon="$SYS_REP/.icons/warning.png" \
  --text="Sauvegarde USB inachevée ! Une erreur inconnue s'est produite."
if [ $? -eq "1" ]; then
Detect_USBHDD
fi  
exit 0

1 réponse

cs_stooff Messages postés 15 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 19 janvier 2010
19 janv. 2010 à 14:39
Ayant progressé un peu sur ce script je le reposte. Malheureusemnt je n'ai toujours pas trouvé de solution a mon probleme initial, quelques pistes ont été exploitées mais sans succès.

La fenetre zenity de copie avec barre de progression étant initialisée en processus fils de rsync, il est donc normal qu'en cas d'annulation via le bouton annuler de cette meme fenetre cela ne feme pas rsync en tant que processus parent. awk serait certainement la solution a ce probleme mais pfffff je jette l'eponge.

J'ai vu pas mal d'autre scripts specifiques a la fermeture des processus parents en cas de kill du ou des processus fils mais sans succès d'intégration.

Merci de votre aide.

rsync_usb_disk.sh (gestion start stop rajouter au script) :
#!/bin/bash

## initialisation des variables de répertoire
HOME_SRC_REP=/home/$USER
HOME_DEST_REP=/media/NTFSDATA/.backup/$USER
DEST_REP=/media/NTFSDATA/.backup/
SYS_REP=/media/NTFSDATA/.backup
EXCLUDE_FILE=$SYS_REP/.$USER.exclusion
PARTAGES_REP=$SYS_REP/.partages/$USER
ICONE_REP=$HOME_SRC_REP/.rsync_usb_disk/icones

## fonction de detection du disque USB via la presence du repertoire DEST_REP
function Detect_USBHDD
{
## Boucle de test du disque dur
if ! test -e $DEST_REP; then
echo "message:Veuillez brancher votre disque dur externe pour la sauvegarde !" >&3
fi
while ! test -e $DEST_REP; do
wait
done
if test -e $DEST_REP; then
echo "message:Disque USB détecté." >&3
zenity --notification --window-icon="$ICONE_REP/info.png" --text="Cliquer pour commencer la sauvegarde"
if [ $? -eq "0" ]; then
Ask_LAUNCH
else	Detect_USBHDD
fi
fi
} 
## demande a l'utilisateur confirmation de lancement de la sauvegarde
function Ask_LAUNCH 
{
zenity --question --text="Voulez-vous commencer la sauvegarde ?"
if [ $? -eq "1" ]; then
echo "message:Sauvegarde annulée." >&3
Detect_USBHDD
else	Launch_BACKUP
fi
} 
## Lancement de la sauvegarde
function Launch_BACKUP
{
echo "rsync --verbose --progress --archive --exclude-from=$EXCLUDE_FILE $HOME_SRC_REP $DEST_REP"
rsync --verbose --progress --archive --exclude-from=$EXCLUDE_FILE \
--delete-before --delete-excluded --ignore-errors \
     	$HOME_SRC_REP $DEST_REP  |  
     awk -f $SYS_REP/.rsync.awk | 
     zenity --progress --width=400 --title "Sauvegarde en cours ..." --text="Scan en cours..." --percentage=0
     ###
     # Ici, quelque soit la methode utilisé, lorsque je catch le signal de sortie de zenity, le processus rsync ne se ferme pas en meme temps, en tant que processus parent de zenity c comprehensible, mais comment faire ? 
     ###
Finish="0"
}
## Tuer les processus
function Kill_PROC
{
zenity_pids=$(ps -A  | grep zenity | awk '{print $1}')
while [ "$zenity_pids" != "" ]; do
ps -A  | grep zenity | awk '{print $1}' | xargs kill -9 &
rsync_pids=$(ps -A  | grep rsync | awk '{print $1}')
if [ "$rsync_pids" != "" ]; then
ps -A  | grep rsync | awk '{print $1}' | xargs kill -9 &
fi
done
}

case "$1" in
'start')
pids=$(ps -A  | grep zenity | awk '{print $1}')
if [ "$pids" == "" ]; then
Finish="0"

#Test de REP_EXCLUS sinon creation
if ! test -e $EXCLUDE_FILE; then
touch $EXCLUDE_FILE
fi
# Test de PARTAGES_REP sinon creation
if ! test -e $PARTAGES_REP; then
touch $PARTAGES_REP
else cp $PARTAGES_REP/* /var/lib/samba/usershare
fi
# Lancement de l'icone globale en barre des taches
exec 3> >(zenity --notification --window-icon="$ICONE_REP/loaded.png" --listen --text="Sauvegarde USB via rsync et zenity.")
if [ $? -eq "1" ]; then
zenity --question --text="Voulez-vous vraiment fermer le programme ?"
if [ $? -eq "1" ]; then
rsync_usb_disk.sh stop
exit 0
fi
fi
Detect_USBHDD

## Prévient l'utilisateur de la fin de la synchronisation
if [ $Finish -eq "1" ]; then
zenity --info \
  --window-icon="$ICONE_REP/info.png" \
  --text="Sauvegarde USB terminée avec succès !"
if [ $? -eq "1" ]; then
Detect_USBHDD
fi
else	zenity --info \
  --window-icon="$ICONE_REP/warning.png" \
  --auto-close --auto_kill \
  --text="Sauvegarde USB inachevée ! Une erreur inconnue s'est produite."
fi
Detect_USBHDD
else 
zenity --info \
  --window-icon="$ICONE_REP/info.png" \
  --text="Le logiciel est déjà lancé !"
fi
RETVAL=0
;;
'stop')	
Kill_PROC
wait
ps -A  | grep zenity | awk '{print $1}' | xargs kill -9 &
RETVAL=0
;;
esac
exit $RETVAL


fichier rsync.awk :
{
   if (index($0, "to-check=") > 0)
   {
split($0, pieces, "to-check=");
term = substr(pieces[2], 0, length(pieces[2])-1);
split(term, division, "/");
print (1-(division[1]/division[2]))*100"%"
   }
   else
   {
print "#"$0;
   }
   fflush();
}


Fichier .$USER.exclusion :
/home/utilisateur/Musique
/home/utilisateur/Images
/home/utilisateur/telechargement
/home/utilisateur/.wine
/home/utilisateur/.VirtualBox
/home/utilisateur/.PlayOnLinux
*.bak
*.~
0
Rejoignez-nous