#!/bin/sh
################################################################################################
##
##  Nom: backup_pirate_usb.sh
##
##  Version: 0.2
##
##  Licence: Creative Commons
##
##  Comportement: Tentative de sauvegarde de données vers la clé usb en utilisant les
##    règles udev
##
##
##
################################################################################################
##
##  Date de création: 03-01-2012
##
##  Auteur: Gardouille
##
##
##  Dernière modifications:
##  03-01-2012 - 0.1:
##    - Création du script
##  04-01-2012 - 0.2:
##    - Ajout d'une boucle for qui parcourt les fichiers et les créée si nécessaire
##    - Utilisation de exec pour rediriger les sorties stdout et stderr
##      - cf http://abs.traduc.org/abs-5.0-fr/ch19.html#redir1
##    - Création de fonction pour rediriger et restaurer les sorties
##    -
# **********************************************************************************************
##  //2011 - :
##    -
##    -
# **********************************************************************************************
##  À Modifier:
##    - Redéfinir les paramètres choisi en fonction du mode debug pour utiliser les
##        fonctions de redirection des sorties
##    -
##
##
################################################################################################



# **********************************************************************************************
#
# Variables globales
#
# -----------------------------------------------------------
# 

## Choix du mode d'exécution du script:
## Niveau 0 (mode_debug=0)
# Exécution automatique avec normalement aucune interaction avec l'utilisateur.
## Niveau 1 (mode_debug=1)
# Exécution semi-automatique avec peu d'interaction nécessaire
## Niveau 2 (mode_debug=2)
# La sortie des différentes commandes est envoyée sur la sortie standard
mode_debug=2

case "$mode_debug" in
  0) ## Niveau minimum
    # La sortie standard sera redirigée dans un fichier de log
    redirect_stdout
    # La sortie d'erreur sera redirigée dans un fichier d'erreur
    redirect_stderr
    ;;
  1) ## Niveau moyen
    # Seulement la sortie d'erreur sera redirigée
    redirect_stderr
    ;;
  2) ## Niveau maximum
    # Le résultat des commandes reste sur la sortie standard
    echo "Mode debug"
    ;;
esac


# Partition à monter
PART="/dev/tipiak"

# Point de montage
MOUNT_POINT="/mnt/bkp_tipiak"

## Répertoire à sauvegarder
DIR="/media/data/config_debian/sid"

## Répertoire où s'effectue la sauvegarde (sur la clé usb)
BKP_DIR="backup"

## Obtenir le volume id d'un périphérique:
#hal-find-by-property --key block.device --string /dev/sdXX

## Obtenir le point de montage d'un périphérique à partir de son volume id:
#MOUNTPOINT=$(hal-get-property --udi /org/freedesktop/Hal/devices/le_volume_uuid_detrminé_precedemment --key volume.mount_point)

# Fin des variables globales
# -----------------------------------------------------------
# **********************************************************************************************


# **********************************************************************************************
#
# Fichiers globaux
#
# -----------------------------------------------------------
## Fichier de log
fichier_log="/tmp/backup_pirate_usb.log"
## Fichier de erreur
fichier_erreur="/tmp/backup_pirate_usb.err"

# Parcourir les fichiers et les créer si nécessaire
for fichier in ${fichier_log} ${fichier_erreur}; do
  if [ -f ${fichier} ]; then
    rm -f ${fichier}
  else
    touch ${fichier}
  fi
done

# Fin des fichiers globaux
# -----------------------------------------------------------
# **********************************************************************************************


# **********************************************************************************************
#
# Fonctions globales
#
# -----------------------------------------------------------
## Fonction d'affichage en fonction du mode debug choisi
echod() { [ "$mode_debug" -ge 2 ] && echo "(DEBUG) $*" ; }
echok() { [ "$mode_debug" -ge 2 ] && echo "(ok) $*" ; }
echoi() { [ "$mode_debug" -ge 1 ] && echo "(ii) $*" ; }
echow() { [ "$mode_debug" -ge 1 ] && echo "(!!) $*" ; }
echnk() { [ "$mode_debug" -ge 0 ] && echo "(EE) $*" ; }

