Outils pour utilisateurs

Outils du site


synchronisation_d_un_serveur_sur_deux_autres

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
synchronisation_d_un_serveur_sur_deux_autres [2025/02/03 23:50] inc002synchronisation_d_un_serveur_sur_deux_autres [2025/02/04 00:02] (Version actuelle) inc002
Ligne 1: Ligne 1:
-=== Script de synchronisation PiHole ===+=== Script de synchronisation PiHole ====
  
 == Vue d'ensemble == == Vue d'ensemble ==
Ligne 5: Ligne 5:
  
 == Architecture == == Architecture ==
-= Serveurs = +=== Serveurs ==
-- **Source de vérité** : Mikrotik (192.168.2.1) +  '''Source de vérité''' : Mikrotik (192.168.2.1) 
-  Stockage : `/usb1/etc/pihole/et `/usb1/etc/dnsmasq.d/` +  ** Stockage : <code>/usb1/etc/pihole/</code> et <code>/usb1/etc/dnsmasq.d/</code> 
-  Utilisateur : piholesync +  ** Utilisateur : piholesync 
-- **Serveurs cibles** : Ubuntu (192.168.2.8 et 192.168.2.9) +  '''Serveurs cibles''' : Ubuntu (192.168.2.8 et 192.168.2.9) 
-  Stockage : `/etc/pihole/et `/etc/dnsmasq.d/` +  ** Stockage : <code>/etc/pihole/</code> et <code>/etc/dnsmasq.d/</code> 
-  Utilisateur : piholesync avec droits sudo+  ** Utilisateur : piholesync avec droits sudo
  
-== Fichiers synchronisés == +=== Fichiers synchronisés === 
-- **PiHole** +'''PiHole''' 
-  gravity.db (base de données principale) +** gravity.db (base de données principale) 
-  custom.list (règles personnalisées) +** custom.list (règles personnalisées) 
-  local.list (règles locales) +** local.list (règles locales) 
-- **DNSMasq** +'''DNSMasq''' 
-  05-pihole-custom-cname.conf (règles CNAME)+** 05-pihole-custom-cname.conf (règles CNAME)
  
-## Fonctionnalités+== Fonctionnalités ==
  
-### Système de backup +=== Système de backup === 
-Localisation : `/var/backup/pihole-sync/` +Localisation : <code>/var/backup/pihole-sync/</code> 
-Rotation automatique : Conservation de 7 jours +Rotation automatique : Conservation de 7 jours 
-Structure : Un sous-dossier par serveur et par date +Structure : Un sous-dossier par serveur et par date 
-Contenu : Copie complète de /etc/pihole et /etc/dnsmasq.d+Contenu : Copie complète de /etc/pihole et /etc/dnsmasq.d
  
-### Logging +=== Logging === 
-Fichiers : `/var/log/pihole-sync/sync.log` +Fichiers : <code>/var/log/pihole-sync/sync.log</code> 
-Rotation : Quotidienne avec conservation de 7 jours +Rotation : Quotidienne avec conservation de 7 jours 
-Format : `[TIMESTAMP] Message` +Format : <code>[TIMESTAMP] Message</code> 
-Niveaux : Info et Debug (avec --debug)+Niveaux : Info et Debug (avec --debug)
  
-### Sécurité +=== Sécurité === 
-Authentification SSH par clés +Authentification SSH par clés 
-Utilisateur dédié (piholesync) +Utilisateur dédié (piholesync) 
-Permissions sudo limitées +Permissions sudo limitées 
-Vérification des droits avant exécution+Vérification des droits avant exécution
  
-## Processus de synchronisation+== Processus de synchronisation ==
  
-### 1. Vérifications préalables +=== 1. Vérifications préalables === 
-1. Rotation des logs +Rotation des logs 
-2. Vérification de l'existence des fichiers source +Vérification de l'existence des fichiers source 
-3. Test des droits sudo sur tous les serveurs +Test des droits sudo sur tous les serveurs 
-4. Création des backups+Création des backups
  
