#!/bin/bash # # sync_geosector.sh - Synchronise les backups geosector depuis PM7 vers maria3 (IN3) et maria4 (IN4) # # Ce script : # 1. Trouve le dernier backup chiffré de geosector sur PM7 # 2. Le déchiffre et décompresse localement # 3. Le transfère et l'importe dans IN3/maria3/geosector # 4. Le transfère et l'importe dans IN4/maria4/geosector # # Installation: /var/pierre/bat/sync_geosector.sh # Usage: ./sync_geosector.sh [--force] [--date YYYYMMDD_HH] # set -uo pipefail # Note: Removed -e to allow script to continue on sync errors # Errors are handled explicitly with ERROR_COUNT # Configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CONFIG_FILE="$SCRIPT_DIR/d6back.yaml" BACKUP_DIR="/var/pierre/back/IN3/nx4/sql" ENC_KEY_FILE="/home/pierre/.key_enc" SSH_KEY="/home/pierre/.ssh/backup_key" TEMP_DIR="/tmp/geosector_sync" LOG_FILE="/var/pierre/bat/logs/sync_geosector.log" RECAP_FILE="/tmp/sync_geosector_recap_$$.txt" # Load email config from d6back.yaml if [[ -f "$CONFIG_FILE" ]]; then EMAIL_TO=$(yq '.global.email_to // "support@unikoffice.com"' "$CONFIG_FILE" | tr -d '"') BACKUP_SERVER=$(yq '.global.backup_server // "BACKUP"' "$CONFIG_FILE" | tr -d '"') else EMAIL_TO="support@unikoffice.com" BACKUP_SERVER="BACKUP" fi # Serveurs cibles IN3_HOST="195.154.80.116" IN3_USER="pierre" IN3_CONTAINER="maria3" IN4_HOST="51.159.7.190" IN4_USER="pierre" IN4_CONTAINER="maria4" # Credentials MariaDB DB_USER="root" IN3_DB_PASS="MyAlpLocal,90b" # maria3 IN4_DB_PASS="MyAlpLocal,90b" # maria4 DB_NAME="geosector" # Fonctions utilitaires log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE" } error() { log "ERROR: $*" exit 1 } cleanup() { if [[ -d "$TEMP_DIR" ]]; then log "Nettoyage de $TEMP_DIR" rm -rf "$TEMP_DIR" fi rm -f "$RECAP_FILE" } trap cleanup EXIT # Lecture de la clé de chiffrement if [[ ! -f "$ENC_KEY_FILE" ]]; then error "Clé de chiffrement non trouvée: $ENC_KEY_FILE" fi ENC_KEY=$(cat "$ENC_KEY_FILE") # Parsing des arguments FORCE=0 SPECIFIC_DATE="" while [[ $# -gt 0 ]]; do case $1 in --force) FORCE=1 shift ;; --date) SPECIFIC_DATE="$2" shift 2 ;; *) echo "Usage: $0 [--force] [--date YYYYMMDD_HH]" exit 1 ;; esac done # Trouver le fichier backup if [[ -n "$SPECIFIC_DATE" ]]; then BACKUP_FILE="$BACKUP_DIR/geosector_${SPECIFIC_DATE}.sql.gz.enc" if [[ ! -f "$BACKUP_FILE" ]]; then error "Backup non trouvé: $BACKUP_FILE" fi else # Chercher le plus récent BACKUP_FILE=$(find "$BACKUP_DIR" -name "geosector_*.sql.gz.enc" -type f -printf '%T@ %p\n' | sort -rn | head -1 | cut -d' ' -f2-) if [[ -z "$BACKUP_FILE" ]]; then error "Aucun backup geosector trouvé dans $BACKUP_DIR" fi fi BACKUP_BASENAME=$(basename "$BACKUP_FILE") log "Backup sélectionné: $BACKUP_BASENAME" # Initialiser le fichier récapitulatif echo "SYNC GEOSECTOR REPORT - $(hostname) - $(date '+%d.%m.%Y %H')h" > "$RECAP_FILE" echo "========================================" >> "$RECAP_FILE" echo "" >> "$RECAP_FILE" echo "Backup source: $BACKUP_BASENAME" >> "$RECAP_FILE" echo "" >> "$RECAP_FILE" # Créer le répertoire temporaire mkdir -p "$TEMP_DIR" DECRYPTED_FILE="$TEMP_DIR/geosector.sql" # Étape 1: Déchiffrer et décompresser log "Déchiffrement et décompression du backup..." if ! openssl enc -aes-256-cbc -d -pass pass:"$ENC_KEY" -pbkdf2 -in "$BACKUP_FILE" | gunzip > "$DECRYPTED_FILE"; then error "Échec du déchiffrement/décompression" fi FILE_SIZE=$(du -h "$DECRYPTED_FILE" | cut -f1) log "Fichier SQL déchiffré: $FILE_SIZE" echo "Decrypted SQL size: $FILE_SIZE" >> "$RECAP_FILE" echo "" >> "$RECAP_FILE" # Compteur d'erreurs ERROR_COUNT=0 # Fonction pour synchroniser vers un serveur sync_to_server() { local HOST=$1 local USER=$2 local CONTAINER=$3 local DB_PASS=$4 local SERVER_NAME=$5 log "=== Synchronisation vers $SERVER_NAME ($HOST) ===" echo "TARGET: $SERVER_NAME ($HOST/$CONTAINER)" >> "$RECAP_FILE" # Test de connexion SSH if ! ssh -i "$SSH_KEY" -o ConnectTimeout=10 "$USER@$HOST" "echo 'SSH OK'" &>/dev/null; then log "ERROR: Impossible de se connecter à $HOST via SSH" echo " ✗ SSH connection FAILED" >> "$RECAP_FILE" ((ERROR_COUNT++)) return 1 fi # Import dans MariaDB log "Import dans $SERVER_NAME/$CONTAINER/geosector..." # Drop et recréer la base sur le serveur distant if ! ssh -i "$SSH_KEY" "$USER@$HOST" "incus exec $CONTAINER --project default -- mariadb -u root -p'$DB_PASS' -e 'DROP DATABASE IF EXISTS $DB_NAME; CREATE DATABASE $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'"; then log "ERROR: Échec de la création de la base sur $SERVER_NAME" echo " ✗ Database creation FAILED" >> "$RECAP_FILE" ((ERROR_COUNT++)) return 1 fi # Filtrer et importer le SQL (enlever CREATE DATABASE et USE avec timestamp) log "Filtrage et import du SQL..." if ! sed -e '/^CREATE DATABASE.*geosector_[0-9]/d' \ -e '/^USE.*geosector_[0-9]/d' \ "$DECRYPTED_FILE" | \ ssh -i "$SSH_KEY" "$USER@$HOST" "incus exec $CONTAINER --project default -- mariadb -u root -p'$DB_PASS' $DB_NAME"; then log "ERROR: Échec de l'import sur $SERVER_NAME" echo " ✗ SQL import FAILED" >> "$RECAP_FILE" ((ERROR_COUNT++)) return 1 fi log "$SERVER_NAME: Import réussi" echo " ✓ Import SUCCESS" >> "$RECAP_FILE" echo "" >> "$RECAP_FILE" } # Synchronisation vers IN3/maria3 sync_to_server "$IN3_HOST" "$IN3_USER" "$IN3_CONTAINER" "$IN3_DB_PASS" "IN3/maria3" # Synchronisation vers IN4/maria4 sync_to_server "$IN4_HOST" "$IN4_USER" "$IN4_CONTAINER" "$IN4_DB_PASS" "IN4/maria4" # Finaliser le récapitulatif echo "========================================" >> "$RECAP_FILE" echo "COMPLETED: $(date '+%d.%m.%Y %H:%M')" >> "$RECAP_FILE" # Préparer le sujet email avec date DATE_SUBJECT=$(date '+%d.%m.%Y %H') # Envoyer l'email récapitulatif if [[ $ERROR_COUNT -gt 0 ]]; then log "Total errors: $ERROR_COUNT" # Ajouter les erreurs au récap echo "" >> "$RECAP_FILE" echo "ERRORS DETECTED: $ERROR_COUNT" >> "$RECAP_FILE" echo "----------------------------" >> "$RECAP_FILE" grep -i "ERROR" "$LOG_FILE" | tail -20 >> "$RECAP_FILE" # Envoyer email avec ERROR dans le sujet log "Sending ERROR email to $EMAIL_TO (Errors found: $ERROR_COUNT)" if command -v msmtp &> /dev/null; then { echo "To: $EMAIL_TO" echo "Subject: Sync${BACKUP_SERVER} ERROR $DATE_SUBJECT" echo "" cat "$RECAP_FILE" } | msmtp "$EMAIL_TO" log "ERROR email sent successfully to $EMAIL_TO" else log "WARNING: msmtp not found - ERROR email NOT sent" fi log "=== Synchronisation terminée avec des erreurs ===" exit 1 else log "=== Synchronisation terminée avec succès ===" log "Les bases geosector sur maria3 et maria4 sont à jour avec le backup $BACKUP_BASENAME" # Envoyer email de succès log "Sending SUCCESS recap email to $EMAIL_TO" if command -v msmtp &> /dev/null; then { echo "To: $EMAIL_TO" echo "Subject: Sync${BACKUP_SERVER} $DATE_SUBJECT" echo "" cat "$RECAP_FILE" } | msmtp "$EMAIL_TO" log "SUCCESS recap email sent successfully to $EMAIL_TO" else log "WARNING: msmtp not found - SUCCESS recap email NOT sent" fi exit 0 fi