Configuration en variables + tests unitaires BATS

- Conversion config hardcodée en variables (CLUSTER_NODES)
- Détection nœud distant data-driven (extensible à 3+ nœuds)
- Tests unitaires BATS avec mocks complets (32 tests)
- CI/CD Forgejo avec shellcheck et validation syntaxe
- Mode test pour sourcing sans exécution du main
This commit is contained in:
Tellsanguis 2025-12-29 12:29:46 +01:00
parent de4b630399
commit dfa5078b47
8 changed files with 908 additions and 15 deletions

View file

@ -1,7 +1,7 @@
#!/bin/bash
#
# Script de réplication ZFS automatique pour NFS HA (Multi-pools)
# À déployer sur acemagician et elitedesk
# À déployer sur tous les nœuds de production du cluster Proxmox
#
# Ce script version 2.1 :
# - Supporte la réplication de plusieurs pools ZFS simultanément
@ -30,6 +30,7 @@ SCRIPT_URL="${REPO_URL}/raw/branch/main/zfs-nfs-replica.sh"
SCRIPT_PATH="${BASH_SOURCE[0]}"
AUTO_UPDATE_ENABLED=true # Mettre à false pour désactiver l'auto-update
# Configuration du container LXC
CTID=103
CONTAINER_NAME="nfs-server"
@ -37,6 +38,14 @@ CONTAINER_NAME="nfs-server"
# Ajouter ou retirer des pools selon vos besoins
ZPOOLS=("zpool1" "zpool2")
# Configuration des nœuds du cluster
# Format: NODE_NAME:IP_ADDRESS
# Ajouter tous les nœuds de production du cluster
declare -A CLUSTER_NODES=(
["acemagician"]="192.168.100.10"
["elitedesk"]="192.168.100.20"
)
CHECK_DELAY=2 # Délai entre chaque vérification (secondes)
LOG_FACILITY="local0"
SSH_KEY="/root/.ssh/id_ed25519_zfs_replication"
@ -1219,6 +1228,11 @@ replicate_pool() {
# SCRIPT PRINCIPAL
################################################################################
# Ne pas exécuter le script principal si on est en mode test BATS
if [[ "${BATS_TEST_MODE:-false}" == "true" ]]; then
return 0 2>/dev/null || exit 0
fi
# Initialiser le système de logs
init_logging
@ -1253,20 +1267,29 @@ elif [[ "${NOTIFICATION_ENABLED}" == "true" ]] && [[ -z "${APPRISE_URLS}" ]]; th
fi
# Déterminer le nœud distant et son IP
case "$LOCAL_NODE" in
"acemagician")
REMOTE_NODE_NAME="elitedesk"
REMOTE_NODE_IP="192.168.100.20"
;;
"elitedesk")
REMOTE_NODE_NAME="acemagician"
REMOTE_NODE_IP="192.168.100.10"
;;
*)
log "error" "Nœud inconnu: ${LOCAL_NODE}. Ce script doit s'exécuter sur acemagician ou elitedesk."
exit 1
;;
esac
# Vérifier que le nœud local est dans la configuration
if [[ ! -v "CLUSTER_NODES[$LOCAL_NODE]" ]]; then
local valid_nodes="${!CLUSTER_NODES[@]}"
log "error" "Nœud inconnu: ${LOCAL_NODE}. Nœuds valides: ${valid_nodes}"
exit 1
fi
# Trouver le nœud distant (le premier nœud différent du local)
REMOTE_NODE_NAME=""
REMOTE_NODE_IP=""
for node in "${!CLUSTER_NODES[@]}"; do
if [[ "$node" != "$LOCAL_NODE" ]]; then
REMOTE_NODE_NAME="$node"
REMOTE_NODE_IP="${CLUSTER_NODES[$node]}"
break
fi
done
# Vérifier qu'un nœud distant a été trouvé
if [[ -z "$REMOTE_NODE_NAME" ]]; then
log "error" "Aucun nœud distant trouvé dans CLUSTER_NODES. Vérifier la configuration."
exit 1
fi
log "info" "Nœud distant configuré: ${REMOTE_NODE_NAME} (${REMOTE_NODE_IP})"
log "info" "Pools configurés: ${ZPOOLS[*]}"