đŸ’Ÿ Archived View for zergy.net â€ș blog â€ș 014-quelques-scripts-personnels.gmi captured on 2023-05-24 at 17:53:21. Gemini links have been rewritten to link to archived content

View Raw

More Information

âŹ…ïž Previous capture (2021-12-03)

âžĄïž Next capture (2024-05-10)

🚧 View Differences

-=-=-=-=-=-=-

Blog /home/zergy - Quelques scripts personnels

L'informatique, c'est pour les fainéant, c'est pas pour rien qu'on a des scripts pour tout. :)

Sauvegarde de bases de données MySQL/MariaDB

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.

Script principal

#! /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;

Fichier de configuration

# 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";

Sauvegarde de bases de données PostgreSQL

Le script ci-dessus peut-ĂȘtre adaptĂ© afin de sauvegarder des bases PostgreSQL.

Script principal

#! /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;

Fichier de configuration

# 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";

Sauvegardes des Packages

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

Script principal

#! /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;

Fichier de configuration

# 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"

RSync de dossier personnel

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.

Script principal

#! /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;

Fichier de configuration

# 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"

Accueil du Blog

Accueil de la capsule