synchronisation_d_un_serveur_sur_deux_autres
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédente | |||
| synchronisation_d_un_serveur_sur_deux_autres [2025/02/03 23:54] – inc002 | synchronisation_d_un_serveur_sur_deux_autres [2025/02/04 00:02] (Version actuelle) – inc002 | ||
|---|---|---|---|
| Ligne 124: | Ligne 124: | ||
| * Test de recovery complet | * Test de recovery complet | ||
| + | <code " | ||
| + | #!/bin/bash | ||
| + | # Variables de configuration | ||
| + | MIKROTIK_MASTER=" | ||
| + | LOCAL_HOST=" | ||
| + | OTHER_UBUNTU=" | ||
| + | DRY_RUN=0 | ||
| + | DEBUG=0 | ||
| + | |||
| + | # SSH Options | ||
| + | SSH_OPTS=" | ||
| + | SUDO_OPTS=" | ||
| + | |||
| + | # Chemins sur le Mikrotik (master) | ||
| + | MIKROTIK_PIHOLE_PATH="/ | ||
| + | MIKROTIK_DNSMASQ_PATH="/ | ||
| + | |||
| + | # Chemins de logs et backups | ||
| + | LOG_DIR="/ | ||
| + | LOG_FILE=" | ||
| + | BACKUP_DIR="/ | ||
| + | MAX_LOGS=7 | ||
| + | |||
| + | # Liste des fichiers à exclure | ||
| + | EXCLUDE_LIST=( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | # Fonction pour construire les options rsync | ||
| + | build_rsync_opts() { | ||
| + | local target=" | ||
| + | local opts=" | ||
| + | |||
| + | # Ajouter les exclusions | ||
| + | for item in " | ||
| + | opts+=" | ||
| + | done | ||
| + | |||
| + | # Ajouter --dry-run si nécessaire | ||
| + | [ $DRY_RUN -eq 1 ] && opts+=" | ||
| + | |||
| + | # Option spéciale pour Mikrotik | ||
| + | if [[ $target == *" | ||
| + | opts+=" | ||
| + | fi | ||
| + | |||
| + | echo " | ||
| + | } | ||
| + | |||
| + | # Fonction de debug | ||
| + | debug() { | ||
| + | if [ $DEBUG -eq 1 ]; then | ||
| + | echo " | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # Fonction de logging | ||
| + | log() { | ||
| + | local message=" | ||
| + | local timestamp=$(date ' | ||
| + | echo " | ||
| + | if [ -w " | ||
| + | echo " | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # Fonction de rotation des logs | ||
| + | rotate_logs() { | ||
| + | if [ -f " | ||
| + | mv " | ||
| + | find " | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # Fonction de vérification des droits sudo | ||
| + | check_sudo() { | ||
| + | local host=" | ||
| + | log " | ||
| + | |||
| + | if [[ $host == " | ||
| + | # Test local | ||
| + | log "Test des permissions rsync..." | ||
| + | if $SUDO_OPTS rsync --version >/ | ||
| + | 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 >/ | ||
| + | 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 " | ||
| + | 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 " | ||
| + | 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=" | ||
| + | local backup_date=$(date ' | ||
| + | local backup_path=" | ||
| + | local rsync_opts=$(build_rsync_opts " | ||
| + | |||
| + | log " | ||
| + | |||
| + | # Création des répertoires avec les bonnes permissions | ||
| + | if ! sudo mkdir -p " | ||
| + | log " | ||
| + | return 1 | ||
| + | fi | ||
| + | |||
| + | # Attribution des permissions à piholesync | ||
| + | if ! sudo chown -R piholesync: | ||
| + | log " | ||
| + | return 1 | ||
| + | fi | ||
| + | |||
| + | if [[ $host == " | ||
| + | if ! sudo -u piholesync rsync $rsync_opts / | ||
| + | log " | ||
| + | return 1 | ||
| + | fi | ||
| + | if ! sudo -u piholesync rsync $rsync_opts / | ||
| + | log " | ||
| + | return 1 | ||
| + | fi | ||
| + | else | ||
| + | if ! sudo -u piholesync rsync $rsync_opts -e "ssh $SSH_OPTS" | ||
| + | log " | ||
| + | return 1 | ||
| + | fi | ||
| + | if ! sudo -u piholesync rsync $rsync_opts -e "ssh $SSH_OPTS" | ||
| + | log " | ||
| + | return 1 | ||
| + | fi | ||
| + | fi | ||
| + | |||
| + | log " | ||
| + | return 0 | ||
| + | } | ||
| + | # Fonction pour vérifier l' | ||
| + | # Fonction pour vérifier l' | ||
| + | check_remote_file() { | ||
| + | local host=" | ||
| + | local file=" | ||
| + | local description=" | ||
| + | |||
| + | log " | ||
| + | if [[ $host == *" | ||
| + | # Cas spécial pour Mikrotik | ||
| + | local mikrotik_path=${file#/ | ||
| + | local cmd="/ | ||
| + | |||
| + | debug " | ||
| + | debug " | ||
| + | debug " | ||
| + | |||
| + | local output=$(sudo -u piholesync ssh $SSH_OPTS " | ||
| + | debug " | ||
| + | debug " | ||
| + | |||
| + | if echo " | ||
| + | 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 " | ||
| + | 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=" | ||
| + | local dest=" | ||
| + | local description=" | ||
| + | |||
| + | 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 " | ||
| + | |||
| + | local temp_file=" | ||
| + | |||
| + | debug " | ||
| + | |||
| + | # Exécution de la commande SFTP | ||
| + | if ! sudo -u piholesync sftp " | ||
| + | log "✗ Erreur lors de la copie de $description via SFTP" | ||
| + | rm -rf " | ||
| + | return 1 | ||
| + | fi | ||
| + | |||
| + | # Vérification de la taille du fichier | ||
| + | local file_size=$(stat -c%s " | ||
| + | debug " | ||
| + | |||
| + | # Vérification SQLite pour gravity.db | ||
| + | if [[ " | ||
| + | if ! sqlite3 " | ||
| + | log "✗ Le fichier temporaire $description n'est pas une base SQLite valide" | ||
| + | rm -rf " | ||
| + | return 1 | ||
| + | fi | ||
| + | debug " | ||
| + | fi | ||
| + | |||
| + | # Déplacement du fichier vers sa destination finale | ||
| + | if ! mv " | ||
| + | log "✗ Erreur lors du déplacement de $description vers sa destination finale" | ||
| + | rm -rf " | ||
| + | return 1 | ||
| + | fi | ||
| + | |||
| + | # Nettoyage | ||
| + | rm -rf " | ||
| + | |||
| + | # Vérification finale | ||
| + | if [ ! -s " | ||
| + | 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=" | ||
| + | local min_size=" | ||
| + | |||
| + | log " | ||
| + | |||
| + | # Obtenir les informations du fichier via ssh | ||
| + | local file_info=$(sudo -u piholesync ssh $SSH_OPTS " | ||
| + | |||
| + | # Extraire la taille (premier champ de la sortie du) | ||
| + | local size=$(echo " | ||
| + | |||
| + | if [ -z " | ||
| + | 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/ | ||
| + | manage_pihole_service() { | ||
| + | local host=" | ||
| + | local action=" | ||
| + | local description=" | ||
| + | |||
| + | log " | ||
| + | if [[ $host == " | ||
| + | case $action in | ||
| + | " | ||
| + | sudo pihole -f stop | ||
| + | ;; | ||
| + | " | ||
| + | sudo pihole -f start | ||
| + | ;; | ||
| + | " | ||
| + | sudo pihole -g | ||
| + | ;; | ||
| + | esac | ||
| + | else | ||
| + | case $action in | ||
| + | " | ||
| + | sudo -u piholesync ssh -t " | ||
| + | ;; | ||
| + | " | ||
| + | sudo -u piholesync ssh -t " | ||
| + | ;; | ||
| + | " | ||
| + | sudo -u piholesync ssh -t " | ||
| + | ;; | ||
| + | esac | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | sync_to_ubuntu() { | ||
| + | local src=" | ||
| + | local dest=" | ||
| + | local host=" | ||
| + | local description=" | ||
| + | |||
| + | log " | ||
| + | if [ $DRY_RUN -eq 1 ]; then | ||
| + | log "[DRY RUN] Synchronisation vers $host" | ||
| + | return 0 | ||
| + | fi | ||
| + | |||
| + | if [[ $host == " | ||
| + | # Vérification et création du répertoire | ||
| + | if [ ! -d " | ||
| + | sudo mkdir -p " | ||
| + | fi | ||
| + | |||
| + | # Exécution de rsync en sudo pour éviter les problèmes de permissions | ||
| + | sudo rsync -avz --no-perms --no-owner --no-times " | ||
| + | |||
| + | # Correction des permissions pour gravity.db | ||
| + | if [[ -f " | ||
| + | sudo chown pihole: | ||
| + | sudo chmod 664 " | ||
| + | fi | ||
| + | else | ||
| + | # Synchronisation distante avec rsync | ||
| + | sudo -u piholesync rsync -avz --no-perms --no-owner --no-times " | ||
| + | |||
| + | # Correction des permissions sur le serveur distant | ||
| + | if [[ " | ||
| + | if [[ -n " | ||
| + | sudo -u piholesync ssh $SSH_OPTS " | ||
| + | sudo -u piholesync ssh $SSH_OPTS " | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| + | fi | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | |||
| + | sync_dnsmasq_cname() { | ||
| + | local cname_file=" | ||
| + | local src_path=" | ||
| + | |||
| + | log " | ||
| + | |||
| + | # Vérifie si le fichier existe sur le Mikrotik en utilisant /file get | ||
| + | local check_output | ||
| + | check_output=$(sudo -u piholesync ssh $SSH_OPTS " | ||
| + | debug " | ||
| + | |||
| + | if [ -n " | ||
| + | log "✓ Fichier CNAME trouvé sur le Mikrotik, synchronisation..." | ||
| + | |||
| + | if [ $DRY_RUN -eq 0 ]; then | ||
| + | # Crée le répertoire temporaire s'il n' | ||
| + | mkdir -p " | ||
| + | |||
| + | # Écrit le contenu directement dans le fichier temporaire | ||
| + | echo " | ||
| + | |||
| + | # Synchronise vers les deux serveurs Ubuntu | ||
| + | sync_to_ubuntu " | ||
| + | sync_to_ubuntu " | ||
| + | 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 "/ | ||
| + | sudo -u piholesync ssh $SSH_OPTS " | ||
| + | else | ||
| + | log "[DRY RUN] Le fichier CNAME serait supprimé des serveurs Ubuntu" | ||
| + | fi | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # Fonction de rotation des logs | ||
| + | rotate_logs() { | ||
| + | if [ -f " | ||
| + | mv " | ||
| + | find " | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # Fonction pour effectuer les backups | ||
| + | perform_backups() { | ||
| + | if [ $DRY_RUN -eq 0 ]; then | ||
| + | log " | ||
| + | | ||
| + | | ||
| + | else | ||
| + | log "[DRY RUN] Les sauvegardes seraient effectuées ici" | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # Traitement des arguments | ||
| + | while [[ $# -gt 0 ]]; do | ||
| + | case $1 in | ||
| + | | ||
| + | | ||
| + | shift | ||
| + | ;; | ||
| + | | ||
| + | | ||
| + | shift | ||
| + | ;; | ||
| + | | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 0 | ||
| + | ;; | ||
| + | *) | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | ;; | ||
| + | esac | ||
| + | done | ||
| + | |||
| + | log "Mode: $([ $DRY_RUN -eq 1 ] && echo 'DRY RUN' || echo ' | ||
| + | |||
| + | # Rotation des logs au démarrage | ||
| + | rotate_logs | ||
| + | |||
| + | # Vérification des prérequis | ||
| + | log " | ||
| + | check_remote_file " | ||
| + | check_remote_file " | ||
| + | check_remote_file " | ||
| + | |||
| + | # Vérification des droits sudo | ||
| + | log " | ||
| + | check_sudo " | ||
| + | check_sudo " | ||
| + | |||
| + | # Effectuer les backups avant synchronisation | ||
| + | perform_backups | ||
| + | |||
| + | # Création du dossier temporaire | ||
| + | TEMP_DIR="/ | ||
| + | mkdir -p " | ||
| + | mkdir -p " | ||
| + | |||
| + | # Synchronisation depuis le Mikrotik | ||
| + | log " | ||
| + | |||
| + | # Copie des fichiers depuis le Mikrotik | ||
| + | mkdir -p " | ||
| + | |||
| + | copy_from_mikrotik " | ||
| + | copy_from_mikrotik " | ||
| + | copy_from_mikrotik " | ||
| + | |||
| + | # Pour le dossier dnsmasq.d | ||
| + | log " | ||
| + | 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 " | ||
| + | manage_pihole_service " | ||
| + | |||
| + | log " | ||
| + | |||
| + | # Synchronisation locale | ||
| + | sync_to_ubuntu " | ||
| + | sync_to_ubuntu " | ||
| + | |||
| + | # Synchronisation vers le serveur distant | ||
| + | sync_to_ubuntu " | ||
| + | sync_to_ubuntu " | ||
| + | |||
| + | # Reconstruction de la base gravity sur les deux serveurs | ||
| + | manage_pihole_service " | ||
| + | manage_pihole_service " | ||
| + | |||
| + | # Démarrage des services | ||
| + | manage_pihole_service " | ||
| + | manage_pihole_service " | ||
| + | fi | ||
| + | |||
| + | |||
| + | # Nettoyage | ||
| + | rm -rf " | ||
| + | log " | ||
| + | </ | ||
| [[Category: | [[Category: | ||
| [[Category: | [[Category: | ||
| [[Category: | [[Category: | ||
synchronisation_d_un_serveur_sur_deux_autres.txt · Dernière modification : de inc002
