├── LICENSE ├── README.md ├── backup.sh ├── install.sh └── restore.sh /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Quentin PANISSIER 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Scripts de sauvegarde/restauration 2 | ================================== 3 | 4 | Pour plus de détail, allez voir ce topic : http://mondedie.fr/viewtopic.php?pid=13088 5 | 6 | ### Installation 7 | 8 | ```bash 9 | apt-get update && apt-get dist-upgrade 10 | apt-get install git-core 11 | ``` 12 | 13 | ```bash 14 | cd /opt 15 | git clone https://github.com/hardware/full-backup.git 16 | cd full-backup 17 | chmod +x *.sh && ./install.sh 18 | ``` 19 | 20 | ### Mise à jour 21 | 22 | **ATTENTION** : Pensez à mettre à jour les scripts régulièrement avec la commande suivante (Ne faites pas un simple git pull sinon vous allez devoir refaire l'installation...) : 23 | 24 | ```bash 25 | cd /opt/full-backup && git stash && git pull && git stash pop 26 | ``` 27 | 28 | ### Support 29 | 30 | Si vous avez une question, une remarque ou une suggestion, n'hésitez pas à poster un commentaire sur ce topic : http://mondedie.fr/viewtopic.php?pid=13088 31 | 32 | ### License 33 | MIT. Voir le fichier ``LICENCE`` pour plus de détails 34 | -------------------------------------------------------------------------------- /backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # @(#) Nom du script .. : backup.sh 4 | # @(#) Version ........ : 1.00 5 | # @(#) Date ........... : 19/09/2014 6 | # Auteurs ........ : Hardware 7 | 8 | #~ 9 | #~ @(#) Description : Script de sauvegarde d'un système sous linux 10 | 11 | # -------------------------------------------------------------------- 12 | # Adresse email de reporting 13 | REPORTING_EMAIL= 14 | 15 | # Paramètres de connexion au serveur FTP 16 | HOST='' 17 | USER='' 18 | PASSWD='' 19 | PORT= 20 | # -------------------------------------------------------------------- 21 | 22 | CDAY=$(date +%d%m%Y-%H%M) 23 | NB_MAX_BACKUP= 24 | BACKUP_PARTITION=/var/backup/local 25 | BACKUP_FOLDER=$BACKUP_PARTITION/backup-$CDAY 26 | ERROR_FILE=$BACKUP_FOLDER/errors.log 27 | FTP_FILE=$BACKUP_FOLDER/ftp.log 28 | ARCHIVE=$BACKUP_FOLDER/backup-$CDAY.tar.gz 29 | LOG_FILE=/var/log/backup.log 30 | FTP_REMOTE_PATH="/" 31 | 32 | # Identifiant de la clé GPG 33 | KEYID='' 34 | 35 | # Définition des variables de couleurs 36 | CSI="\033[" 37 | CEND="${CSI}0m" 38 | CRED="${CSI}1;31m" 39 | CGREEN="${CSI}1;32m" 40 | CPURPLE="${CSI}1;35m" 41 | CCYAN="${CSI}0;36m" 42 | 43 | ################################################## 44 | 45 | # Upload de l'archive sur un serveur distant 46 | uploadToRemoteServer() { 47 | 48 | # La commande ftp n'est pas compatible avec SSL/TLS donc on utilise lftp à la place 49 | lftp -d -e "cd $FTP_REMOTE_PATH; \ 50 | lcd $BACKUP_FOLDER; \ 51 | put backup-$CDAY.tar.gz; \ 52 | put backup-$CDAY.tar.gz.sig; \ 53 | put backup-$CDAY.tar.gz.pub; \ 54 | bye" -u $USER,$PASSWD -p $PORT $HOST 2> "$FTP_FILE" > /dev/null 55 | 56 | FILES_TRANSFERRED=$(grep -ci "226" "$FTP_FILE") 57 | 58 | # On vérifie que les 3 fichiers ont bien été transférés 59 | if [[ $FILES_TRANSFERRED -ge 3 ]]; then 60 | echo "OK" 61 | fi 62 | 63 | } 64 | 65 | sendErrorMail() { 66 | 67 | SERVER_NAME=$(hostname -s) 68 | 69 | echo -e "Subject: ${SERVER_NAME^^} - Echec de la sauvegarde 70 | Une erreur est survenue lors de l'execution du script de sauvegarde. 71 | $2 72 | 73 | Detail de l'erreur : 74 | ---------------------------------------------------------- 75 | 76 | $(cat "$1") 77 | 78 | ---------------------------------------------------------- 79 | 80 | INFO Serveur : 81 | 82 | @IP : $(hostname -i) 83 | Hostname : $(uname -n) 84 | Kernel : $(uname -r) 85 | " > /tmp/reporting.txt 86 | 87 | sendmail $REPORTING_EMAIL < /tmp/reporting.txt 88 | 89 | } 90 | 91 | ################################################## 92 | 93 | if [[ $EUID -ne 0 ]]; then 94 | echo "" 95 | echo -e "${CRED}/!\ ERREUR: Vous devez être connecté en tant que root pour pouvoir exécuter ce script.${CEND}" 1>&2 96 | echo "" 97 | exit 1 98 | fi 99 | 100 | echo "" | tee -a $LOG_FILE 101 | echo -e "${CCYAN} $(date "+%d/%m/%Y à %Hh%M") ${CEND}" | tee -a $LOG_FILE 102 | echo -e "${CCYAN}###################################################${CEND}" | tee -a $LOG_FILE 103 | echo "" | tee -a $LOG_FILE 104 | echo -e "${CCYAN} DEMARRAGE DU SCRIPT DE BACKUP ${CEND}" | tee -a $LOG_FILE 105 | echo "" | tee -a $LOG_FILE 106 | echo -e "${CCYAN}###################################################${CEND}" | tee -a $LOG_FILE 107 | echo "" | tee -a $LOG_FILE 108 | 109 | if [[ ! -d "$BACKUP_PARTITION" ]]; then 110 | mkdir -p "$BACKUP_PARTITION" > /dev/null 2>&1 111 | fi 112 | 113 | if [[ -e "$BACKUP_FOLDER" ]]; then 114 | rm -rf "$BACKUP_FOLDER" 115 | fi 116 | 117 | mkdir "$BACKUP_FOLDER" 118 | 119 | # On vérifie que le fichier .excluded-paths existe bien 120 | if [[ ! -f /opt/full-backup/.excluded-paths ]]; then 121 | echo -e "\n${CRED}/!\ ERREUR: Le fichier${CEND} ${CPURPLE}/opt/full-backup/.excluded-paths${CEND} ${CRED}n'existe pas !${CEND}" | tee -a $LOG_FILE 122 | echo -e "" | tee -a $LOG_FILE 123 | exit 1 124 | fi 125 | 126 | echo -n "> Compression des fichiers système" | tee -a $LOG_FILE 127 | tar --warning=none -cpPzf "$ARCHIVE" --exclude-from=/opt/full-backup/.excluded-paths / 2> "$ERROR_FILE" 128 | 129 | # Si une erreur survient lors de la compression 130 | if [[ -s "$ERROR_FILE" ]]; then 131 | echo -e "\n${CRED}/!\ ERREUR: Echec de la compression des fichiers système.${CEND}" | tee -a $LOG_FILE 132 | echo -e "" | tee -a $LOG_FILE 133 | sendErrorMail "$ERROR_FILE" "Echec de la compression des fichiers systeme." 134 | exit 1 135 | fi 136 | 137 | echo -e " ${CGREEN}[OK]${CEND}" | tee -a $LOG_FILE 138 | 139 | # Récupère la taille de l'archive en octets 140 | SIZE=$(wc -c "$ARCHIVE" | cut -f 1 -d ' ') 141 | # HUMANSIZE=$(echo ${SIZE} | awk '{ sum=$1 ; hum[1024**3]="Go";hum[1024**2]="Mo";hum[1024]="Ko"; \ 142 | # for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}') 143 | 144 | # 2147483648 = 2GB = 2Go 145 | if [[ "$SIZE" -gt 2147483648 ]]; then 146 | echo -e "\n${CRED}/!\ ATTENTION: L'archive est très volumineuse.${CEND}" | tee -a $LOG_FILE 147 | echo -e "\n${CRED}/!\ Vous devriez exclure d'avantage de répertoires dans le fichier d'exclusion.${CEND}" | tee -a $LOG_FILE 148 | echo -e "" | tee -a $LOG_FILE 149 | sendErrorMail "Archive trop volumineuse, merci de vérifier le fichier d'exclusion." 150 | fi 151 | 152 | # On vérifie que le fichier .gpg-passwd existe bien 153 | if [[ ! -f /opt/full-backup/.gpg-passwd ]]; then 154 | echo -e "\n${CRED}/!\ ERREUR: Le fichier${CEND} ${CPURPLE}/opt/full-backup/.gpg-passwd${CEND} ${CRED}n'existe pas !${CEND}" | tee -a $LOG_FILE 155 | echo -e "" | tee -a $LOG_FILE 156 | exit 1 157 | fi 158 | 159 | if [[ "$KEYID" = "" ]]; then 160 | echo -e "\n${CRED}/!\ ERREUR: La variable KEYID n'est pas définie.${CEND}" | tee -a $LOG_FILE 161 | echo -e "" | tee -a $LOG_FILE 162 | exit 1 163 | fi 164 | 165 | gpg --export --armor --local-user $KEYID 2>&1 > /dev/null | fgrep -q "WARNING: nothing exported" 166 | 167 | # On vérifie que la paire de clé publique / clé privée a bien créée 168 | if [[ $? -eq 0 ]]; then 169 | echo -e "\n${CRED}/!\ ERREUR: Aucune clé publique n'a été détectée !${CEND}" | tee -a $LOG_FILE 170 | echo -e "${CRED}/!\ Exécuter la commande suivante pour en créer une :${CEND}" | tee -a $LOG_FILE 171 | echo "-> gpg --gen-key" | tee -a $LOG_FILE 172 | echo "" | tee -a $LOG_FILE 173 | exit 1 174 | fi 175 | 176 | echo -n "> Création de la signature de l'archive" | tee -a $LOG_FILE 177 | # Exportation de la clé publique 178 | gpg --export --armor --local-user $KEYID > "$ARCHIVE".pub 179 | # Création de la signature 180 | gpg --yes --batch --no-tty --local-user $KEYID --passphrase-file=/opt/full-backup/.gpg-passwd --detach-sign "$ARCHIVE" 181 | 182 | echo -e " ${CGREEN}[OK]${CEND}" | tee -a $LOG_FILE 183 | 184 | NB_ATTEMPT=1 185 | 186 | echo -n "> Transfert de l'archive vers le serveur distant" | tee -a $LOG_FILE 187 | while [[ -z $(uploadToRemoteServer) ]]; do 188 | if [[ "$NB_ATTEMPT" -lt 4 ]]; then 189 | echo -e "\n${CRED}/!\ ERREUR: Echec du transfert... Tentative $NB_ATTEMPT${CEND}" | tee -a $LOG_FILE 190 | let "NB_ATTEMPT += 1" 191 | sleep 10 192 | else 193 | echo -e "\n${CRED}/!\ ERREUR: Echec du transfert de l'archive vers le serveur distant.${CEND}" | tee -a $LOG_FILE 194 | echo "" | tee -a $LOG_FILE 195 | sendErrorMail "$FTP_FILE" "Echec du transfert de l'archive vers le serveur distant." 196 | exit 1 197 | fi 198 | done 199 | echo -e " ${CGREEN}[OK]${CEND}" | tee -a $LOG_FILE 200 | 201 | # Retrouve le nombre de sauvegardes effectuées 202 | nbBackup=$(find $BACKUP_PARTITION -type d -name 'backup-*' | wc -l) 203 | 204 | if [[ "$nbBackup" -gt $NB_MAX_BACKUP ]]; then 205 | 206 | # Recherche l'archive la plus ancienne 207 | oldestBackupPath=$(find $BACKUP_PARTITION -type d -name 'backup-*' -printf '%T+ %p\n' | sort | head -n 1 | awk '{print $2}') 208 | oldestBackupFile=$(find $BACKUP_PARTITION -type d -name 'backup-*' -printf '%T+ %p\n' | sort | head -n 1 | awk '{split($0,a,/\//); print a[5]}') 209 | 210 | echo -en "> Suppression de l'archive la plus ancienne (${CPURPLE}$oldestBackupFile.tar.gz${CEND})" | tee -a $LOG_FILE 211 | 212 | # Supprime le répertoire du backup 213 | rm -rf "$oldestBackupPath" 214 | 215 | # Supprime l'archive, le fichier de signature et la clé publique sur le serveur FTP 216 | lftp -d -e "cd $FTP_REMOTE_PATH; \ 217 | rm $oldestBackupFile.tar.gz; \ 218 | rm $oldestBackupFile.tar.gz.sig; \ 219 | rm $oldestBackupFile.tar.gz.pub; \ 220 | bye" -u $USER,$PASSWD -p $PORT $HOST 2>> "$FTP_FILE" > /dev/null 221 | 222 | FILES_REMOVED=$(grep -ci "250\(.*\)dele" "$FTP_FILE") 223 | 224 | # On vérifie que les 3 fichiers ont bien été supprimés 225 | if [[ "$FILES_REMOVED" -ne 3 ]]; then 226 | MESSAGE="Echec lors de la suppression de la sauvegarde le serveur FTP." 227 | echo -e "\n${CRED}/!\ ERREUR: ${MESSAGE}${CEND}" | tee -a $LOG_FILE 228 | echo "" | tee -a $LOG_FILE 229 | sendErrorMail "$FTP_FILE" "$MESSAGE" 230 | exit 1 231 | fi 232 | 233 | echo -e " ${CGREEN}[OK]${CEND}" | tee -a $LOG_FILE 234 | fi 235 | 236 | echo -e "${CGREEN}> Sauvegarde terminée avec succès !${CEND}" | tee -a $LOG_FILE 237 | echo "" | tee -a $LOG_FILE 238 | 239 | exit 0 240 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # @(#) Nom du script .. : install.sh 4 | # @(#) Version ........ : 1.00 5 | # @(#) Date ........... : 19/09/2014 6 | # Auteurs ........ : Hardware 7 | 8 | ERROR_FILE=./errors.log 9 | FTP_FILE=./ftp.log 10 | 11 | CSI="\033[" 12 | CEND="${CSI}0m" 13 | CRED="${CSI}1;31m" 14 | CGREEN="${CSI}1;32m" 15 | CPURPLE="${CSI}1;35m" 16 | CCYAN="${CSI}1;36m" 17 | 18 | # ########################################################################## 19 | 20 | smallLoader() { 21 | echo "" 22 | echo "" 23 | echo -ne '[ + + + ] 3s \r' 24 | sleep 1 25 | echo -ne '[ + + + + + + ] 2s \r' 26 | sleep 1 27 | echo -ne '[ + + + + + + + + + ] 1s \r' 28 | sleep 1 29 | echo -ne '[ + + + + + + + + + ] Appuyez sur [ENTRÉE] pour continuer... \r' 30 | echo -ne '\n' 31 | 32 | read -r 33 | } 34 | 35 | # ########################################################################## 36 | 37 | if [[ $EUID -ne 0 ]]; then 38 | echo "" 39 | echo -e "${CRED}/!\ ERREUR: Vous devez être connecté en tant que root pour pouvoir exécuter ce script.${CEND}" 1>&2 40 | echo "" 41 | exit 1 42 | fi 43 | 44 | clear 45 | 46 | echo "" 47 | echo -e "${CCYAN} Configuration du script de sauvegarde ${CEND}" 48 | echo "" 49 | echo -e "${CCYAN} 50 | ███╗ ███╗ ██████╗ ███╗ ██╗██████╗ ███████╗██████╗ ██╗███████╗ ███████╗██████╗ 51 | ████╗ ████║██╔═══██╗████╗ ██║██╔══██╗██╔════╝██╔══██╗██║██╔════╝ ██╔════╝██╔══██╗ 52 | ██╔████╔██║██║ ██║██╔██╗ ██║██║ ██║█████╗ ██║ ██║██║█████╗ █████╗ ██████╔╝ 53 | ██║╚██╔╝██║██║ ██║██║╚██╗██║██║ ██║██╔══╝ ██║ ██║██║██╔══╝ ██╔══╝ ██╔══██╗ 54 | ██║ ╚═╝ ██║╚██████╔╝██║ ╚████║██████╔╝███████╗██████╔╝██║███████╗██╗██║ ██║ ██║ 55 | ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝╚═════╝ ╚══════╝╚═════╝ ╚═╝╚══════╝╚═╝╚═╝ ╚═╝ ╚═╝ 56 | 57 | ${CEND}" 58 | echo "" 59 | 60 | echo "" 61 | echo -e "${CCYAN}---------------------------------${CEND}" 62 | echo -e "${CCYAN}[ INSTALLATION DES PRÉ-REQUIS ]${CEND}" 63 | echo -e "${CCYAN}---------------------------------${CEND}" 64 | echo "" 65 | 66 | echo -e "${CGREEN}-> Installation de LFTP, GnuPG et rng-tools ${CEND}" 67 | echo "" 68 | 69 | apt-get install -y lftp gnupg rng-tools 70 | export GPG_TTY=$(tty) 71 | 72 | if [[ $? -ne 0 ]]; then 73 | echo "" 74 | echo -e "\n ${CRED}/!\ FATAL: Une erreur est survenue pendant l'installation des pré-requis.${CEND}" 1>&2 75 | echo "" 76 | exit 1 77 | fi 78 | 79 | smallLoader 80 | clear 81 | 82 | echo -e "${CCYAN}---------------------------------${CEND}" 83 | echo -e "${CCYAN}[ PARAMÈTRES DE CONNEXION FTP ]${CEND}" 84 | echo -e "${CCYAN}---------------------------------${CEND}" 85 | echo "" 86 | 87 | getCredentials() { 88 | 89 | read -rp "> Veuillez saisir l'adresse du serveur ftp : " HOST 90 | read -rp "> Veuillez saisir le numéro du port [Par défaut: 21] : " PORT 91 | read -rp "> Veuillez saisir le nom d'utilisateur : " USER 92 | read -srp "> Veuillez saisir le mot de passe : " PASSWD 93 | 94 | if [[ "$PORT" = "" ]]; then 95 | PORT=21 96 | fi 97 | 98 | echo -e "\n\nParamètres de connexion :" 99 | echo -e "- Adresse du serveur : ${CPURPLE}$HOST${CEND}" 100 | echo -e "- Nom d'utilisateur : ${CPURPLE}$USER${CEND}" 101 | echo -e "- Port : ${CPURPLE}$PORT${CEND}" 102 | } 103 | 104 | getCredentials 105 | 106 | echo "set ssl:verify-certificate false" > ~/.lftprc 107 | 108 | echo -e "" 109 | echo -n "Test de connexion en cours..." 110 | 111 | until lftp -d -e "ls; bye" -u "$USER","$PASSWD" -p "$PORT" "$HOST" 2> "$FTP_FILE" > /dev/null 112 | do 113 | grep -i "150\(.*\)connection" $FTP_FILE 114 | 115 | if [[ $? -eq 0 ]]; then 116 | break 117 | fi 118 | 119 | echo "" 120 | echo -e "${CRED}/!\ Erreur: Un problème est survenu lors de la connexion au serveur FTP.${CEND}" 1>&2 121 | echo -e "${CRED}/!\ Erreur: Merci de re-saisir les paramètres de connexion :${CEND}" 1>&2 122 | echo "" 123 | getCredentials 124 | echo "" 125 | done 126 | echo -e " ${CGREEN}Connexion au serveur FTP [OK]${CEND}" 127 | 128 | echo "" 129 | read -rp "> Veuillez saisir votre adresse email : " EMAIL 130 | read -rp "> Combien d'archives voulez-vous garder au maximum ? [Par défaut: 10] " NBACKUPS 131 | read -rp "> Saisir le chemin de stockage sur le serveur FTP [Par défaut: / (racine)] " FTPPATH 132 | 133 | if [[ "$NBACKUPS" = "" ]]; then 134 | NBACKUPS=10 135 | fi 136 | 137 | if [[ "$FTPPATH" = "" ]]; then 138 | FTPPATH="/" 139 | fi 140 | 141 | # On échappe les caractères spéciaux dans l'URL 142 | HOST_ESCP=$(echo "$HOST" | sed -e 's/[]\/$*.^|[]/\\&/g') 143 | 144 | echo "" 145 | echo -n "Ajout des paramètres de connexion au serveur FTP" 146 | sed -i -e "s/\(HOST=\).*/\1'$HOST_ESCP'/" \ 147 | -e "s/\(USER=\).*/\1'$USER'/" \ 148 | -e "s/\(PASSWD=\).*/\1'$PASSWD'/" \ 149 | -e "s/\(PORT=\).*/\1$PORT/" \ 150 | -e "s/\(NB_MAX_BACKUP=\).*/\1$NBACKUPS/" backup.sh restore.sh 151 | 152 | if [[ "$FTPPATH" != "/" ]]; then 153 | sed -i "s/\(FTP_REMOTE_PATH=\).*/\1'$FTPPATH'/" backup.sh restore.sh 154 | fi 155 | 156 | # Ajout de l'adresse email de reporting 157 | sed -i "s/\(REPORTING_EMAIL=\).*/\1$EMAIL/" backup.sh restore.sh 158 | echo -e " ${CGREEN}[OK]${CEND}" 159 | 160 | smallLoader 161 | clear 162 | 163 | echo -e "${CCYAN}---------------------------------------${CEND}" 164 | echo -e "${CCYAN}[ EXCLUSION DE FICHIERS/RÉPERTOIRES ]${CEND}" 165 | echo -e "${CCYAN}---------------------------------------${CEND}" 166 | echo "" 167 | 168 | read -rp "Voulez-vous exclure des répertoires de la sauvegarde ? (o/n) : " EXCLUDE 169 | 170 | # Exclusion des répertoires par défaut 171 | cat > /opt/full-backup/.excluded-paths <> /opt/full-backup/.excluded-paths 201 | done 202 | 203 | echo -e "\nLes répertoires/fichiers suivants ne seront pas inclus dans la sauvegarde :\n" 204 | echo -e "${CGREEN}-----------------EXCLUSION--------------------${CEND}" 205 | cat /opt/full-backup/.excluded-paths 206 | echo -e "${CGREEN}----------------------------------------------${CEND}" 207 | 208 | fi 209 | 210 | smallLoader 211 | clear 212 | 213 | echo -e "${CCYAN}---------------${CEND}" 214 | echo -e "${CCYAN}[ RNG TOOLS ]${CEND}" 215 | echo -e "${CCYAN}---------------${CEND}" 216 | echo "" 217 | 218 | echo -e "${CGREEN}-> Configuration de RNG-TOOLS.${CEND}" 219 | echo "Device: /dev/urandom" 220 | cat > /etc/default/rng-tools < Démarrage de RNG-TOOLS.${CEND}" 227 | service rng-tools start 228 | 229 | echo "" 230 | echo -e "${CCYAN}-------------------------------------${CEND}" 231 | echo -e "${CCYAN}[ CREATION D'UNE PAIRE DE CLE GPG ]${CEND}" 232 | echo -e "${CCYAN}-------------------------------------${CEND}" 233 | echo "" 234 | 235 | read -rp "Voulez-vous créer une nouvelle paire de clé GPG ? (o/n) : " CREATEKEY 236 | 237 | if [[ "$CREATEKEY" = "o" ]] || [[ "$CREATEKEY" = "O" ]]; then 238 | 239 | echo -e "${CCYAN}--------------------------------------------------------------------------${CEND}" 240 | gpg --gen-key 241 | 242 | if [ $? -eq 0 ]; then 243 | echo -e "\n${CGREEN}Vos clés GPG ont été générées avec succès !${CEND}\n" 244 | else 245 | echo -e "\n${CRED}/!\ Erreur: Une erreur est survenue pendant la création de vos clés GPG.${CEND}\n" 1>&2 246 | fi 247 | fi 248 | 249 | echo "" 250 | echo -e "${CCYAN}Liste de vos clés GPG :${CEND}" 251 | echo -e "${CCYAN}------------------------------------------${CEND}" 252 | gpg --list-keys --with-fingerprint --keyid-format 0xlong | grep -i "pub\(.*\)0x\(.*\)" 253 | echo -e "${CCYAN}------------------------------------------${CEND}" 254 | echo "" 255 | 256 | getGPGCredentials() { 257 | read -rp "> Veuillez saisir l'identifiant de votre clé (0x...) : " KEYID 258 | read -srp "> Veuillez saisir le mot de passe : " KEYPASSWD 259 | } 260 | 261 | getGPGCredentials 262 | 263 | # On test la clé et la passphrase 264 | until echo "AuthTest" | gpg -o /dev/null --local-user "$KEYID" -as --passphrase "$KEYPASSWD" <(echo) 265 | do 266 | echo "" 267 | echo -e "${CRED}/!\ Erreur: Clé inconnue ou mot de passe incorrect.${CEND}" 1>&2 268 | echo -e "${CRED}/!\ Merci de re-saisir les paramètres GPG :${CEND}" 1>&2 269 | echo "" 270 | getGPGCredentials 271 | echo "" 272 | done 273 | 274 | echo -e "\n" 275 | echo -e "Vérification des paramètres GPG ${CGREEN}[OK]${CEND}" 276 | sed -i "s/\(KEYID=\).*/\1'$KEYID'/" backup.sh 277 | 278 | echo -n "Création du fichier .gpg-passwd" 279 | echo "$KEYPASSWD" > /opt/full-backup/.gpg-passwd 280 | chmod 600 /opt/full-backup/.gpg-passwd 281 | echo -e " ${CGREEN}[OK]${CEND}" 282 | 283 | # Suppression des fichiers de log 284 | rm -rf $ERROR_FILE 285 | rm -rf $FTP_FILE 286 | 287 | echo "" 288 | echo -e "${CCYAN}-----------------${CEND}" 289 | echo -e "${CCYAN}[ FIN DU SCRIPT ]${CEND}" 290 | echo -e "${CCYAN}-----------------${CEND}" 291 | 292 | exit 0 293 | -------------------------------------------------------------------------------- /restore.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # @(#) Nom du script .. : restore.sh 4 | # @(#) Version ........ : 1.00 5 | # @(#) Date ........... : 19/09/2014 6 | # Auteurs ........ : Hardware 7 | 8 | #~ 9 | #~ @(#) Description : Script de restauration 10 | 11 | # -------------------------------------------------------------------- 12 | # Adresse email de reporting 13 | REPORTING_EMAIL= 14 | 15 | # Paramètres de connexion au serveur FTP 16 | HOST='' 17 | USER='' 18 | PASSWD='' 19 | PORT= 20 | # -------------------------------------------------------------------- 21 | 22 | ERROR_FILE=./errors.log 23 | FTP_FILE=./ftp.log 24 | EXIT=0 25 | ARCHIVE="" 26 | FTP_REMOTE_PATH="/" 27 | 28 | # Définition des variables de couleurs 29 | CSI="\033[" 30 | CEND="${CSI}0m" 31 | CRED="${CSI}1;31m" 32 | CGREEN="${CSI}1;32m" 33 | CYELLOW="${CSI}1;33m" 34 | CCYAN="${CSI}0;36m" 35 | 36 | ################################################## 37 | 38 | sendErrorMail() { 39 | 40 | SERVER_NAME=$(hostname -s) 41 | 42 | echo -e "Subject: ${SERVER_NAME^^} - Echec de la restauration 43 | Une erreur est survenue lors de l'execution du script de restauration. 44 | $2 45 | 46 | Detail de l'erreur : 47 | ---------------------------------------------------------- 48 | 49 | $(cat "$1") 50 | 51 | ---------------------------------------------------------- 52 | 53 | INFO Serveur : 54 | 55 | @IP : $(hostname -i) 56 | Hostname : $(uname -n) 57 | Kernel : $(uname -r) 58 | " > /tmp/reporting.txt 59 | 60 | sendmail $REPORTING_EMAIL < /tmp/reporting.txt 61 | 62 | } 63 | 64 | downloadFromRemoteServer() { 65 | 66 | local archive=$1 67 | 68 | lftp -d -e "cd $FTP_REMOTE_PATH; \ 69 | get $archive; \ 70 | get $archive.sig;  \ 71 | get $archive.pub; \ 72 | bye" -u $USER,$PASSWD -p $PORT $HOST 2> $FTP_FILE > /dev/null 73 | 74 | FILES_TRANSFERRED=$(grep -ci "226\(-.*\)file successfully transferred" "$FTP_FILE") 75 | 76 | # On vérifie que les 3 fichiers ont bien été transférés 77 | if [[ $FILES_TRANSFERRED -ne 3 ]]; then 78 | echo -e "\n${CRED}/!\ ERREUR: Echec lors de la récupération de l'archive sur le serveur FTP${CEND}" 79 | echo "" 80 | exit 1 81 | fi 82 | 83 | } 84 | 85 | verifySignature() { 86 | 87 | local file=$1 out= 88 | 89 | FINGERPRINT=$(gpg --list-keys --fingerprint --with-colons | awk -F: '$1 == "fpr" {print $10;}' | head -n 1) 90 | 91 | # On vérifie l'intégrité du backup avec la clé de signature 92 | if out=$(gpg --status-fd 1 --verify "$file" 2> /dev/null) && 93 | echo "$out" | grep -qs "^\[GNUPG:\] VALIDSIG $FINGERPRINT"; then 94 | echo "OK" 95 | fi 96 | 97 | } 98 | 99 | checkIntegrity() { 100 | 101 | # Importation de la clé publique 102 | echo "" 103 | echo -e "${CCYAN}-------------------------- CONFIGURATION DE GPG --------------------------${CEND}" 104 | 105 | gpg --import --batch --no-tty $ARCHIVE.pub 106 | 107 | echo -e "${CCYAN}--------------------------------------------------------------------------${CEND}" 108 | echo "" 109 | 110 | NB_ATTEMPT=1 111 | 112 | echo "> Vérification de l'intégrité" 113 | while [[ -z $(verifySignature $ARCHIVE.sig) ]]; do 114 | if [[ "$NB_ATTEMPT" -lt 4 ]]; then 115 | echo -e "${CRED}/!\ ERREUR: Echec de la vérification de l'intégrité... Tentative $NB_ATTEMPT${CEND}" 116 | rm -rf $ARCHIVE $ARCHIVE.sig $ARCHIVE.pub 117 | downloadFromRemoteServer $ARCHIVE 118 | 119 | if [[ -n $(verifySignature $ARCHIVE.sig) ]]; then 120 | break 121 | fi 122 | 123 | let "NB_ATTEMPT += 1" 124 | sleep 10 125 | else 126 | echo -e "${CRED}/!\ ERREUR: Echec lors de la vérification de l'intégrité de l'archive, signature incorrecte.${CEND}" 127 | exit 1 128 | fi 129 | done 130 | 131 | } 132 | 133 | backupList() { 134 | 135 | local backups=(/var/backup/local/backup-*) 136 | local i=0 137 | local n="" 138 | 139 | if [[ ! -d /var/backup/local ]]; then 140 | echo -e "\n${CRED}/!\ ERREUR: Aucune sauvegarde locale existante.${CEND}\n" 1>&2 141 | exit 1 142 | fi 143 | 144 | echo -e "\n Liste des archives disponibles :" 145 | 146 | for backup in ${backups[*]}; do 147 | let "i += 1" 148 | BACKUPPATH[$i]=$(stat -c "%n" "$backup") 149 | echo " $i. ${BACKUPPATH[$i]##*/}" 150 | done 151 | 152 | echo "" 153 | read -rp "Saisir le numéro de l’archive à restaurer : " n 154 | 155 | if [[ $n -lt 1 ]] || [[ $n -gt $i ]]; then 156 | echo -e "\n${CRED}/!\ ERREUR: Numéro d'archive invalide !${CEND}" 157 | echo "" 158 | exit 1 159 | fi 160 | 161 | ARCHIVEPATH=${BACKUPPATH[$n]##*/} # backup-JJMMAAAA-HHMM 162 | ARCHIVE="$ARCHIVEPATH.tar.gz" 163 | } 164 | 165 | remoteRestoration() { 166 | 167 | echo -e "\n${CCYAN}Liste des archives disponibles :${CEND}" 168 | echo -e "${CCYAN}-----------------------------------------------------------------------------------------${CEND}" 169 | lftp -d -e "cd $FTP_REMOTE_PATH;ls *.tar.gz; bye" -u $USER,$PASSWD -p $PORT $HOST 2> $FTP_FILE 170 | echo -e "${CCYAN}-----------------------------------------------------------------------------------------${CEND}" 171 | echo "" 172 | 173 | read -rp "Veuillez saisir le nom de l'archive à récupérer : " ARCHIVE 174 | 175 | echo "" 176 | echo -e "${CRED}-------------------------------------------------------${CEND}" 177 | echo -e "${CRED} /!\ ATTENTION : RESTAURATION DU SERVEUR IMMINENTE /!\ ${CEND}" 178 | echo -e "${CRED}-------------------------------------------------------${CEND}" 179 | 180 | echo -e "\nAppuyer sur ${CCYAN}[ENTREE]${CEND} pour démarrer la restauration ou CTRL+C pour quitter..." 181 | read -r 182 | 183 | echo "> Récupération de l'archive depuis le serveur FTP" 184 | downloadFromRemoteServer "$ARCHIVE" 185 | 186 | checkIntegrity 187 | 188 | } 189 | 190 | localRestoration() { 191 | 192 | echo "" 193 | echo -e "${CRED}-------------------------------------------------------${CEND}" 194 | echo -e "${CRED} /!\ ATTENTION : RESTAURATION DU SERVEUR IMMINENTE /!\ ${CEND}" 195 | echo -e "${CRED}-------------------------------------------------------${CEND}" 196 | 197 | echo -e "\nAppuyer sur ${CCYAN}[ENTREE]${CEND} pour démarrer la restauration ou CTRL+C pour quitter..." 198 | read -r 199 | 200 | echo "> Récupération de l'archive locale" 201 | cp /var/backup/local/"$ARCHIVEPATH"/*.tar.gz* . 202 | 203 | checkIntegrity 204 | 205 | } 206 | 207 | ################################################## 208 | 209 | if [[ $EUID -ne 0 ]]; then 210 | echo "" 211 | echo -e "${CRED}/!\ ERREUR: Vous devez être connecté en tant que root pour pouvoir exécuter ce script.${CEND}" 1>&2 212 | echo "" 213 | exit 1 214 | fi 215 | 216 | clear 217 | 218 | echo "" 219 | echo -e "${CCYAN}#########################################################${CEND}" 220 | echo "" 221 | echo -e "${CCYAN} DEMARRAGE DU SCRIPT DE RESTAURATION ${CEND}" 222 | echo "" 223 | echo -e "${CCYAN}#########################################################${CEND}" 224 | echo "" 225 | 226 | echo "Choisir le type de restauration :" 227 | echo " 1. Distante" 228 | echo " 2. Locale" 229 | echo "" 230 | 231 | while [[ $EXIT -eq 0 ]]; do 232 | 233 | read -rp "Votre choix (1-2) : " RTYPE 234 | 235 | case "$RTYPE" in 236 | "1") 237 | echo -e "Type de restauration sélectionnée : ${CGREEN}Distante${CEND}" 238 | remoteRestoration 239 | EXIT=1 240 | ;; 241 | "2") 242 | echo -e "Type de restauration sélectionnée : ${CGREEN}Locale${CEND}" 243 | backupList 244 | localRestoration 245 | EXIT=1 246 | ;; 247 | *) 248 | echo -e "${CRED}Action inconnue${CEND}" 249 | ;; 250 | esac 251 | 252 | done 253 | 254 | echo "> Décompression de l'archive à la racine du système" 255 | tar --warning=none -xpPzf "$ARCHIVE" --exclude=/boot -C / --numeric-owner 2> $ERROR_FILE 256 | 257 | if [[ -s $ERROR_FILE ]]; then 258 | echo -e "\n${CRED}/!\ ERREUR: Echec de la décompression de l'archive.${CEND}" 259 | echo -e "" 260 | sendErrorMail $ERROR_FILE "Echec de la décompression de l'archive." 261 | exit 1 262 | fi 263 | 264 | # Si il s'agit d'une restauration complète, il faut mettre à jour l'UUID de la partition 265 | # if [[ "$RTYPE" = "1" ]]; then 266 | 267 | # Récupération de l'UUID de la partition /boot 268 | # UUID=`blkid -s UUID -o value /dev/sda1` # sda1 = /boot 269 | 270 | # Mise à jour de l'UUID de la partition /boot dans le fichier fstab 271 | # echo -e "> Mise à jour du fichier ${CPURPLE}/etc/fstab${CEND}" 272 | # sed -i -e "s/\(UUID=\).*/\1$UUID \/boot ext4 defaults 1 2/" /etc/fstab 273 | 274 | # fi 275 | 276 | echo "" 277 | echo -e "${CGREEN}> Restauration effectuée !${CEND}" 278 | 279 | rm -rf "$ARCHIVE" 280 | rm -rf "$ARCHIVE".pub 281 | rm -rf "$ARCHIVE".sig 282 | rm -rf $ERROR_FILE 283 | rm -rf $FTP_FILE 284 | 285 | echo "" 286 | echo -e "${CGREEN}Le serveur va redémarrer automatiquement dans quelques secondes mais ${CEND}" 287 | echo -e "${CGREEN}peut-être que vous souhaitez modifier certains fichiers (/etc/fstab par exemple)${CEND}" 288 | echo -e "${CGREEN}nécessaires pour que le serveur redémarre correctement.${CEND}" 289 | echo "" 290 | 291 | read -rp "Voulez-vous redémarrer maintenant ? (o/n) " REBOOTNOW 292 | 293 | if [[ "$REBOOTNOW" != "o" ]] || [[ "$REBOOTNOW" != "O" ]]; then 294 | 295 | echo "" 296 | echo -e "${CCYAN}-----------------${CEND}" 297 | echo -e "${CCYAN}[ FIN DU SCRIPT ]${CEND}" 298 | echo -e "${CCYAN}-----------------${CEND}" 299 | 300 | exit 0 301 | 302 | fi 303 | 304 | echo "" 305 | echo -e "${CYELLOW}-----------------------------------------${CEND}" 306 | echo -e "${CYELLOW} Redémarrage du système dans 10 secondes ${CEND}" 307 | echo -e "${CYELLOW}-----------------------------------------${CEND}" 308 | echo "" 309 | echo -ne '[ ] 10s \r' 310 | sleep 1 311 | echo -ne '[+ ] 9s \r' 312 | sleep 1 313 | echo -ne '[+ + ] 8s \r' 314 | sleep 1 315 | echo -ne '[+ + + ] 7s \r' 316 | sleep 1 317 | echo -ne '[+ + + + ] 6s \r' 318 | sleep 1 319 | echo -ne '[+ + + + + ] 5s \r' 320 | sleep 1 321 | echo -ne '[+ + + + + + ] 4s \r' 322 | sleep 1 323 | echo -ne '[+ + + + + + + ] 3s \r' 324 | sleep 1 325 | echo -ne '[+ + + + + + + + ] 2s \r' 326 | sleep 1 327 | echo -ne '[+ + + + + + + + + ] 1s \r' 328 | sleep 1 329 | echo -ne '[+ + + + + + + + + +] Redémarrage... \r' 330 | echo -ne '\n' 331 | 332 | shutdown -r now 333 | --------------------------------------------------------------------------------