#!/bin/bash

#fonction killeur qui sert a tuer le processus de la pulse bar quand la sauvegarde ou l'installation est terminée
# on sait qu'elle est terminé quand le fichier instal-sauv.log existe et n''est pas vide
killeur()
{

PID_ZENITY=${!}

PID_CHILD=$(pgrep -o -P $$)

while "$PID_ZENITY" != "" ]
do
  PID_TASKS=$(pgrep -d ' ' -P ${PID_CHILD})
  PID_ZENITY=$(ps h -o pid --pid ${PID_ZENITY} | xargs)
  sleep 1
done
"${PID_TASKS}" != "" ] && kill -${PID_TASKS}

(
PID_DD=`pidof dd`
until -e $PID_DD  ]
do
    kill  -s $PID_DD
    sleep 1
    break
done

fichier=`cat instal-sauv.log`
while -s "$fichier" ]
do  
    fichier=`cat instal-sauv.log`           
done 
) | zenity --title="SD tools" --progress --pulsate --width=400 --text="
                    <span color=\"red\"><b><big>arrêt en cours</big></b></span>
<span color=\"blue\">veuillez patienter...</span>" --auto-close 2>/dev/null  

zenity --info --title "SD tools" --width=400 --text "

    <span color=\"red\"><b><big>Vous pouvez débrancher la carte SD </big></b></span>

2>/dev/null

}

# boite de dialogue intro
zenity --info --timeout=--title "SD tools" --width=400 --text "
<span color=\"blue\"><b><big>SDTools</big></b></span>
    <span color=\"green\" background=\"black\">Powered </span><span color=\"yellow\" background=\"black\">by</span><span color=\"red\" background=\"black\"> manu</span>


<b><big> Veuillez brancher votre carte SD </big></b>

<span color=\"blue\">Puis valider</span>" 2>/dev/null

# boite de dialogue qui demande le chemin du dossier où se trouve les images, vous pouvez changer le chemin par défaut  après --entry text
CHEM=$(zenity --title "SD tools" --entry --width=400 --text "Chemin du dossier où se trouve les images de Raspbian " --entry-text "/home/manu/Documents/Raspi/" 2>/dev/null)
exitstatus=$?
if $exitstatus ]; then    
    zenity --error --title "SD tools" --width=400 --text "<span color=\"red\"><b><big>Vous avez annulé</big></b></span>" 2>/dev/null
    exit
fi
cd ${CHEM}

# on lit le dossier courant et on met la liste des fichiers .img  dans une variable
i=0
for in $(find *.img *.iso )
do 
  rep[$i]=$(basename $j)
  ((i++))
done

# on liste les disques branchés au pc et on place la liste dans une variable
fdisk -l sed -n '/Disque \/dev\/sd/p' > /tmp/test.txt
tout=`sed '' /tmp/test.txt`

# on récupère que le nom (ex: sdd) du dernier disque branché au pc et on le place dans une variable
fdisk -l sed -n '/Disque \/dev\/sd/p' sed -n '$ p' > /tmp/test.txt
cle=`cut -c 13-15 /tmp/test.txt`

# on supprime le fichier tampon ( pas nécessaire car dans /tmp)
rm /tmp/test.txt

# on vérifie que c'est bien une cle USB en verifiant que la taille < 64 Giga
taille=`fdisk -l /dev/${cle} | grep "Disque" | cut -d: -f2 | cut -d\( -f1 | cut -d, -f1`

if $taille -lt 64 ]; then
    # boite de dialogue qui affiche la liste des disques du pc et propose le dernier monté comme clé a utiliser
    zenity --info --timeout=--title "SD tools" --width=400 --text "
    <span color=\"blue\">Voici la liste des disques :  </span>  
    ${tout}
    <span color=\"blue\">votre clé est :</span> <span color=\"green\">${cle}</span>
    <span color=\"red\">Sinon pas de panique, </span><span color=\"blue\">vous pouvez changer à l'étape suivante</span>" 2>/dev/null  
else 
    # boite de dialogue pour prévenir que c'est pas une clé USB et sortir du programme
    zenity --error --timeout=--title "SD tools" --width=400 --text "
    <span color=\"blue\">Attention :  </span>   
    <span color=\"blue\">votre clé est un hdd:</span> <span color=\"green\">${cle}</span>
    <span color=\"red\">Faite attention !!!</span>" 2>/dev/null
    exit
fi  

