scripts/backup_pirate_usb.sh

281 lines
8.2 KiB
Bash
Raw Permalink Normal View History

2016-10-14 09:40:07 +02:00
#!/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
# -----------------------------------------------------------
# **********************************************************************************************