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