# on détourne la sortie du shell dans un fichier sd.log pour pouvoir l'afficher dans une boite de dialogue 
exec &> sd.log
# boite de dialogue qui demande le nom de la clé à utiliser, avec par défaut le dernière branché au pc
# si c'est ok on demonte la clé pour pouvoir travailler dessus et affiche le résultat
SD=$(zenity --title "SD tools" --entry --width=400 --text 'C est bien le nom de la carte sd ?  ' --entry-text ${cle} 2>/dev/null )
exitstatus=$?
if $exitstatus ]; then
    umount /dev/${SD}
    zenity --text-info --filename=sd.log --width=400 --height=300  --timeout=4 2>/dev/null  
    rm sd.log
else
    zenity --error --title "SD tools" --width=400 --text "<span color=\"red\"><b><big>Vous avez annulé</big></b></span>" 2>/dev/null
    rm sd.log
    exit
fi

# on détourne la sortie du shell dans un fichier instal-sauv.log pour pouvoir l'afficher dans une boite de dialogue 
exec &> instal-sauv.log
 # boite de dialogue installation ou sauvegarde 
if (zenity --question --title "SD tools" --width=400 --text "Voulez-vous Installer Raspbian ou Sauvegarder votre carte SD ?" --ok-label="Installation" --cancel-label="Sauvegarde" 2>/dev/null); then
    # si installation choisi 1ere étape, on propose de formater, si le formatage pas nécessaire, on annule et passe a l'étape suivante
    if (zenity --question --title "SD tools" --width=400 --text "Veux-tu formater la carte sd ?" --ok-label="Oui" --cancel-label="Non" 2>/dev/null); then                   
        mkfs.vfat -n RASPI -32 -/dev/${SD} > >(zenity --title "SD tools" --progress --pulsate --text "formatage de la carte sd en cours ... " --auto-close 2>/dev/null) >> format.log
        zenity --text-info --width=400 --height=300 --timeout=--filename=format.log   2>/dev/null 
        rm format.log
    else    
        zenity --info --title "SD tools" --width=400 --text "<span color=\"red\"><b><big>Ok, pas besoin de formater.</big></b></span>" 2>/dev/null      
    fi
    # si installation choisi 2eme étape, boite de dialogue quelle image installer ? avec la liste des images présentes dans le dossier où se trouve ce script.
    # une fois l'image choisie on lance la copie et quand c'est fini affiche le log
    IMG=$(zenity --list --title="Quelle image voulez vous installer ?" --column="image" ${rep[@]}   2>/dev/null )
    exitstatus=$?
    if $exitstatus ]; then
        ./killdd.sh &
        dd bs=4M if=${CHEM}${IMG} of=/dev/${SD} > >(zenity --title "SD tools" --progress --pulsate --text "Installation en cours patienter environ 5 à 10 minutes ..." --auto-close 2>/dev/null )      
        killeur
    else
        zenity --error --title "SD tools" --width=400 --text "<span color=\"red\"><b><big>Vous avez annulé</big></b></span>" 2>/dev/null 
        exit                   
    fi      
    zenity --text-info --width=400 --height=300 --timeout=--title='SD tools' --filename=instal-sauv.log 2>/dev/null
    rm instal-sauv.log
    zenity --info --width=400 --title='SD tools' --text="Voilà c'est terminé" 2>/dev/null     
else
    # si sauvegarde choisi , on demande d'entrer un nom pour l'image que l'on va créer
    # on créer la sauvegarde  ( clone ) quand c'est fini affiche le log
    NOM=$(zenity --entry --title "SD tools" --width=400 --text "donne un nom à cette image :" 2>/dev/null) 
    exitstatus=$?
    if $exitstatus ]; then    
        touch ${CHEM}${NOM}.img
        ./killdd.sh &      
        dd bs=4M if=/dev/${SD} of=${CHEM}${NOM}.img > >(zenity --title "SD tools" --progress --pulsate --text "Sauvegarde en cours patienter environ 10 à 20 minutes ..." --auto-close 2>/dev/null )
        killeur
    else        
        zenity --error --title "SD tools" --width=400 --text "<span color=\"red\"><b><big>Vous avez annulé</big></b></span>" 2>/dev/null
        exit                    
    fi      
    zenity --text-info --width=400 --height=300 --timeout=--title='SD tools' --filename=instal-sauv.log   
    rm instal-sauv.log
    zenity --info --width=400 --title='SD tools' --text="Voilà c'est terminé" 2>/dev/null 
fi
umount /dev/${SD}*
exit