281 lines
8.2 KiB
Bash
Executable File
281 lines
8.2 KiB
Bash
Executable File
#!/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
|
||
# -----------------------------------------------------------
|
||
# **********************************************************************************************
|
||
|
||
|