## Redirection de la sortie standard (stdout) vers le fichier de log
redirect_stdout()
{
  # Sauvegarder la valeur de stdout dans le descripteur de fichier 6
  exec 6>&1

  # stdout remplacé par le fichier de log
  exec > ${fichier_log}
}

## Restauration de stdout
restore_stdout()
{
  # Test si le descripteur de fichier 6 existe
  if [ "$(lsof -a -p $$ -d6 | grep 6)" ]; then
    echo "Restauration de stdout et fermeture du descripteur de fichier 6"
    # Restaurer stdout et fermer le descripteur de fichier #6
    exec 1>&6 6>&-
  else
    echo "Le descripteur de fichier 6 n'existe pas. stdout est normalement en place"
  fi

}

## Redirection de la sortie d'erreur standard (stderr) vers le fichier d'erreur
redirect_stderr()
{
  # Sauvegarder la valeur de stderr dans le descripteur de fichier 7
  exec 7>&2

  # stderr remplacé par le fichier d'erreur
  exec 2> ${fichier_erreur}
}

## Restauration de stderr
restore_stderr()
{
  # Test si le descripteur de fichier 7 existe
  if [ "$(lsof -a -p $$ -d7 | grep 7)" ]; then
    echo "Restauration de stderr et fermeture du descripteur de fichier 7"
    # Restaurer stderr et fermer le descripteur de fichier #7
    exec 2>&7 7>&-
  else
    echo "Le descripteur de fichier 7 n'existe pas. stderr est normalement en place"
  fi

}


## Fonction d'erreur
# Affiche le message relative à la position de l'erreur                                                                                                                 # Et affiche les erreurs renvoyées
# - Prototype : erreur "MESSAGE_ERREUR"
erreur()
{
  ## Vérification du code retour de la dernière commande
  case "$?" in
    0 ) ## Si 0, tout s'est bien passé
      > "${fichier_erreur}" ## On vide le fichier d'erreur
      ;;  ## Pas d'erreur
    * ) ## Si différent de 0
      ## On affiche le message relatif à l'erreur
      echnk "Erreur lors de: -> ${1} <-"
      ## Et on arrête le script avec un code retour 1
      echnk "/!\\ Arrêt du script /!\\"
      exit 1;
      ;;
  esac
}

# Fin des fonctions globales
# -----------------------------------------------------------
# **********************************************************************************************



# **********************************************************************************************
#
# Programme principale
#
# -----------------------------------------------------------

# Vérification du nombre de paramètres, pas besoin de paramètres actuellement

echo "test no redirect 1 "

redirect_stdout
redirect_stderr

echo "Petit sleep de 10 secondes =)"
sleep 10s

echo "test redirect 2 "

# Création du point de montage si il n'existe pas
if [ ! -d $MOUNT_POINT ]; then
  echo "Création du point de montage"
  mkdir -p $MOUNT_POINT
fi

# Montage de la partition
echo "Montage de la partition"
mount $PART $MOUNT_POINT
# On vérifie si le montage s'est bien effectué
erreur "Montage de la partition"


# Création du répertoire de sauvegarde sur le point de montage
if [ ! -d $MOUNT_POINT/$BKP_DIR ]; then
  echo "Création du répertoire de sauvegarde sur le point de montage"
  mkdir -p $MOUNT_POINT/$BKP_DIR
fi

# Commande de synchronisation
echo "Début synchronisation"
rsync -rl --delete --stats $DIR $MOUNT_POINT/$BKP_DIR
#rsync -rl --delete --stats $DIR $MOUNT_POINT/$BKP_DIR > ${fichier_log} 2> ${fichier_erreur}

# Commande de synchronisation avec affichage graphique de la progression
#rsync -rl --delete --stats $DIR $MOUNT_POINT/$BKP_DIR  | zenity --text-info --title="Updating Podcasts" --width=600 --height=600
echo "Fin synchronisation"

# On donne tous les droits sur les fichiers de logs
echo "Attribution des droits sur les fichiers de log"
chmod 777 ${fichier_log} ${fichier_erreur}

# Démontage de la partition
echo "Démontage de la partition"
umount $MOUNT_POINT


echo "test final redirect 3 "

echo "Restauration des sorties"
restore_stdout
restore_stderr

exit 0
# Fin de la boucle principale
# -----------------------------------------------------------
# **********************************************************************************************