đŸ Archived View for zergy.net âș blog âș 014-quelques-scripts-personnels.gmi captured on 2024-05-26 at 14:54:56. Gemini links have been rewritten to link to archived content
âŹ ïž Previous capture (2024-05-10)
-=-=-=-=-=-=-
L'informatique, c'est pour les fainéant, c'est pas pour rien qu'on a des scripts pour tout. :)
Les sauvegardes de base de données ne sont pas toujours simple à effectuer, voici un petit script qui vous mùchera le travail.
S'il est possible de sauvegarder les bases de données de MySQL en se contentant de copier les fichiers contenant les bases, cette méthode est crado et peut se solder par un échec cuisant.
Il est largement recommandé d'utiliser l'utilitaire mysqldump pour cette tùche, cependant, l'utiliser manuellement pour sauvegarder les bases de données une à une n'est pas agréable, un oubli ou une mauvaise manipulation est vite arrivée.
Voici donc un petit script à utiliser avec cron pour sauvegarder toutes vos bases de données MySQL automatiquement.
A modifier selon votre convenance, attention, les droits de root sont nécessaires.
La présence du mot de passe root de MySQL dans le fichier de configuration demande de mettre les droits les plus restrictifs possible sur celui-ci.
#! /usr/bin/env bash ################################################################################ # # # LICENCE # # # # This program is free software: you can redistribute it and/or modify it # # under the terms of the GNU General Public License as published by the Free # # Software Foundation, either version 3 of the License, or (at your option) # # any later version. # # # # This program is distributed in the hope that it will be useful, but WITHOUT # # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # # more details. # # # # You should have received a copy of the GNU General Public License along with # # this program. # # # ################################################################################ ################################################################################ # # # DESCRIPTION # # # # Ce script sauvegarde automatiquement les bases de donnĂ©es MySQL/MariaDB en # # utilisant la sauvegarde par base. # # # # # # VARIABLES # # # # - COMPRESSION_METHOD : Algorythme de compression utilisĂ© pour l'archivage, # # peu ĂȘtre bzip2, gzip, lzma ou xz. # # - DATE : Date du jour, utilisĂ© pour le dossier de sauvegarde des bases de # # donnĂ©es Ă sauvegarder. # # - MYSQLROOT : Nom de l'administrateur du systĂšme de gestion de bases de # # donnĂ©es, root par dĂ©faut. # # - MYSQLPASSWD : Mot de passe de l'administrateur du systĂšme de gestion de # # base de donnĂ©es. # # - BACKUP_DIR : Emplacement du rĂ©pertoire de base pour les sauvegarde, un # # sous-rĂ©pertoire portant pour nom la variable date sera crĂ©e pour contenir # # les sauvegarde du jour. # # - LOG_FILE : Fichier utilisĂ© pour la journalisation. # # - LOG_FILE_DATE : Date de journalisation. # # - RETENTION : Temps de rĂ©tention des sauvegardes. # # - MYSQLDUMP_OPTS : Options utilisĂ©es par la commande mysqldump. # # # # # # FONCTIONS # # # # - logDate() : Ajoute la date aux messages de journalisation. # # - createLog() : CrĂ©er un fichier de journalisation et lui donne les droits # # corrects s'il n'existe pas. # # - createBackupDir() : VĂ©rifie l'existance du rĂ©pertoire utilisĂ© par les # # sauvegardes du jour, le crĂ©e et lui donne les authorisations correctes le # # cas Ă©chĂ©ant. Voir les variables BACKUP_DIR et DATE. # # Quitte et retourne l'Ă©tat de sortie 1 si le dossier n'existe pas et ne # # peut ĂȘtre crĂ©e. # # - backupPurge() : Utilise la commande tmpreaper pour suprimmer dans le # # dossier de base des sauvegardes -tel que dĂ©fini par la variable # # BACKUP_DIR- celles dont l'Ăąge est supĂ©rieur Ă celui dĂ©fini dans la # # variable RETENTION. # # Quitte et retourne l'Ă©tat de sortie 2 si les sauvegardes les plus # # anciennes ne peuvent ĂȘtre supprimĂ©es. # # - listDB() : Cette fonction liste les bases de donnĂ©es prĂ©sentes avec la # # commande mysql pour lister les bases de donnĂ©es prĂ©sentent dans le systĂšme # # de base de donnĂ©es que l'on souhaite sauvegarder. # # Quitte et retourne l'Ă©tat de sortie 3 si les bases de donnĂ©es ne peuvent # # ĂȘtres listĂ©es # # Quitte et retourne l'Ă©tat de sortie 4 si aucunes bases de donnĂ©es # # n'existe. # # - backupDB() : Supprime les sauvegardes prĂ©sente dans le dossier du jour # # s'ils en existes puis utilise mysql afin de sauvegarder les bases de # # donnĂ©es du systĂšme de gestion de base de donnĂ©es que l'on souhaite # # sauvegarder. # # Il est possible de spĂ©cifier des options Ă la commande de sauvegarde via # # la variables MYSQLDUMP_OPTS. # # Quitte est retourne l'Ă©tat de sortie 5 si une erreur se produit lors des # # sauvegardes. # # - backupCheck() : Cette fonction effectue un test afin de savoir si les # # sauvegardes se sont bien dĂ©roulĂ©es. Elle vĂ©rifie via la commande find # # couplĂ© Ă la commande wc -l la prĂ©sence de fichier dans le rĂ©pertoire de # # sauvegarde du jour, si le rĂ©sultat de cette commande est est plus grand # # que 0, elle utilise la commande du -ks si la taille totales des fichiers # # sauvegardĂ© est supĂ©rieur Ă quatre kibi-octects, 4 kio Ă©tant la taille d'un # # dossier vide ou contenant des fichiers de taille nulle. # # Quitte et retourne l'Ă©tat de sortie 6 si aucune sauvegarde n'a put ĂȘtre # # effectuĂ©e ou si la taille des sauvegardes est nulle. # # # # # # AUTEUR(S) # # # # - Zergy (zergy@zergy.net) # # # ################################################################################ # Variables SHELL="/bin/bash"; PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"; source "/usr/local/etc/dump-mysql.conf"; # DĂ©termination de l'extension en fonction de la mĂ©thode de compression case $COMPRESSION_METHOD in bzip2) COMPRESSION_EXTENSION="bz2"; ;; gzip) COMPRESSION_EXTENSION="gz"; ;; lzma) COMPRESSION_EXTENSION="lz"; ;; xz) COMPRESSION_EXTENSION="xz"; ;; esac; # Routine d'horodatage des logs function logDate() { LOG_FILE_DATE="$(date +'%d/%m/%Y %H:%M')"; } # Mise en place des journaux. function createLog () { if [ ! -f "$LOG_FILE" ]; then touch "$LOG_FILE"; chown mysql "$LOG_FILE"; chgrp adm "$LOG_FILE"; chmod 640 "$LOG_FILE"; fi } # Mise en place des rĂ©pertoires. function createBackupDir () { if [ ! -d "$BACKUP_DIR/$DATE" ]; then mkdir -p "$BACKUP_DIR/$DATE"; if [ $? != 0 ]; then logDate; echo "$LOG_FILE_DATE : Impossible de crĂ©er le dossier \ de sauvegarde." >> "$LOG_FILE"; exit 1; fi chown root "$BACKUP_DIR/$DATE"; chgrp backup "$BACKUP_DIR/$DATE"; chmod 770 "$BACKUP_DIR/$DATE"; fi } # Purge des ancienne sauvegardes. # Utilisation TMPReaper pour supprimer les sauvegardes vielles de plus de 8 # jours (cf $RETENTION pour changer) function backupPurge() { tmpreaper "$RETENTION" "$BACKUP_DIR"; if [ $? != "0" ]; then logDate; echo "$LOG_FILE_DATE : Impossible de purger les anciennes \ sauvegardes." >> "$LOG_FILE"; exit 2; fi for olddir in $(ls "$BACKUP_DIR"); do if [ "$(du -ks $BACKUP_DIR/$olddir | awk {'print $1'})" -eq 4 ] then rmdir "$BACKUP_DIR/$olddir"; fi done } # Listage des bases de donnĂ©es. function listDB() { BASE_LIST="$(mysql --user=$MYSQLROOT --password=$MYSQLPASSWD \ --batch --skip-column-names --execute='SHOW DATABASES;')"; if [ $? != "0" ]; then logDate; echo "$LOG_FILE_DATE : Erreur dans la commande de sauvegarde." \ >> "$LOG_FILE"; exit 3; fi if [ "$BASE_LIST" = "" ]; then logDate; echo "$LOG_FILE_DATE : Aucune base prĂ©sente." >> "$LOG_FILE"; exit 4; fi } # Sauvegarde des BDD. function backupDB() { for db in $BASE_LIST; do if [ -f "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION" ]; then rm -f "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION"; fi mysqldump $MYSQLDUMP_OPTS --user="$MYSQLROOT" \ --password="$MYSQLPASSWD" "$db" 2>> "$LOG_FILE" | $COMPRESSION_METHOD -c\ > "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION"; if [ $? -ne "0" ]; then logDate; echo "$LOG_FILE_DATE : Attention erreur dans les \ sauvegardes." >> "$LOG_FILE"; exit 5; fi chown root "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION"; chgrp backup "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION"; chmod 660 "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION"; done } # VĂ©rificarion des sauvegardes. function backupCheck() { if [ "$(find $BACKUP_DIR/$DATE -type f | wc -l)" -gt 0 -a \ "$(du -ks $BACKUP_DIR/$DATE | awk {'print $1'})" -gt 4 ]; then logDate; echo "$LOG_FILE_DATE : Sauvegarde des bases terminĂ© avec \ succĂ©s." >> "$LOG_FILE"; else logDate; echo "$LOG_FILE_DATE : Aucune base sauvegardĂ©es ou leur taille \ est de zĂ©ro." >> "$LOG_FILE"; exit 6; fi } function main() { createLog; createBackupDir; listDB; backupDB; backupCheck; backupPurge; } main; exit 0;
# Root directory for backups. BACKUP_DIR="/var/archives/MySQL"; # Date format, used to name the backup directory. DATE="$(date '+%Y%m%d')"; # MySQL user used for backup. MYSQLROOT="root"; MYSQLPASSWD="ROOTPASSWD"; # Retention time. RETENTION="7d"; # Compression method, can be bzip2, gzip, lzma or xz COMPRESSION_METHOD="xz" # MySQL options. MYSQLDUMP_OPTS="--routines --skip-lock-tables --events"; # Log file. LOG_FILE="/var/log/dump-mysql.log";
Le script ci-dessus peut-ĂȘtre adaptĂ© afin de sauvegarder des bases PostgreSQL.
#! /usr/bin/env bash ################################################################################ # # # LICENCE # # # # This program is free software: you can redistribute it and/or modify it # # under the terms of the GNU General Public License as published by the Free # # Software Foundation, either version 3 of the License, or (at your option) # # any later version. # # # # This program is distributed in the hope that it will be useful, but WITHOUT # # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # # more details. # # # # You should have received a copy of the GNU General Public License along with # # this program. # # # ################################################################################ ################################################################################ # # # DESCRIPTION # # # # Ce script sauvegarde automatiquement les bases de donnĂ©es PostGreSQL en # # utilisant la sauvegarde par base. # # # # # # VARIABLES # # # # - COMPRESSION_METHOD : Algorythme de compression utilisĂ© pour l'archivage, # # peu ĂȘtre bzip2, gzip, lzma ou xz. # # - DATE : Date du jour, utilisĂ© pour le dossier de sauvegarde des bases de # # donnĂ©es Ă sauvegarder. # # - BACKUP_DIR : Emplacement du rĂ©pertoire de base pour les sauvegarde, un # # sous-rĂ©pertoire portant pour nom la variable date sera crĂ©e pour contenir # # les sauvegarde du jour. # # - LOG_FILE : Fichier utilisĂ© pour la journalisation. # # - LOG_FILE_DATE : Date de journalisation. # # - RETENTION : Temps de rĂ©tention des sauvegardes. # # # # # # FONCTIONS # # # # - logDate() : Ajoute la date aux messages de journalisation. # # - createLog() : CrĂ©er un fichier de journalisation et lui donne les droits # # corrects s'il n'existe pas. # # - createBackupDir() : VĂ©rifie l'existance du rĂ©pertoire utilisĂ© par les # # sauvegardes du jour, le crĂ©e et lui donne les authorisations correctes le # # cas Ă©chĂ©ant. Voir les variables BACKUP_DIR et DATE. # # Quitte et retourne l'Ă©tat de sortie 1 si le dossier n'existe pas et ne # # peut ĂȘtre crĂ©e. # # - backupPurge() : Utilise la commande tmpreaper pour suprimmer dans le # # dossier de base des sauvegardes -tel que dĂ©fini par la variable # # BACKUP_DIR- celles dont l'Ăąge est supĂ©rieur Ă celui dĂ©fini dans la # # variable RETENTION. # # Quitte et retourne l'Ă©tat de sortie 2 si les sauvegardes les plus # # anciennes ne peuvent ĂȘtre supprimĂ©es. # # - listDB() : Cette fonction liste les bases de donnĂ©es prĂ©sentes avec la # # commande psql pour lister les bases de donnĂ©es prĂ©sentent dans le systĂšme # # de base de donnĂ©es que l'on souhaite sauvegarder. # # Quitte et retourne l'Ă©tat de sortie 3 si les bases de donnĂ©es ne peuvent # # ĂȘtres listĂ©es # # Quitte et retourne l'Ă©tat de sortie 4 si aucunes bases de donnĂ©es # # n'existe. # # - backupDB() : Supprime les sauvegardes prĂ©sente dans le dossier du jour # # s'ils en existes puis utilise pg_dump afin de sauvegarder les bases de # # donnĂ©es du systĂšme de gestion de base de donnĂ©es que l'on souhaite # # sauvegarder. # # Quitte est retourne l'Ă©tat de sortie 5 si une erreur se produit lors des # # sauvegardes. # # - backupCheck() : Cette fonction effectue un test afin de savoir si les # # sauvegardes se sont bien dĂ©roulĂ©es. Elle vĂ©rifie via la commande find # # couplĂ© Ă la commande wc -l la prĂ©sence de fichier dans le rĂ©pertoire de # # sauvegarde du jour, si le rĂ©sultat de cette commande est est plus grand # # que 0, elle utilise la commande du -ks si la taille totales des fichiers # # sauvegardĂ© est supĂ©rieur Ă quatre kibi-octects, 4 kio Ă©tant la taille d'un # # dossier vide ou contenant des fichiers de taille nulle. # # Quitte et retourne l'Ă©tat de sortie 6 si aucune sauvegarde n'a put ĂȘtre # # effectuĂ©e ou si la taille des sauvegardes est nulle. # # # # # # AUTEUR(S) # # # # - Zergy (zergy@zergy.net) # # # # # # DERNIER(S) CHANGEMENT(S) : # # # # - 15/06/2018 : CrĂ©ation du script et Ă©criture de la documentation. # # # ################################################################################ # Variables PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"; . "/usr/local/etc/dump-pgsql.conf"; # Routine d'horodatage des logs function logDate() { LOG_FILE_DATE="$(date +'%d/%m/%Y %H:%M')"; } # DĂ©termination de l'extension en fonction de la mĂ©thode de compression case $COMPRESSION_METHOD in bzip2) COMPRESSION_EXTENSION="bz2"; ;; gzip) COMPRESSION_EXTENSION="gz"; ;; lzma) COMPRESSION_EXTENSION="lz"; ;; xz) COMPRESSION_EXTENSION="xz"; ;; esac; # Mise en place des journaux. function createLog() { if [ ! -f "$LOG_FILE" ]; then touch "$LOG_FILE"; chown mysql "$LOG_FILE"; chgrp adm "$LOG_FILE"; chmod 640 "$LOG_FILE"; fi } # Mise en place des rĂ©pertoires. function createBackupDir() { if [ ! -d "$BACKUP_DIR/$DATE" ]; then mkdir -p "$BACKUP_DIR/$DATE"; if [ $? != 0 ]; then logDate; echo "$LOG_FILE_DATE : Impossible de crĂ©er le dossier \ de sauvegarde." >> "$LOG_FILE"; exit 1; fi chown root "$BACKUP_DIR/$DATE"; chgrp backup "$BACKUP_DIR/$DATE"; chmod 770 "$BACKUP_DIR/$DATE"; fi } # Purge des ancienne sauvegardes. # Utilisation TMPReaper pour supprimer les sauvegardes vielles de plus de 8 # jours (cf $RETENTION pour changer) function backupPurge() { tmpreaper -m "$RETENTION" "$BACKUP_DIR"; if [ $? != "0" ]; then logDate; echo "$LOG_FILE_DATE : Impossible de purger les anciennes \ sauvegardes." >> "$LOG_FILE"; exit 2; fi for olddir in $(ls "$BACKUP_DIR"); do if [ "$(du -ks $BACKUP_DIR/$olddir | awk {'print $1'})" -eq 4 ] then rmdir "$BACKUP_DIR/$olddir"; fi done } # Listage des bases de donnĂ©es. function listDB() { BASE_LIST="$(su - postgres -c "psql -l" | awk '{ print $1 }' | \ sed "1,3d" | grep -vE 'List|template|:|\||\(' | sed -e '/^$/d')"; if [ $? != "0" ]; then logDate; echo "$LOG_FILE_DATE : Erreur dans la commande de sauvegarde." \ >> "$LOG_FILE"; exit 3; fi if [ "$BASE_LIST" = "" ]; then logDate; echo "$LOG_FILE_DATE : Aucune base prĂ©sente." >> "$LOG_FILE"; exit 4; fi } # Sauvegarde des BDD. function backupDB() { for db in $BASE_LIST; do if [ -f "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION" ]; then rm -f "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION"; fi su - postgres -c "pg_dump $db" 2>> "$LOG_FILE" | \ $COMPRESSION_METHOD -c > "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION"; if [ $? -ne "0" ]; then logDate; echo "$LOG_FILE_DATE : Attention erreur dans les \ sauvegardes." >> "$LOG_FILE"; exit 5; fi chown root "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION"; chgrp backup "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION"; chmod 660 "$BACKUP_DIR/$DATE/$db.sql.$COMPRESSION_EXTENSION"; done } # VĂ©rificarion des sauvegardes. function backupCheck() { if [ "$(find $BACKUP_DIR/$DATE -type f | wc -l)" -gt 0 -a \ "$(du -ks $BACKUP_DIR/$DATE | awk {'print $1'})" -gt 4 ]; then logDate; echo "$LOG_FILE_DATE : Sauvegarde des bases terminĂ© avec \ succĂ©s." >> "$LOG_FILE"; else logDate; echo "$LOG_FILE_DATE : Aucune base sauvegardĂ©es ou leur taille \ est de zĂ©ro." >> "$LOG_FILE"; exit 6; fi } function main() { createLog; createBackupDir; listDB; backupDB; backupCheck; backupPurge; } main; exit 0;
# Root directory for backups. BACKUP_DIR="/var/archives/PostgreSQL"; # Date format, used to name the backup directory. DATE="$(date '+%Y%m%d')"; # Retention time. RETENTION="7d"; # Compression method, can be bzip2, gzip, lzma or xz COMPRESSION_METHOD="xz" # Log file. LOG_FILE="/var/log/dump-pgsql.log";
Un petit script permettant, sous Debian ou distributions dérivées, de sauvegarder la liste des paquets installés, trÚs pratique pour ne rien oublier lors d'une réinstallation.
Les paquets sauvegardĂ© via ce script peuvent ĂȘtre rĂ©installĂ©s de la façon suivantes :
$ sudo dpkg --set-selections < ./YYYYMMDD-Packages.list $ sudo apt-get update $ sudo apt-get dselect-upgrade
#! /usr/bin/env bash ################################################################################ # # # LICENCE # # # # This program is free software: you can redistribute it and/or modify it under# # the terms of the GNU General Public License as published by the Free Software# # Foundation, either version 3 of the License, or (at your option) any later # # version. # # # # This program is distributed in the hope that it will be useful, but WITHOUT # # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details# # # # You should have received a copy of the GNU General Public License along with # # this program. # # # ################################################################################ ################################################################################ # # # DESCRIPTION # # # # Ce script permet de rapidement crĂ©er une liste des packages installĂ©s. # # # # # # VARIABLES # # # # - DATE : Date du jour, utilisĂ© pour nommer le ficher de sauvegarde contenant # # la liste des packages Ă sauvegarder. # # - BACKUP_DIR : Emplacement du rĂ©pertoire de base pour les sauvegarde # # - LOG_FILE : Fichier utilisĂ© pour la journalisation. # # - LOG_FILE_DATE : Date de journalisation. # # - RETENTION : Temps de rĂ©tention des sauvegardes. # # # # # # FONCTIONS # # # # - logDate() : Ajoute la date aux messages de journalisation. # # - createLog() : CrĂ©er un fichier de journalisation et lui donne les droits # # corrects s'il n'existe pas. # # - createBackupDir() : VĂ©rifie l'existance du rĂ©pertoire utilisĂ© par les # # sauvegardes du jour, le crĂ©e et lui donne les authorisations correctes le # # cas Ă©chĂ©ant. Voir les variables BACKUP_DIR et DATE. # # Quitte et retourne l'Ă©tat de sortie 1 si le dossier n'existe pas et ne peut# # ĂȘtre crĂ©e. # # - backupPurge() : Utilise la commande tmpreaper pour suprimmer dans le # # dossier de base des sauvegardes -tel que dĂ©fini par la variable BACKUP_DIR-# # celles dont l'Ăąge est supĂ©rieur Ă celui dĂ©fini dans la variable RETENTION. # # Quitte et retourne l'Ă©tat de sortie 2 si les sauvegardes les plus anciennes# # ne peuvent ĂȘtre supprimĂ©es. # # - backup() : Cette fonction crĂ©e un fichier contenant la liste des packages # # Quitte et retourne l'Ă©tat de sortie 3 si une erreur est rencontrĂ©e lors de # # l'archivage. # # - backupCheck() : Cette fonction effectue un test afin de savoir si la # # sauvegarde s'est bien dĂ©roulĂ©es. Elle vĂ©rifie via la commande du -ks si la # # taille totale du fichier supĂ©rieur Ă 0. # # Quitte et retourne l'Ă©tat de sortie 4 si aucune sauvegarde n'a put ĂȘtre # # effectuĂ©e ou si la taille des sauvegardes est nulle. # # # # # # AUTEUR(S) # # # # - Zergy (zergy@zergy.net) # # # ################################################################################ # Variables SHELL="/bin/bash"; PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"; source "/usr/local/etc/packages-backup.conf"; # Routine d'horodatage des logs function logDate() { LOG_FILE_DATE="$(date +'%d/%m/%Y\ %H:%M')"; } # Mise en place des journaux. function createLog() { if [ ! -f "$LOG_FILE" ]; then touch "$LOG_FILE"; chown root "$LOG_FILE"; chgrp adm "$LOG_FILE"; chmod 640 "$LOG_FILE"; fi } # Mise en place des rĂ©pertoires. function createBackupDir() { if [ ! -d "$BACKUP_DIR" ]; then mkdir --parents "$BACKUP_DIR"; if [ $? != 0 ]; then logDate; echo "$LOG_FILE_DATE : Impossible de crĂ©er le dossier de sauvegarde." >> "$LOG_FILE"; exit 1; fi chown root "$BACKUP_DIR"; chgrp backup "$BACKUP_DIR"; chmod 770 "$BACKUP_DIR"; fi } # Purge des ancienne sauvegardes. # Utilisation TMPReaper pour supprimer les sauvegardes vielles de plus de 49 jours (cf $RETENTION pour changer) function backupPurge() { tmpreaper -m "$RETENTION" "$BACKUP_DIR"; if [ $? != "0" ]; then logDate; echo "$LOG_FILE_DATE : Impossible de purger les anciennes sauvegardes." >> "$LOG_FILE"; exit 2; fi } # Fonction de sauvegarde function backup() { dpkg --get-selections > "$BACKUP_DIR/$DATE-Packages.list"; if [ $? != 0 ]; then logDate; echo "$LOG_FILE_DATE : Impossible de crĂ©er la liste des packages." >> "$LOG_FILE"; exit 3; fi chown root "$BACKUP_DIR/$DATE-Packages.list"; chgrp backup "$BACKUP_DIR/$DATE-Packages.list"; chmod 660 "$BACKUP_DIR/$DATE-Packages.list"; } # VĂ©rificarion des sauvegardes. function backupCheck() { if [ "$(du -ks "$BACKUP_DIR/$DATE-Packages.list" | awk {'print $1'})" -gt 0 ]; then logDate; echo "$LOG_FILE_DATE : Sauvegarde terminĂ©e avec succĂ©s." >> "$LOG_FILE"; else logDate; echo "$LOG_FILE_DATE : Aucune sauvegarde ou leur taille est de zĂ©ro." >> "$LOG_FILE"; exit 4; fi } function main() { createLog; createBackupDir; backup; backupCheck; backupPurge; } main; exit 0;
# Date format, used to name the backup directory DATE="$(date '+%Y%m%d')" # Backup directory BACKUP_DIR="/var/archives/Packages" # Log file LOG_FILE="/var/log/packages-backup.log" # Retention time RETENTION="49d"
Un petit script me permettant de rapidement sauvegarder ou restaurer mon dossier personnel via RSync. Sans doute améliorable.
La présence du mot de passe utilisé pour RSync dans le fichier de configuration demande de mettre les droits les plus restrictifs possible sur celui-ci.
#! /usr/bin/env bash ################################################################################# # # # LICENCE # # # # This program is free software: you can redistribute it and/or modify it under # # the terms of the GNU General Public License as published by the Free Software # # Foundation, either version 3 of the License, or (at your option) any later # # version. # # # # This program is distributed in the hope that it will be useful, but WITHOUT # # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.# # # # You should have received a copy of the GNU General Public License along with # # this program. If not, see <http: www.gnu.org="" licenses="">. # # # ################################################################################# ################################################################################# # # # DESCRIPTION # # # # Ce script permet de sauvegarder le dossier personnel d'un utilisateur sur un # # un serveur via RSync. # # # # # # VARIABLES # # # # - DATE : Date du jour, utilisĂ© pour nommer les fichers de journaux qui seront # # evonyĂ©s par courriel. # # - EXCLUDE_LIST : Liste des rĂ©pertoire et fichiers Ă ignorer. # # - INCLUDE_LIST : Liste des rĂ©pertoire et fichiers Ă copier mĂȘme s'ils sont # # dans des dossier Ă ignorer. # # - RSYNC_OPTS : Options RSync. ActualisĂ© pour prendre en compte les fichiers # # $EXCLUDE_FILE et $FILTERS_FILES s'ils existent. # # - SERVER : Serveur RSync. Utiliser le format "Utilisateur@Serveur" # # - VIRTUAL_DIR : RĂ©pertoire RSync virtuel. # # - RSYNC_PASSWORD : Mot de passe RSync, A utiliser pour chaque commande RSync. # # - MAIL_ADDRESS : Adresse courriel oĂč le rĂ©sultat de sauvegarde ou restauration# # doit ĂȘtre envoyĂ©. # # # # # # FONCTIONS # # # # - backup() : ExĂ©cute les commandes RSync de copie vers le serveur. Chaque # # commandes copie le dossier local voulu vers le rĂ©pertoire virtuel # # $VIRTUAL_DIR du serveur $RSYNC_USER@$RSYNC_SERVER en prenant en compte les # # options $RSYNC_OPTS. Les journaux envoyĂ©s vers vers $ACTION.log et les # # erreurs vers $ACTION.err. # # - restore() : ExĂ©cute les commandes RSync de restauration depuis le serveur. # # Chaque commandes copie le rĂ©pertoire virtuel $VIRTUAL_DIR du serveur # # $RSYNC_USER@$RSYNC_SERVER en prenant en compte les options $RSYNC_OPTS vers # # le dossier local voulu. # # Les journaux envoyĂ©s vers vers $ACTION.log et les erreurs vers # # $ACTION.err. # # # # # # AUTEUR(S) # # # # - Zergy (zergy@zergy.net) # # # # # # DERNIER(S) CHANGEMENT(S) # # # # - 09/05/2016 : Ăcriture de la documentation. # # # ################################################################################# # Variables PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"; source "$HOME/.config/rsync-home.conf"; VIRTUAL_DIR="$USER$VIRTUAL_DIR"; # CrĂ©ation du rĂ©pertoire de journaux function createLogDir () { if [ ! -d "$LOG_DIR" ]; then mkdir --parent "$LOG_DIR"; fi } # Gestion des erreurs function errorCheck() { if [ $? == 0 ]; then echo -e "\t\033[01;32mOK\033[00m"; else ERROR_CODE="$1"; ERROR_MESSAGE="$2"; echo -e "\t\033[01;31mErreur\033[00m"; echo -e "$ERROR_MESSAGE" if [ $ERROR_CODE != "-1" ]; then exit $ERROR_CODE; fi fi } # Test de prĂ©sence du serveur function pingServer() { echo -en "\n- Ping de $RSYNC_SERVER..."; ping -6 -c 1 -q "$RSYNC_SERVER" > /dev/null 2>&1; errorCheck 1 " $RSYNC_SERVER n'est pas joignable."; } # Construction de la liste des exclusion function buildExcludeList() { EXCLUDE_COUNT=$(echo "$EXCLUDE_LIST" | wc -w); for exclude_number in $(seq 1 $EXCLUDE_COUNT); do current_exclude=$(echo "$EXCLUDE_LIST" | cut -d' ' -f$exclude_number); RSYNC_OPTS="$RSYNC_OPTS --exclude=$current_exclude"; done; } # Construction de la listes des inclusions function buildIncludeList() { INCLUDE_COUNT=$(echo "$INCLUDE_LIST" | wc -w); for include_number in $(seq 1 $INCLUDE_COUNT); do current_include=$(echo "$INCLUDE_LIST" | cut -d' ' -f$include_number); RSYNC_OPTS="$RSYNC_OPTS --include=$current_include"; done; } # Fonction de sauvegarde function backup() { pingServer; createLogDir; buildIncludeList; buildExcludeList; echo -en "- Sauvegarde de $HOME/ sur $RSYNC_SERVER::$VIRTUAL_DIR..."; RSYNC_PASSWORD="$RSYNC_PASSWORD" rsync $RSYNC_OPTS "$HOME/" "$RSYNC_USER@$RSYNC_SERVER::$VIRTUAL_DIR" > "$LOG_DIR/$ACTION.log" 2> "$LOG_DIR/$ACTION.err"; errorCheck -1 " Erreur lors de la sauvegarde." mailResult; } # Fonction de restoration function restore() { pingServer; createLogDir; buildIncludeList; buildExcludeList; echo -en "- Restauration de $HOME/ depuis $RSYNC_SERVER::$VIRTUAL_DIR..."; RSYNC_PASSWORD="$RSYNC_PASSWORD" rsync $RSYNC_OPTS "$RSYNC_USER@$RSYNC_SERVER::$VIRTUAL_DIR" "$HOME/" > "$LOG_DIR/$ACTION.log" 2> "$LOG_DIR/$ACTION.err"; errorCheck -1 " Erreur lors de la restauration." mailResult; } # Envoi des rĂ©sultats function mailResult() { if [ -s "$LOG_DIR/$ACTION.err" ]; then case "$ACTION" in 'backup') MESSAGE="Erreurs lors de sauvegarde du VirtualDir $VIRTUAL_DIR de $HOSTNAME vers $RSYNC_SERVER.\n\n$(cat "$LOG_DIR/$ACTION.err")"; SUBJECT="RSync-Home Erreur (Sauvegarde $VIRTUAL_DIR $HOSTNAME -> $RSYNC_SERVER)"; ;; 'restore') MESSAGE="Erreurs lors de restauration du VirtualDir $VIRTUAL_DIT de $RSYNC_SERVER vers $HOSTNAME.\n\n$(cat "$LOG_DIR/$ACTION.err")"; SUBJECT="RSync-Home Erreur (Restauration $VIRTUAL_DIR $RSYNC_SERVER -> $HOSTNAME)"; ;; esac else case "$ACTION" in 'backup') MESSAGE="Aucune erreur pour la sauvegarde du VirtualDir $VIRTUAL_DIR de $HOSTNAME vers $RSYNC_SERVER\n\n$(tail -2 "$LOG_DIR/$ACTION.log")"; SUBJECT="RSync-Backup OK (Sauvegarde $VIRTUAL_DIR $HOSTNAME -> $RSYNC_SERVER)"; ;; 'restore') MESSAGE="Aucune erreur pour la restauration du VirtualDir $VIRTUAL_DIR de $RSYNC_SERVER vers $HOSTNAME\n\n$(tail -2 "$LOG_DIR/$ACTION.log")"; SUBJECT="RSync-Backup OK (Restauration $RSYNC_SERVER -> $HOSTNAME)"; ;; esac; fi echo -en "- Envoi du mail..."; (echo -e $MESSAGE) | mail -r "$MAIL_ADDRESS" -s "$SUBJECT" $MAIL_ADDRESS; errorCheck 2 " Impossible d'envoyer le mail."; } case "$1" in '-b' | '--backup') ACTION="backup"; backup; ;; '-r' | '--restore') ACTION="restore"; restore; ;; *) echo -e "Usage: rsync-home [OPTIONS]\n\n -b, --backup\t\tBackup files to the server.\n -r, --restore\t\tRestore files from the server.\n"; ;; esac; exit 0;
# RSync password RSYNC_PASSWORD="RSYNCPASSWD" # Date format, used to name the mailed logs files. DATE="$(date '+%Y%m%d')"; # Log directory LOG_DIR="$HOME/.log/rsync-home" # Files and directory to exclude separated with a space. Don't forget the starting "/" (and the final one if it's a directory). EXCLUDE_LIST="" # Files and directory to include -even if they are in the exclude list- separated with a space. Don't forget the starting "/" (and the final one if it's a directory). INCLUDE_LIST="" # RSync options RSYNC_OPTS="-aAhvz --delete" RSYNC_SERVER="server" RSYNC_USER="user" # Virtual directory name VIRTUAL_DIR="RsyncVirtualDir" # Mail address to send results MAIL_ADDRESS="user@server.tld"