@@ -18,8 +18,11 @@ set -euo pipefail
# 7. transfère chaque fichier vers le serveur distant ;
# 8. envoie un bilan sur Discord :
# - 1 message global si tout est OK ;
# - 1 message USERS si export/transfert des rôles en erreur ;
# - 1 message par base si dump ou transfert en erreur.
# - en cas d’ erreur partielle :
# * USERS OK -> message simple ;
# * USERS KO -> message détaillé ;
# * DB OK -> message simple ;
# * DB KO -> message détaillé.
###############################################################################
#######################################
@@ -60,48 +63,41 @@ set +a
# Configuration principale
#######################################
# Conversion de la liste des bases en tableau Bash
read -r -a DBS_ARRAY <<< " $DBS "
# Paramètres de connexion SSH vers la machine distante
IA_SSH = " ${ BACKUP_REMOTE_USER } @ ${ BACKUP_REMOTE_HOST } "
IA_BASE_DIR = " ${ BACKUP_REMOTE_DIR } "
# Clé SSH et options utilisées pour les connexions SSH/SCP
SSH_OPTS = ( -i " $SSH_KEY " -o IdentitiesOnly = yes -o BatchMode = yes -o ConnectTimeout = " ${ SSH_TIMEOUT } " )
SSH_OPTS = (
-i " $SSH_KEY "
-o IdentitiesOnly = yes
-o BatchMode = yes
-o ConnectTimeout = " ${ SSH_TIMEOUT } "
)
# Dossier de logs local
LOG_DIR = " ${ BACKUP_LOG_DIR } "
mkdir -p " $LOG_DIR "
# Timestamp unique pour identifier ce jeu de sauvegardes
TS = " $( date +'%Y-%m-%d_%H-%M-%S' ) "
BACKUP_DIR_NAME = " backup_ ${ TS } "
LOG_FILE = " ${ LOG_DIR } / ${ BACKUP_DIR_NAME } .log "
# Dossier temporaire local où seront générés les dumps avant transfert
TMP_DIR = " /tmp/pg_dump_ ${ BACKUP_DIR_NAME } "
mkdir -p " $TMP_DIR "
# Redirige stdout/stderr vers le fichier de log tout en gardant l'affichage console
exec > >( tee -a " $LOG_FILE " ) 2>& 1
# Fonction de log horodaté
log( ) { echo " ---- $( date +'%Y-%m-%d %H:%M:%S' ) ---- $* " ; }
# Rend le mot de passe PostgreSQL disponible à psql / pg_dump
export PGPASSWORD
#######################################
# Configuration Discord
#######################################
# URL du webhook Discord.
# Si elle est vide, aucune notification ne sera envoyée.
DISCORD_WEBHOOK_URL = " ${ DISCORD_WEBHOOK_URL :- } "
DISCORD_PING = " ${ DISCORD_PING :- @here } "
# Envoie un message texte simple sur Discord via webhook
discord_send( ) {
local msg = " $1 "
[ [ -z " ${ DISCORD_WEBHOOK_URL :- } " ] ] && return
@@ -115,7 +111,6 @@ discord_send() {
# Message global OK
#######################################
# Envoie un message unique quand tout le process s’ est bien déroulé
discord_msg_global_ok( ) {
local msg = " **BACKUP BDD ${ ENV_NAME } 🟢**\n "
msg += " Name: ${ BACKUP_DIR_NAME } \n "
@@ -126,15 +121,17 @@ discord_msg_global_ok() {
}
#######################################
# Message USERS
# Messages USERS
#######################################
# Envoie un message de statut spécifique à l’ export/transfert des rôles/users
# Paramètres :
# $1 = export_ok -> non vide si export OK
# $2 = transfer_ok -> non vide si transfert OK
# $3 = details -> détail textuel de l’ erreur éventuelle
discord_msg_users( ) {
discord_msg_users_ok_simple( ) {
local msg = " **BACKUP BDD ${ ENV_NAME } 🟢**\n "
msg += "Users backup validé"
discord_send " $msg "
}
discord_msg_users_error( ) {
local export_ok = " $1 "
local transfer_ok = " $2 "
local details = " $3 "
@@ -143,16 +140,7 @@ discord_msg_users() {
export_disp = $( [ [ -n " $export_ok " ] ] && echo "✅" || echo "❌" )
transfer_disp = $( [ [ -n " $transfer_ok " ] ] && echo "✅" || echo "❌" )
local color ping
if [ [ -n " $export_ok " && -n " $transfer_ok " ] ] ; then
color = "🟢"
ping = ""
else
color = "🔴"
ping = " ${ DISCORD_PING } "
fi
local msg = " ** ${ ping } BACKUP BDD ${ ENV_NAME } ${ color } **\n "
local msg = " ** ${ DISCORD_PING } BACKUP BDD ${ ENV_NAME } 🔴**\n "
msg += " Name: ${ BACKUP_DIR_NAME } \n "
msg += " Users export: ${ export_disp } \n "
msg += " Users transfer: ${ transfer_disp } "
@@ -163,16 +151,18 @@ discord_msg_users() {
}
#######################################
# Message DB
# Messages DB
#######################################
# Envoie un message de statut spécifique à une base donnée
# Paramètres :
# $1 = db -> nom de la base
# $2 = dump_ok -> non vide si dump OK
# $3 = transfer_ok -> non vide si transfert OK
# $4 = details -> détail textuel de l’ erreur éventuelle
discord_msg_db( ) {
discord_msg_db_ok_simple( ) {
local db = " $1 "
local msg = " **BACKUP BDD ${ ENV_NAME } 🟢**\n "
msg += " Backup validé : ${ db } "
discord_send " $msg "
}
discord_msg_db_error( ) {
local db = " $1 "
local dump_ok = " $2 "
local transfer_ok = " $3 "
@@ -182,16 +172,7 @@ discord_msg_db() {
dump_disp = $( [ [ -n " $dump_ok " ] ] && echo "✅" || echo "❌" )
transfer_disp = $( [ [ -n " $transfer_ok " ] ] && echo "✅" || echo "❌" )
local color ping
if [ [ -n " $dump_ok " && -n " $transfer_ok " ] ] ; then
color = "🟢"
ping = ""
else
color = "🔴"
ping = " ${ DISCORD_PING } "
fi
local msg = " ** ${ ping } BACKUP BDD ${ ENV_NAME } ${ color } **\n "
local msg = " ** ${ DISCORD_PING } BACKUP BDD ${ ENV_NAME } 🔴**\n "
msg += " Name: ${ BACKUP_DIR_NAME } \n "
msg += " Database: ${ db } \n "
msg += " Dump: ${ dump_disp } \n "
@@ -225,7 +206,7 @@ LOCK_DIR="/tmp/pg_multi_dump_stream.lock.d"
if ! mkdir " $LOCK_DIR " 2>/dev/null; then
log "ERROR: Backup déjà en cours"
discord_msg_users "" "" "Lock already exists"
discord_msg_users_error "" "" "Lock already exists"
exit 1
fi
@@ -241,7 +222,7 @@ log "Creating remote directories"
if ! ssh " ${ SSH_OPTS [@] } " " $IA_SSH " " mkdir -p ' ${ REMOTE_DIR } /ferme' ' ${ REMOTE_DIR } /sirh' ' ${ REMOTE_DIR } /inventory' ' ${ REMOTE_DIR } /user' " ; then
log "ERROR: remote mkdir failed"
discord_msg_users "" "" "Remote mkdir failed"
discord_msg_users_error "" "" "Remote mkdir failed"
exit 1
fi
@@ -271,7 +252,11 @@ RET=$?
if [ [ $RET -ne 0 ] ] ; then
USERS_OK =
USERS_TRANSFER_OK =
USERS_DETAILS += " roles transfer failed"
if [ [ -n " $USERS_DETAILS " ] ] ; then
USERS_DETAILS += " | roles transfer failed"
else
USERS_DETAILS = "roles transfer failed"
fi
fi
set -e
@@ -283,17 +268,15 @@ set -e
set +e
for DB in " ${ DBS_ARRAY [@] } " ; do
FILE = " ${ TMP_DIR } / ${ DB } _ ${ TS } .dump "
DB_DUMP_OK[ " $DB " ] = true
DB_TRANSFER_OK[ " $DB " ] = true
DB_DETAILS[ " $DB " ] = "OK "
DB_DETAILS[ " $DB " ] = ""
log " Dump $DB "
pg_dump -h " $PGHOST " -p " $PGPORT " -U " $PGUSER " -Fc -d " $DB " -f " $FILE "
RET = $?
if [ [ $RET -ne 0 ] ] ; then
@@ -305,7 +288,6 @@ for DB in "${DBS_ARRAY[@]}"; do
fi
scp " ${ SSH_OPTS [@] } " " $FILE " " $IA_SSH : ${ REMOTE_DIR } / ${ DB } / "
RET = $?
if [ [ $RET -ne 0 ] ] ; then
@@ -313,7 +295,6 @@ for DB in "${DBS_ARRAY[@]}"; do
DB_TRANSFER_OK[ " $DB " ] =
DB_DETAILS[ " $DB " ] = "transfer failed"
fi
done
set -e
@@ -338,10 +319,18 @@ if [[ -z "${MODE_KO:-}" ]]; then
exit 0
fi
discord_msg_users " ${ USERS_EXPORT_OK : +true } " " ${ USERS_TRANSFER_OK : +true } " " $USERS_DETAILS "
if [ [ -n " ${ USERS_EXPORT_OK :- } " && -n " ${ USERS_TRANSFER_OK :- } " ] ] ; then
discord_msg_users_ok_simple
else
discord_msg_users_error " ${ USERS_EXPORT_OK : +true } " " ${ USERS_TRANSFER_OK : +true } " " $USERS_DETAILS "
fi
for DB in " ${ DBS_ARRAY [@] } " ; do
discord_msg_db " $DB " " ${ DB_DUMP_OK [ $DB ] : +true } " " ${ DB_TRANSFER_OK [ $DB ] : +true } " " ${ DB_DETAILS [ $DB ] } "
if [ [ -n " ${ DB_DUMP_OK [ $DB ] :- } " && -n " ${ DB_TRANSFER_OK [ $DB ] :- } " ] ] ; then
discord_msg_db_ok_simple " $DB "
else
discord_msg_db_error " $DB " " ${ DB_DUMP_OK [ $DB ] : +true } " " ${ DB_TRANSFER_OK [ $DB ] : +true } " " ${ DB_DETAILS [ $DB ] } "
fi
done
exit 2