#!/bin/bash # Path to backuppcfs script BACKUPPCFS_PATH="/usr/local/sbin/backuppcfs" BACKUPPCFS_MNT="/mnt/backuppcfs" MNT_DIR=/mnt/usb LUKS_DM_NAME=bkp-usb LUKS_DM_PATH=/dev/mapper/$LUKS_DM_NAME LUKS_KEY_FILE="/root/.luks.key" # LOCK_FILE LOCK_FILE=/var/lock/bkp-disk.lock MAIL_FROM=root@localhost MAIL_TO=root@localhost function usage() { echo "Usage : backup-usb [-d] [-c] [-l /path/to/log.file] [-u /dev/sdX]" echo " -d Debug mode" echo " -c Clean mode" echo " -l Log file path" echo " -u Path of USB disk device" } DEBUG=0 CLEAN_MODE=0 LOG="" DEVICE="" while getopts ":dcl:u:h" opt do case "$opt" in d) DEBUG=1 ;; c) CLEAN_MODE=1 ;; l) LOG="$OPTARG" ;; u) DEVICE="$OPTARG" ;; h) usage exit 0 ;; *) echo "Invalid '$opt' parameter" echo usage exit 1 esac done # # Functions # function is_mount () { mount | grep -c "$1 " } function send_mail () { echo "$2"|mail -s "$1" -r "$MAIL_FROM" "$MAIL_TO" } function debug () { d=`date "+%Y-%m-%d - %Hh%Mm%Ss"` if [ -z "$LOG" ] then echo "$d -- [$1] $2" else echo "$d -- [$1] $2" >> $LOG 2>&1 fi if [ "$1" == "HALT" ] then beep -f 300 -l 2000 fi if [ "$3" == "send" ] then if [ -z "$LOG" ] then echo "$d -- [INFO] Send mail" else echo "$d -- [INFO] Send mail" >> $LOG 2>&1 fi send_mail "[$1] Export sauvegardes Backup PC" "$2" fi } function backup() { debug INFO Start send if [ -f $LOCK_FILE ] then debug ERREUR "Le fichier de lock est toujours présent ($LOCK_FILE)." send debug HALT exit 1 fi debug INFO "Dépot du fichier de lock." echo $$ > $LOCK_FILE beep -f 1000 -r 2 -l 100 if [ -e $LUKS_DM_PATH ] then debug ERREUR "Le device $LUKS_DM_NAME existe deja ($LUKS_DM_PATH)." send debug HALT exit 1 fi debug INFO "Ouverture du disque LUKS ..." cryptsetup luksOpen $DEVICE $LUKS_DM_NAME --key-file $LUKS_KEY_FILE RES=$? if [ $RES -ne 0 ] then debug ERREUR "La commande 'cryptsetup luksOpen' n'a pas retourne 0. Code retour : $RES" send debug HALT exit $RES else debug INFO "Fait." fi if [ `is_mount $LUKS_DM_PATH` -eq 1 ] then debug ERREUR "Le disque est déjà monté" send debug HALT exit 1 fi debug INFO "Montage du disque." mount $LUKS_DM_PATH $MNT_DIR if [ `is_mount $LUKS_DM_PATH` -eq 0 ] then debug ERREUR "Problème durant le montage du disque dur." send debug HALT exit 1 fi debug INFO "Disque monté." debug INFO "Montage de BackupPC FS..." $BACKUPPCFS_PATH $BACKUPPCFS_MNT RES=$? if [ $RES -ne 0 ] then debug ERREUR "Problème durant le montage de BackupPC FS. Code retour : $RES" umount $BACKUPPCFS_MNT umount $LUKS_DM_PATH cryptsetup close $LUKS_DM_NAME debug HALT exit 1 else debug INFO "Fait." fi sleep 2 debug INFO "Export des sauvegardes ..." for dir in $BACKUPPCFS_MNT/* do [ ! -d "$dir" -o ! -d "$dir/latest/" ] && continue host="$( basename "$dir")" debug INFO "Export de la dernière sauvegarde du serveur $host ..." rsync -a --delete --numeric-ids "$dir/latest/" --exclude='/dev/*' "$MNT_DIR/$host/" RES=$? if [ $RES -ne 0 ] then debug ERREUR "Problème durant l'export de la sauvegarde du serveur $host (Code retour : $RES)" send else debug INFO "Fait." fi done debug INFO "Export des sauvegardes terminé" debug INFO "Démontage de BackupPC FS..." umount $BACKUPPCFS_MNT RES=$? if [ $RES -ne 0 ] then debug ERREUR "Problème durant le démontage de BackupPC FS (Code retour : $RES)" send else debug INFO "Fait." fi debug INFO "Démontage du disque" umount $LUKS_DM_PATH if [ `is_mount $LUKS_DM_PATH` -eq 1 ] then debug ERREUR "Problème durant le démontage du disque dur." send debug HALT exit 1 else debug INFO "Fait." fi debug INFO "Fermeture du disque LUKS..." cryptsetup close $LUKS_DM_NAME RES=$? if [ $RES -ne 0 ] then debug ERREUR "Problème durant la fermeture du disque LUKS" send debug HALT exit 1 fi debug INFO "Suppression du fichier de lock" rm -f $LOCK_FILE debug INFO "Stop" send beep -f 1000 -l 2000 } function clean () { umount $MNT_DIR cryptsetup close $LUKS_DM_NAME umount $BACKUPPCFS_MNT rm -f $LOCK_FILE } # Manage clean mode if [ "$CLEAN_MODE" == "1" ] then clean exit 0 fi # Else : we are in backup mode if [ -n "$LOG" ] then # Close STDOUT file descriptor exec 1<&- # Close STDERR FD exec 2<&- # Open STDOUT as $LOG file for read and write. exec 1<>$LOG # Redirect STDERR to STDOUT exec 2>&1 fi if [ -z "$DEVICE" ] then debug FATAL "Il faut specifié le disque USB avec le paramètre -u !" usage exit 1 fi backup