-### 2. Copie depuis Mikrotik +=== 2. Copie depuis Mikrotik === 
-1. Création d'un dossier temporaire +Création d'un dossier temporaire 
-2. Copie des fichiers via SFTP +Copie des fichiers via SFTP 
-3. Vérification de l'intégrité (taille, format SQLite) +Vérification de l'intégrité (taille, format SQLite) 
-4. Synchronisation du fichier CNAME+Synchronisation du fichier CNAME
  
-### 3. Déploiement +=== 3. Déploiement === 
-1. Arrêt des services PiHole +Arrêt des services PiHole 
-2. Synchronisation des fichiers via rsync +Synchronisation des fichiers via rsync 
-3. Correction des permissions +Correction des permissions 
-4. Reconstruction des bases gravity +Reconstruction des bases gravity 
-5. Redémarrage des services+Redémarrage des services
  
-## Utilisation+== Utilisation ==
  
-### Prérequis +=== Prérequis === 
-1. Configuration SSH avec clés pour piholesync +Configuration SSH avec clés pour piholesync 
-2. Droits sudo pour piholesync sur les commandes : +Droits sudo pour piholesync sur les commandes : 
-   - rsync +#* rsync 
-   - pihole +#* pihole 
-3. Répertoires de logs et backups créés avec bonnes permissions+Répertoires de logs et backups créés avec bonnes permissions
  
-### Commandes +=== Commandes === 
-```bash+<syntaxhighlight lang="bash">
 # Exécution normale # Exécution normale
 ./pihole-sync.sh ./pihole-sync.sh
Ligne 84: Ligne 84:
 # Aide # Aide
 ./pihole-sync.sh --help ./pihole-sync.sh --help
-```+</syntaxhighlight>
  
-### Options +=== Options === 
-- `--dry-run: Simulation sans modification +* '''--dry-run''' : Simulation sans modification 
-- `--debug: Affichage des messages de debug+* '''--debug''' : Affichage des messages de debug
  
-## Résolution des problèmes+== Résolution des problèmes ==
  
