1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
| #! /bin/bash
######################################################################################
# Script de gestion de connexion et sauvegarde du /home de la clef sur le poste fixe #
######################################################################################
#------------------------------------------------------------------------------------#
# Fonction #
#------------------------------------------------------------------------------------#
afficheTaille () {
taille=$(sed '/\./! s/^.*$/&.00/' <<< $1)
i=1
while [[ ${#taille} -ge 7 ]]; do
taille=$(bc <<< "scale=2;$taille/1024")
((i+=1))
done
case $i in
1) taille+=" octets" ;;
2) taille+=" Ko" ;;
3) taille+=" Mo" ;;
4) taille+=" Go" ;;
esac
echo $taille
}
#-------------------------------------------------------------------------------------#
# Déclaration des variables #
#-------------------------------------------------------------------------------------#
# Paramètres d'identification de la clef
DEVTYPE="usb"
ID_SERIAL_SHORT="A500000000026452"
KEY_SYNC=/dev/LiveUSB2
USERNAME="leseb" # Indispensable pour l'affichage des fenêtres Zenity
# Répertoire source, destination, de montage de LiveUSB2, du montage du volume crypté, de backup du .img
SRC_DIR=/home/leseb/MOUNT/
DEST_DIR=/home/leseb/udevsync/
MONT_POINT=/home/leseb/MOUNT/
CRYPT_MOUNT=/home/leseb/CRYPT/
CONTENEUR=/home/leseb/MOUNT/luks-home.img
BKP_CONT=/home/leseb/Backup_IMG/
# Fichiers de log horodatés
BKP_DATE=`date +"%Y-%m-%d_%H-%M"`
LOG_FILE=/tmp/Logs_Sync/sdBackup_${BKP_DATE}.log
BKP_LOG_FILE=$DEST_DIR/Logs_Sync/sdBackup_${BKP_DATE}.log
RSYNC_ERR=/tmp/rsync.err
#------------------------------------------------------------------------------------#
# Algo #
#------------------------------------------------------------------------------------#
# Initialisation du fichier de log
echo "Backup du $BKP_DATE" >> $LOG_FILE
echo "Début à `date +'%H:%M:%S'`" >> $LOG_FILE
# Action à l'insertion de la clef
if [ "$ID_FS_TYPE" = "ext2" ] ; then # Variable de UDev pour l'insertion de clef
# Montage de la partition contenant le volume crypté
mount $KEY_SYNC $MONT_POINT
# Demande de synchronisation
su - ${USERNAME} -c "DISPLAY=:0.0 zenity --question --title='Bienvenue' --text='Clef montée. \nVoulez-vous synchroniser le <b>/home</b> de la clef ?'"
if [ "$?" = 0 ]; then # Si on clique sur "Valider"
if [ -f $CONTENEUR ] ; then # vérifie si le volume crypté existe
# Cherche un loop libre
loop=$(losetup -f)
/sbin/losetup $loop $CONTENEUR
# Ouverture du conteneur et saisie de mot de passe
mdp=$(su - ${USERNAME} -c "DISPLAY=:0.0 zenity --entry \
--title='Ouverture du conteneur chiffré' \
--text='Entrez le mot de passe pour ouvrir le conteneur chiffré' \
--hide-text")
# On envoie le mdp dans la commande
echo $mdp|sudo /sbin/cryptsetup luksOpen $loop LUKS
# On monte le contenu du conteneur dans un dossier
sudo mount -o loop /dev/mapper/LUKS $CRYPT_MOUNT
# Synchro + barre de progression
echo "0" > nb
DEBUT=$(date +%s)
rsync -av --delete --ignore-errors --force --progress $CRYPT_MOUNT/ $DEST_DIR/ 2>>$RSYNC_ERR | sed '
/to-check=/! {
/^sending/ {d;q;}
/\/$/ {d;q;}
/^sent/ {s/^.*$/echo "&" \>\/tmp\/rapport\.txt/e;d;q;};
/^total/ {s/^.*$/echo "&" \>\>\/tmp\/rapport\.txt/e;d;q;};
/^.\{43\}/ {s/\(^.\{20\}\).*\(.\{20\}$\)/echo \$\(\(\$\(cat nb\) + 1\)\) \> nb; echo "\1\[...\]\2" \>\/tmp\/svgrd_sed\.txt/e;d;q;};
/^.\{43\}/! {s/^.*$/echo \$\(\(\$\(cat nb\) + 1\)\) \> nb; echo "&" \>\/tmp\/svgrd_sed\.txt/e;d;q;};
}
/to-check=/ {
s/.*=\(.*\)\/\(.*\))/echo "#`echo "scale=2;\(\2-\1\)\*100\/\2" | bc | cut -d\. -f1`% (\$\(\(\2 - \1\)\) fichiers sur \2\) > \$\(cat \/tmp\/svgrd_sed\.txt\)"\; echo "scale=2;\(\2-\1\)\*100\/\2" | bc/e
}
' | su - ${USERNAME} -c "DISPLAY=:0.0 zenity --progress --width=580 --title='Synchronisation' --text='Initialisation de la sauvegarde...' --percentage=0 --auto-close"
FIN=$(date +%s)
TEMPS=$(($FIN-$DEBUT))
TP_HEU=$(sed 's/^.$/0&/' <<< $(($TEMPS/3600)))
TP_TMP=$(($TEMPS%3600))
TP_MIN=$(sed 's/^.$/0&/' <<< $(($TP_TMP/60)))
TP_SEC=$(sed 's/^.$/0&/' <<< $(($TP_TMP%60)))
TP=$(echo "$TP_HEU:$TP_MIN:$TP_SEC")
# Vérifie la sortie de rsync
ERR=$(cat $RSYNC_ERR)
if [[ ${#ERR} -ne 0 ]]; then
su - ${USERNAME} -c "DISPLAY=:0.0 zenity --error --title='Erreur de copie' --text='Problème lors de la sauvegarde du répertoire <b>$MOUNT_POINT</b>.\n\n<b><span color='red'>$ERR</span></b>.'"
rm $RSYNC_ERR
else
NB_FICH=$(cat nb)
ENVOI=$(afficheTaille $(cat /tmp/rapport.txt | grep sent | cut -d' ' -f2))
VITESS=$(afficheTaille $(cat /tmp/rapport.txt | grep sent | cut -d' ' -f9))
su - ${USERNAME} -c "DISPLAY=:0.0 zenity --info --title='Terminé' --text='Sauvegarde du répertoire\n<b>$CRYPT_MOUNT</b> effectuée avec succès.\n$NB_FICH fichiers synchronisés\nTemps:\t$TP\nTransfert:\t$VITESS/sec\nTotal transféré: $ENVOI'"
rm nb
fi
# Copie du log sur le répertoire de synchro
cp -f $LOG_FILE $BKP_LOG_FILE
# Précaution de backup du conteneur crypté
cp $CONTENEUR $BKP_CONT
else
su - ${USERNAME} -c "DISPLAY=:0.0 zenity --error \
--title='Erreur' \
--text='Aucun volume crypté trouvé !'"
fi
fi
fi
if [ "$ACTION" = "remove" ] ; then # Variable de UDev
# Démonter le volume crypté
umount $CRYPT_MOUNT
# Fermer le volume crypté
sudo /sbin/cryptsetup luksClose LUKS
# Libérer le loop
/sbin/losetup -d $loop
# Démontage de la clef
umount -f $KEY_SYNC >> $LOG_FILE
echo "Clef "$ID_MODEL" démontée ("$ACTION")" >> $LOG_FILE
su - ${USERNAME} -c "DISPLAY=:0.0 zenity --info --title='Au revoir' --text='Clef démontée avec succès.'"
fi
#------------------------------------------------------------------------------------#
# EOF #
#------------------------------------------------------------------------------------# |
Partager