-### Logs à vérifier +=== Logs à vérifier === 
-1. `/var/log/pihole-sync/sync.log` +# <code>/var/log/pihole-sync/sync.log</code> 
-2. Journaux système (`journalctl`+Journaux système (<code>journalctl</code>
-3. Logs PiHole (`/var/log/pihole/pihole.log`)+Logs PiHole (<code>/var/log/pihole/pihole.log</code>)
  
-### Problèmes courants +=== Problèmes courants === 
-1. **Erreur SSH** : Vérifier les clés et permissions +Erreur SSH 
-2. **Erreur sudo** : Contrôler le fichier sudoers +: Vérifier les clés et permissions 
-3. **Fichiers invalides** : Vérifier l'espace disque et les permissions +Erreur sudo 
-4. **Services non redémarrés** : Relancer manuellement `pihole -g`+: Contrôler le fichier sudoers 
 +Fichiers invalides 
 +: Vérifier l'espace disque et les permissions 
 +Services non redémarrés 
 +: Relancer manuellement <code>pihole -g</code>
  
-## Maintenance+== Maintenance ==
  
-### Tâches quotidiennes +=== Tâches quotidiennes === 
-Vérification des logs +Vérification des logs 
-Contrôle des backups +Contrôle des backups 
-Validation du fonctionnement DNS+Validation du fonctionnement DNS
  
-### Tâches hebdomadaires +=== Tâches hebdomadaires === 
-Nettoyage des vieux backups +Nettoyage des vieux backups 
-Vérification de l'espace disque +Vérification de l'espace disque 
-Test de restauration+Test de restauration
  
-### Tâches mensuelles +=== Tâches mensuelles === 
-Rotation des clés SSH +Rotation des clés SSH 
-Audit des permissions +Audit des permissions 
-Test de recovery complet+Test de recovery complet 
 + 
 +<code "bash"> 
 +#!/bin/bash 
 +# Variables de configuration 
 +MIKROTIK_MASTER="piholesync@192.168.2.1" 
 +LOCAL_HOST="192.168.2.8" 
 +OTHER_UBUNTU="piholesync@192.168.2.9" 
 +DRY_RUN=0 
 +DEBUG=0 
 + 
 +# SSH Options 
 +SSH_OPTS="-o BatchMode=yes -o StrictHostKeyChecking=no" 
 +SUDO_OPTS=" sudo -n -u piholesync " 
 + 
 +# Chemins sur le Mikrotik (master) 
 +MIKROTIK_PIHOLE_PATH="/usb1/etc" 
 +MIKROTIK_DNSMASQ_PATH="/usb1/etc-dnsmasq.d" 
 + 
 +# Chemins de logs et backups 
 +LOG_DIR="/var/log/pihole-sync" 
 +LOG_FILE="$LOG_DIR/sync.log" 
 +BACKUP_DIR="/var/backup/pihole-sync" 
 +MAX_LOGS=7 
 + 
 +# Liste des fichiers à exclure 
 +EXCLUDE_LIST=( 
 +   "pihole-FTL-old.db" 
 +   "gravity_old.db" 
 +   "*.log" 
 +   "dhcp.leases" 
 +   "setupVars.conf.update.bak" 
 +   "pihole-FTL.conf" 
 +   "install.log" 
 +
 + 
 +# Fonction pour construire les options rsync 
 +build_rsync_opts() { 
 +    local target="$1"  # Paramètre pour identifier la cible 
 +    local opts="-avz" 
 + 
 +    # Ajouter les exclusions 
 +    for item in "${EXCLUDE_LIST[@]}"; do 
 +        opts+=" --exclude=$item" 
 +    done 
 + 
 +    # Ajouter --dry-run si nécessaire 
 +    [ $DRY_RUN -eq 1 ] && opts+=" --dry-run" 
 + 
 +    # Option spéciale pour Mikrotik 
 +    if [[ $target == *"192.168.2.1"* ]]; then 
 +        opts+=" --rsh='ssh $SSH_OPTS' --rsync-path=/usr/bin/rsync" 
 +    fi 
 + 
 +    echo "$opts" 
 +
 + 
 +# Fonction de debug 
 +debug() { 
 +   if [ $DEBUG -eq 1 ]; then 
 +       echo "DEBUG: $1" 
 +   fi 
 +
 + 
 +# Fonction de logging 
 +log() { 
 +   local message="$1" 
 +   local timestamp=$(date '+%Y-%m-%d %H:%M:%S'
 +   echo "[$timestamp] $message" 
 +   if [ -w "$LOG_DIR" ]; then 
 +       echo "[$timestamp] $message" >> "$LOG_FILE" 
 +   fi 
 +
 + 
 +# Fonction de rotation des logs 
 +rotate_logs() { 
 +   if [ -f "$LOG_FILE" ]; then 
 +       mv "$LOG_FILE" "$LOG_FILE.$(date '+%Y%m%d')" 
 +       find "$LOG_DIR" -name "sync.log.*" -mtime +$MAX_LOGS -delete 
 +   fi 
 +
 + 
 +# Fonction de vérification des droits sudo 
 +check_sudo() { 
 +    local host="$1" 
 +    log "Vérification des droits sudo sur $host..." 
 + 
 +    if [[ $host == "localhost" ]]; then 
 +        # Test local 
 +        log "Test des permissions rsync..." 
 +        if $SUDO_OPTS rsync --version >/dev/null 2>&1; then 
 +            log "✓ Droits sudo OK pour rsync" 
 +        else 
 +            log "✗ Droits sudo manquants pour rsync" 
 +            return 1 
 +        fi 
 + 
 +        log "Test des permissions pihole..." 
 +        if $SUDO_OPTS pihole -v >/dev/null 2>&1; then 
 +            log "✓ Droits sudo OK pour pihole" 
 +        else 
 +            log "✗ Droits sudo manquants pour pihole" 
 +            return 1 
 +        fi 
 +    else 
 +        # Test distant avec sudo -u piholesync 
 +        log "Test des permissions rsync sur $host..." 
 +        if sudo -u piholesync ssh $SSH_OPTS "$host" "$SUDO_OPTS rsync --version" >/dev/null 2>&1; then 
 +            log "✓ Droits sudo OK pour rsync sur $host" 
 +        else 
 +            log "✗ Droits sudo manquants pour rsync sur $host" 
 +            return 1 
 +        fi 
 + 
 +        log "Test des permissions pihole sur $host..." 
 +        if sudo -u piholesync ssh $SSH_OPTS "$host" "$SUDO_OPTS pihole -v" >/dev/null 2>&1; then 
 +            log "✓ Droits sudo OK pour pihole sur $host" 
 +        else 
 +            log "✗ Droits sudo manquants pour pihole sur $host" 
 +            return 1 
 +        fi 
 +    fi 
 + 
 +    log "✓ Tous les droits sudo sont corrects" 
 +    return 0 
 +
 + 
 +# Fonction de backup modifiée 
 +backup_pihole() { 
 +    local host="$1" 
 +    local backup_date=$(date '+%Y%m%d_%H%M%S'
 +    local backup_path="$BACKUP_DIR/$host/$backup_date" 
 +    local rsync_opts=$(build_rsync_opts "$host"
 + 
 +    log "Création d'une sauvegarde pour $host" 
 + 
 +    # Création des répertoires avec les bonnes permissions 
 +    if ! sudo mkdir -p "$backup_path/pihole" "$backup_path/dnsmasq.d"; then 
 +        log "Erreur : Impossible de créer les répertoires de backup" 
 +        return 1 
 +    fi 
 + 
 +    # Attribution des permissions à piholesync 
 +    if ! sudo chown -R piholesync:piholesync "$backup_path"; then 
 +        log "Erreur : Impossible de modifier les permissions des répertoires de backup" 
 +        return 1 
 +    fi 
 + 
 +    if [[ $host == "localhost" ]]; then 
 +        if ! sudo -u piholesync rsync $rsync_opts /etc/pihole/ "$backup_path/pihole/"; then 
 +            log "Erreur : Échec de la sauvegarde des fichiers pihole locaux" 
 +            return 1 
 +        fi 
 +        if ! sudo -u piholesync rsync $rsync_opts /etc/dnsmasq.d/ "$backup_path/dnsmasq.d/"; then 
 +            log "Erreur : Échec de la sauvegarde des fichiers dnsmasq locaux" 
 +            return 1 
 +        fi 
 +    else 
 +        if ! sudo -u piholesync rsync $rsync_opts -e "ssh $SSH_OPTS" "$host:/etc/pihole/" "$backup_path/pihole/"; then 
 +            log "Erreur : Échec de la sauvegarde des fichiers pihole distants" 
 +            return 1 
 +        fi 
 +        if ! sudo -u piholesync rsync $rsync_opts -e "ssh $SSH_OPTS" "$host:/etc/dnsmasq.d/" "$backup_path/dnsmasq.d/"; then 
 +            log "Erreur : Échec de la sauvegarde des fichiers dnsmasq distants" 
 +            return 1 
 +        fi 
 +    fi 
 + 
 +    log "Sauvegarde terminée pour $host dans $backup_path" 
 +    return 0 
 +
 +# Fonction pour vérifier l'existence d'un fichier distant via SSH 
 +# Fonction pour vérifier l'existence d'un fichier distant via SSH 
 +check_remote_file() { 
 +    local host="$1" 
 +    local file="$2" 
 +    local description="$3" 
 + 
 +    log "Vérification de $description sur $host..." 
 +    if [[ $host == *"192.168.2.1"* ]]; then 
 +        # Cas spécial pour Mikrotik 
 +        local mikrotik_path=${file#/
 +        local cmd="/file print where name=\"$mikrotik_path\"" 
 + 
 +        debug "Chemin original: $file" 
 +        debug "Chemin Mikrotik: $mikrotik_path" 
 +        debug "Commande exécutée: $cmd" 
 + 
 +        local output=$(sudo -u piholesync ssh $SSH_OPTS "$host" "$cmd"
 +        debug "Sortie de la commande:" 
 +        debug "$output" 
 + 
 +        if echo "$output" | grep -q "$mikrotik_path"; then 
 +            log "✓ $description trouvé" 
 +            return 0 
 +        else 
 +            log "✗ $description non trouvé ($mikrotik_path)" 
 +            return 1 
 +        fi 
 +    else 
 +        # Cas standard pour les serveurs Ubuntu 
 +        if sudo -u piholesync ssh $SSH_OPTS "$host" "$SUDO_OPTS [ -f $file ]"; then 
 +            log "✓ $description trouvé" 
 +            return 0 
 +        else 
 +            log "✗ $description non trouvé à $file" 
 +            return 1 
 +        fi 
 +    fi 
 +
 + 
 +# Fonction pour copier depuis le Mikrotik 
 +# Fonction pour copier depuis le Mikrotik 
 +copy_from_mikrotik() { 
 +    local source="$1" 
 +    local dest="$2" 
 +    local description="$3" 
 + 
 +    log "Copie de $description depuis Mikrotik..." 
 +    if [ $DRY_RUN -eq 1 ]; then 
 +        log "[DRY RUN] Copie de $source vers $dest" 
 +        return 0 
 +    fi 
 + 
 +    # Création d'un répertoire temporaire 
 +    local temp_dir=$(mktemp -d) 
 +    chown piholesync "$temp_dir"  # Ajout de cette ligne ! 
 + 
 +    local temp_file="$temp_dir/$(basename "$dest")" 
 + 
 +    debug "Tentative de copie avec SFTP..." 
 + 
 +    # Exécution de la commande SFTP 
 +    if ! sudo -u piholesync sftp "$MIKROTIK_MASTER" <<< "get $source $temp_file"; then 
 +        log "✗ Erreur lors de la copie de $description via SFTP" 
 +        rm -rf "$temp_dir" 
 +        return 1 
 +    fi 
 + 
 +    # Vérification de la taille du fichier 
 +    local file_size=$(stat -c%s "$temp_file" 2>/dev/null || stat -f%z "$temp_file"
 +    debug "Taille du fichier temporaire: $file_size octets" 
 + 
 +    # Vérification SQLite pour gravity.db 
 +    if [[ "$source" == *"gravity.db"* ]]; then 
 +        if ! sqlite3 "$temp_file" "SELECT name FROM sqlite_master LIMIT 1" > /dev/null 2>&1; then 
 +            log "✗ Le fichier temporaire $description n'est pas une base SQLite valide" 
 +            rm -rf "$temp_dir" 
 +            return 1 
 +        fi 
 +        debug "Vérification SQLite réussie" 
 +    fi 
 + 
 +    # Déplacement du fichier vers sa destination finale 
 +    if ! mv "$temp_file" "$dest"; then 
 +        log "✗ Erreur lors du déplacement de $description vers sa destination finale" 
 +        rm -rf "$temp_dir" 
 +        return 1 
 +    fi 
 + 
 +    # Nettoyage 
 +    rm -rf "$temp_dir" 
 + 
 +    # Vérification finale 
 +    if [ ! -s "$dest" ]; then 
 +        log "✗ Le fichier $description est vide après copie" 
 +        return 1 
 +    fi 
 + 
 +    log "✓ Copie de $description réussie (taille: $file_size octets)" 
 +    return 0 
 +
 + 
 + 
 + 
 +# Fonction pour vérifier la taille d'un fichier sur le Mikrotik 
 +check_mikrotik_file_size() { 
 +    local file="$1" 
 +    local min_size="$2" 
 + 
 +    log "Vérification de la taille de $file..." 
 + 
 +    # Obtenir les informations du fichier via ssh 
 +    local file_info=$(sudo -u piholesync ssh $SSH_OPTS "$MIKROTIK_MASTER" "du -b \"$file\" 2>/dev/null || echo '0'"
 + 
 +    # Extraire la taille (premier champ de la sortie du) 
 +    local size=$(echo "$file_info" | awk '{print $1}'
 + 
 +    if [ -z "$size" ] || [ "$size" -lt "$min_size" ]; then 
 +        log "✗ Le fichier $file sur le Mikrotik est trop petit ou inexistant (${size:-0} octets < ${min_size} octets attendus)" 
 +        return 1 
 +    fi 
 + 
 +    log "✓ Taille du fichier $file sur le Mikrotik: ${size} octets" 
 +    return 0 
 +
 + 
 +# Fonction pour arrêter/démarrer/reconstruire Pi-hole 
 +manage_pihole_service() { 
 +    local host="$1" 
 +    local action="$2" 
 +    local description="$3" 
 + 
 +    log "$description sur $host..." 
 +    if [[ $host == "localhost" ]]; then 
 +        case $action in 
 +            "stop"
 +                sudo pihole -f stop 
 +                ;; 
 +            "start"
 +                sudo pihole -f start 
 +                ;; 
 +            "rebuild"
 +                sudo pihole -g 
 +                ;; 
 +        esac 
 +    else 
 +        case $action in 
 +            "stop"
 +                sudo -u piholesync ssh -t "$host" "$SUDO_OPTS pihole -f stop" 
 +                ;; 
 +            "start"
 +                sudo -u piholesync ssh -t "$host" "$SUDO_OPTS pihole -f start" 
 +                ;; 
 +            "rebuild"
 +                sudo -u piholesync ssh -t "$host" "$SUDO_OPTS pihole -g" 
 +                ;; 
 +        esac 
 +    fi 
 +
 + 
 +sync_to_ubuntu() { 
 +    local src="$1" 
 +    local dest="$2" 
 +    local host="$3" 
 +    local description="$4" 
 + 
 +    log "Synchronisation de $description vers $host..." 
 +    if [ $DRY_RUN -eq 1 ]; then 
 +        log "[DRY RUN] Synchronisation vers $host" 
 +        return 0 
 +    fi 
 + 
 +    if [[ $host == "localhost" ]]; then 
 +        # Vérification et création du répertoire 
 +        if [ ! -d "$dest" ]; then 
 +            sudo mkdir -p "$dest" 
 +        fi 
 + 
 +        # Exécution de rsync en sudo pour éviter les problèmes de permissions 
 +        sudo rsync -avz --no-perms --no-owner --no-times "$src" "$dest" || true 
 + 
 +        # Correction des permissions pour gravity.db 
 +        if [[ -f "$dest/gravity.db" && "$EUID" -eq 0 ]]; then 
 +            sudo chown pihole:pihole "$dest/gravity.db" 
 +            sudo chmod 664 "$dest/gravity.db" 
 +        fi 
 +    else 
 +        # Synchronisation distante avec rsync 
 +        sudo -u piholesync rsync -avz --no-perms --no-owner --no-times "$src" "$host:$dest/" || true 
 + 
 +        # Correction des permissions sur le serveur distant 
 +        if [[ "$dest" == *"pihole"* ]]; then 
 +            if [[ -n "$SUDO_OPTS" ]]; then 
 +                sudo -u piholesync ssh $SSH_OPTS "$host" "$SUDO_OPTS chown pihole:pihole $dest/gravity.db" 
 +                sudo -u piholesync ssh $SSH_OPTS "$host" "$SUDO_OPTS chmod 664 $dest/gravity.db" 
 +            else 
 +                log "⚠️ Impossible de changer les permissions sur $host, SUDO_OPTS est vide." 
 +            fi 
 +        fi 
 +    fi 
 +
 + 
 + 
 +sync_dnsmasq_cname() { 
 +    local cname_file="05-pihole-custom-cname.conf" 
 +    local src_path="usb1/etc/dnsmasq.d/$cname_file"  # Correction du chemin ici 
 + 
 +    log "Vérification du fichier CNAME ($cname_file)..." 
 + 
 +    # Vérifie si le fichier existe sur le Mikrotik en utilisant /file get 
 +    local check_output 
 +    check_output=$(sudo -u piholesync ssh $SSH_OPTS "$MIKROTIK_MASTER" ":put [/file/get \"$src_path\" contents]" 2>/dev/null) 
 +    debug "Résultat de la vérification: '$check_output'" 
 + 
 +    if [ -n "$check_output" ] && [[ ! "$check_output" =~ "no such item" ]]; then 
 +        log "✓ Fichier CNAME trouvé sur le Mikrotik, synchronisation..." 
 + 
 +        if [ $DRY_RUN -eq 0 ]; then 
 +            # Crée le répertoire temporaire s'il n'existe pas 
 +            mkdir -p "$TEMP_DIR/dnsmasq.d" 
 + 
 +            # Écrit le contenu directement dans le fichier temporaire 
 +            echo "$check_output" > "$TEMP_DIR/dnsmasq.d/$cname_file" 
 + 
 +            # Synchronise vers les deux serveurs Ubuntu 
 +            sync_to_ubuntu "$TEMP_DIR/dnsmasq.d/$cname_file" "/etc/dnsmasq.d/" "localhost" "fichier CNAME local" 
 +            sync_to_ubuntu "$TEMP_DIR/dnsmasq.d/$cname_file" "/etc/dnsmasq.d/" "$OTHER_UBUNTU" "fichier CNAME distant" 
 +        else 
 +            log "[DRY RUN] Le fichier CNAME serait synchronisé" 
 +        fi 
 +    else 
 +        log "! Fichier CNAME non trouvé sur le Mikrotik, suppression sur les serveurs Ubuntu..." 
 + 
 +        if [ $DRY_RUN -eq 0 ]; then 
 +            # Supprime le fichier sur les deux serveurs Ubuntu s'il existe 
 +            sudo rm -f "/etc/dnsmasq.d/$cname_file" 
 +            sudo -u piholesync ssh $SSH_OPTS "$OTHER_UBUNTU" "$SUDO_OPTS rm -f /etc/dnsmasq.d/$cname_file" 
 +        else 
 +            log "[DRY RUN] Le fichier CNAME serait supprimé des serveurs Ubuntu" 
 +        fi 
 +    fi 
 +
 + 
 +# Fonction de rotation des logs 
 +rotate_logs() { 
 +   if [ -f "$LOG_FILE" ]; then 
 +       mv "$LOG_FILE" "$LOG_FILE.$(date '+%Y%m%d')" 
 +       find "$LOG_DIR" -name "sync.log.*" -mtime +$MAX_LOGS -delete 
 +   fi 
 +
 + 
 +# Fonction pour effectuer les backups 
 +perform_backups() { 
 +   if [ $DRY_RUN -eq 0 ]; then 
 +       log "Démarrage des sauvegardes..." 
 +       backup_pihole "localhost" 
 +       backup_pihole "$OTHER_UBUNTU" 
 +   else 
 +       log "[DRY RUN] Les sauvegardes seraient effectuées ici" 
 +   fi 
 +
 + 
 +# Traitement des arguments 
 +while [[ $# -gt 0 ]]; do 
 +   case $1 in 
 +       --dry-run) 
 +           DRY_RUN=1 
 +           shift 
 +           ;; 
 +       --debug) 
 +           DEBUG=1 
 +           shift 
 +           ;; 
 +       --help) 
 +           echo "Usage: $0 [--dry-run] [--debug]" 
 +           echo "Options:" 
 +           echo "  --dry-run    Simuler la synchronisation sans l'exécuter" 
 +           echo "  --debug      Afficher les messages de debug" 
 +           exit 0 
 +           ;; 
 +       *) 
 +           echo "Option invalide: $1" 
 +           echo "Utilisez --help pour voir les options disponibles" 
 +           exit 1 
 +           ;; 
 +   esac 
 +done 
 + 
 +log "Mode: $([ $DRY_RUN -eq 1 ] && echo 'DRY RUN' || echo 'PRODUCTION')$([ $DEBUG -eq 1 ] && echo ' (DEBUG activé)')" 
 + 
 +# Rotation des logs au démarrage 
 +rotate_logs 
 + 
 +# Vérification des prérequis 
 +log "Vérification des prérequis..." 
 +check_remote_file "$MIKROTIK_MASTER" "$MIKROTIK_PIHOLE_PATH/pihole/gravity.db" "gravity.db" || exit 1 
 +check_remote_file "$MIKROTIK_MASTER" "$MIKROTIK_PIHOLE_PATH/pihole/custom.list" "custom.list" || exit 1 
 +check_remote_file "$MIKROTIK_MASTER" "$MIKROTIK_PIHOLE_PATH/pihole/local.list" "local.list" || exit 1 
 + 
 +# Vérification des droits sudo 
 +log "Vérification des droits sudo..." 
 +check_sudo "localhost" || exit 1 
 +check_sudo "$OTHER_UBUNTU" || exit 1 
 + 
 +# Effectuer les backups avant synchronisation 
 +perform_backups 
 + 
 +# Création du dossier temporaire 
 +TEMP_DIR="/tmp/pihole-sync" 
 +mkdir -p "$TEMP_DIR/pihole" 
 +mkdir -p "$TEMP_DIR/dnsmasq.d" 
 + 
 +# Synchronisation depuis le Mikrotik 
 +log "Synchronisation depuis $MIKROTIK_MASTER..." 
 + 
 +# Copie des fichiers depuis le Mikrotik 
 +mkdir -p "$TEMP_DIR/pihole" "$TEMP_DIR/dnsmasq.d" 
 + 
 +copy_from_mikrotik "usb1/etc/pihole/gravity.db" "$TEMP_DIR/pihole/gravity.db" "gravity.db" || exit 1 
 +copy_from_mikrotik "usb1/etc/pihole/custom.list" "$TEMP_DIR/pihole/custom.list" "custom.list" || exit 1 
 +copy_from_mikrotik "usb1/etc/pihole/local.list" "$TEMP_DIR/pihole/local.list" "local.list" || exit 1 
 + 
 +# Pour le dossier dnsmasq.d 
 +log "Gestion du fichier CNAME..." 
 +if [ $DRY_RUN -eq 1 ]; then 
 +    log "[DRY RUN] Vérification et synchronisation du fichier CNAME" 
 +else 
 +    sync_dnsmasq_cname || exit 1 
 +fi 
 + 
 +# Dans la partie synchronisation : 
 +if [ $DRY_RUN -eq 0 ]; then 
 +    # Arrêt des services sur les deux serveurs 
 +    manage_pihole_service "localhost" "stop" "Arrêt du service Pi-hole" 
 +    manage_pihole_service "$OTHER_UBUNTU" "stop" "Arrêt du service Pi-hole distant" 
 + 
 +    log "Synchronisation vers les serveurs Ubuntu..." 
 + 
 +    # Synchronisation locale 
 +    sync_to_ubuntu "$TEMP_DIR/pihole/" "/etc/pihole/" "localhost" "fichiers pihole locaux" || exit 1 
 +    sync_to_ubuntu "$TEMP_DIR/dnsmasq.d/" "/etc/dnsmasq.d/" "localhost" "dossier dnsmasq.d local" || exit 1 
 + 
 +    # Synchronisation vers le serveur distant 
 +    sync_to_ubuntu "$TEMP_DIR/pihole/" "/etc/pihole" "$OTHER_UBUNTU" "fichiers pihole vers $OTHER_UBUNTU" || exit 1 
 +    sync_to_ubuntu "$TEMP_DIR/dnsmasq.d/" "/etc/dnsmasq.d" "$OTHER_UBUNTU" "dossier dnsmasq.d vers $OTHER_UBUNTU" || exit 1 
 + 
 +    # Reconstruction de la base gravity sur les deux serveurs 
 +    manage_pihole_service "localhost" "rebuild" "Reconstruction de la base gravity" 
 +    manage_pihole_service "$OTHER_UBUNTU" "rebuild" "Reconstruction de la base gravity distante" 
 + 
 +    # Démarrage des services 
 +    manage_pihole_service "localhost" "start" "Démarrage du service Pi-hole" 
 +    manage_pihole_service "$OTHER_UBUNTU" "start" "Démarrage du service Pi-hole distant" 
 +fi 
 + 
 + 
 +# Nettoyage 
 +rm -rf "$TEMP_DIR" 
 +log "Script terminé avec succès!" 
 +</code> 
 +[[Category:Documentation]] 
 +[[Category:PiHole]] 
 +[[Category:Scripts]]
synchronisation_d_un_serveur_sur_deux_autres.1738626627.txt.gz · Dernière modification : de inc002