diff --git a/helm/tls-sync-wildcard/ops/scripts/sync-all-certificates.sh b/helm/tls-sync-wildcard/ops/scripts/sync-all-certificates.sh index 647fda6..aed4b43 100644 --- a/helm/tls-sync-wildcard/ops/scripts/sync-all-certificates.sh +++ b/helm/tls-sync-wildcard/ops/scripts/sync-all-certificates.sh @@ -43,10 +43,12 @@ echo "=== Synchronisation automatique des secrets TLS ===" echo "Source: $SOURCE_CLUSTER (namespace: $SOURCE_NS)" echo "" -# Fonction pour déterminer les namespaces cibles pour un certificat wildcard -# Les certificats wildcard doivent être copiés dans tous les namespaces qui les utilisent +# Fonction pour déterminer automatiquement les namespaces cibles pour un certificat wildcard +# Détecte automatiquement tous les namespaces qui référencent ce secret dans leurs Ingress/IngressRoute get_wildcard_target_namespaces() { local cert_name=$1 + local secret_name=$2 + local target_cluster=$3 local env="" # Extraire l'environnement depuis le nom du certificat @@ -60,22 +62,59 @@ get_wildcard_target_namespaces() { return 1 fi - # Liste des namespaces qui utilisent le certificat wildcard pour cet environnement - # Ajoutez ici tous les namespaces qui référencent ce secret dans leurs Ingress - case "$env" in - dev) - WILDCARD_TARGET_NAMESPACES=("headlamp-dev" "homarr-dev" "longhorn-dev") - ;; - rct) - WILDCARD_TARGET_NAMESPACES=("headlamp-rct" "homarr-rct" "longhorn-rct") - ;; - prd) - WILDCARD_TARGET_NAMESPACES=("headlamp-prd" "homarr-prd" "longhorn-prd") - ;; - *) - return 1 - ;; - esac + echo " 🔍 Détection automatique des namespaces utilisant $secret_name..." + + # Initialiser le tableau des namespaces cibles + WILDCARD_TARGET_NAMESPACES=() + + # Récupérer tous les namespaces du cluster cible + local namespaces + if [ -z "$target_cluster" ]; then + namespaces=$(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}' 2>/dev/null) + else + namespaces=$(kubectl get namespaces --context="$target_cluster" -o jsonpath='{.items[*].metadata.name}' 2>/dev/null) + fi + + if [ -z "$namespaces" ]; then + echo " ⚠️ Aucun namespace trouvé dans le cluster $target_cluster" + return 1 + fi + + # Pour chaque namespace, vérifier s'il contient des Ingress ou IngressRoute qui référencent le secret + for ns in $namespaces; do + # Ignorer les namespaces système + if [[ "$ns" =~ ^(kube-system|kube-public|kube-node-lease|default)$ ]]; then + continue + fi + + # Vérifier les Ingress (ressource standard Kubernetes) + local ingress_found=false + if [ -z "$target_cluster" ]; then + ingress_found=$(kubectl get ingress -n "$ns" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls[]?.secretName == $secret) | .metadata.name' 2>/dev/null | head -1) + else + ingress_found=$(kubectl get ingress -n "$ns" --context="$target_cluster" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls[]?.secretName == $secret) | .metadata.name' 2>/dev/null | head -1) + fi + + # Vérifier les IngressRoute (Traefik CRD) + local ingressroute_found=false + if [ -z "$target_cluster" ]; then + ingressroute_found=$(kubectl get ingressroute -n "$ns" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls.secretName == $secret) | .metadata.name' 2>/dev/null | head -1) + else + ingressroute_found=$(kubectl get ingressroute -n "$ns" --context="$target_cluster" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls.secretName == $secret) | .metadata.name' 2>/dev/null | head -1) + fi + + # Si le secret est référencé dans ce namespace, l'ajouter à la liste + if [ -n "$ingress_found" ] || [ -n "$ingressroute_found" ]; then + WILDCARD_TARGET_NAMESPACES+=("$ns") + echo " ✅ $ns (détecté via Ingress/IngressRoute)" + fi + done + + if [ ${#WILDCARD_TARGET_NAMESPACES[@]} -eq 0 ]; then + echo " ⚠️ Aucun namespace n'utilise actuellement le secret $secret_name" + echo " Le secret sera synchronisé lors de la prochaine utilisation" + return 0 # Ne pas échouer, juste avertir + fi return 0 } @@ -281,8 +320,8 @@ for i in $(seq 0 $((CERT_COUNT - 1))); do if [ "$IS_WILDCARD" = true ]; then echo " 🌐 Certificat wildcard détecté" - # Obtenir la liste des namespaces cibles - if ! get_wildcard_target_namespaces "$CERT_NAME"; then + # Obtenir la liste des namespaces cibles (détection automatique) + if ! get_wildcard_target_namespaces "$CERT_NAME" "$SECRET_NAME" "$TARGET_CLUSTER"; then echo " ⚠️ Impossible de déterminer les namespaces cibles pour le wildcard" rm -f "$TEMP_FILE" SKIP_COUNT=$((SKIP_COUNT + 1)) @@ -290,6 +329,14 @@ for i in $(seq 0 $((CERT_COUNT - 1))); do continue fi + if [ ${#WILDCARD_TARGET_NAMESPACES[@]} -eq 0 ]; then + echo " ℹ️ Aucun namespace n'utilise actuellement ce certificat" + rm -f "$TEMP_FILE" + SKIP_COUNT=$((SKIP_COUNT + 1)) + echo "" + continue + fi + echo " Destination: $TARGET_CLUSTER (namespaces: ${WILDCARD_TARGET_NAMESPACES[*]})" # Copier le secret dans chaque namespace cible diff --git a/scripts/sync-all-certificates.sh b/scripts/sync-all-certificates.sh index 647fda6..aed4b43 100644 --- a/scripts/sync-all-certificates.sh +++ b/scripts/sync-all-certificates.sh @@ -43,10 +43,12 @@ echo "=== Synchronisation automatique des secrets TLS ===" echo "Source: $SOURCE_CLUSTER (namespace: $SOURCE_NS)" echo "" -# Fonction pour déterminer les namespaces cibles pour un certificat wildcard -# Les certificats wildcard doivent être copiés dans tous les namespaces qui les utilisent +# Fonction pour déterminer automatiquement les namespaces cibles pour un certificat wildcard +# Détecte automatiquement tous les namespaces qui référencent ce secret dans leurs Ingress/IngressRoute get_wildcard_target_namespaces() { local cert_name=$1 + local secret_name=$2 + local target_cluster=$3 local env="" # Extraire l'environnement depuis le nom du certificat @@ -60,22 +62,59 @@ get_wildcard_target_namespaces() { return 1 fi - # Liste des namespaces qui utilisent le certificat wildcard pour cet environnement - # Ajoutez ici tous les namespaces qui référencent ce secret dans leurs Ingress - case "$env" in - dev) - WILDCARD_TARGET_NAMESPACES=("headlamp-dev" "homarr-dev" "longhorn-dev") - ;; - rct) - WILDCARD_TARGET_NAMESPACES=("headlamp-rct" "homarr-rct" "longhorn-rct") - ;; - prd) - WILDCARD_TARGET_NAMESPACES=("headlamp-prd" "homarr-prd" "longhorn-prd") - ;; - *) - return 1 - ;; - esac + echo " 🔍 Détection automatique des namespaces utilisant $secret_name..." + + # Initialiser le tableau des namespaces cibles + WILDCARD_TARGET_NAMESPACES=() + + # Récupérer tous les namespaces du cluster cible + local namespaces + if [ -z "$target_cluster" ]; then + namespaces=$(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}' 2>/dev/null) + else + namespaces=$(kubectl get namespaces --context="$target_cluster" -o jsonpath='{.items[*].metadata.name}' 2>/dev/null) + fi + + if [ -z "$namespaces" ]; then + echo " ⚠️ Aucun namespace trouvé dans le cluster $target_cluster" + return 1 + fi + + # Pour chaque namespace, vérifier s'il contient des Ingress ou IngressRoute qui référencent le secret + for ns in $namespaces; do + # Ignorer les namespaces système + if [[ "$ns" =~ ^(kube-system|kube-public|kube-node-lease|default)$ ]]; then + continue + fi + + # Vérifier les Ingress (ressource standard Kubernetes) + local ingress_found=false + if [ -z "$target_cluster" ]; then + ingress_found=$(kubectl get ingress -n "$ns" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls[]?.secretName == $secret) | .metadata.name' 2>/dev/null | head -1) + else + ingress_found=$(kubectl get ingress -n "$ns" --context="$target_cluster" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls[]?.secretName == $secret) | .metadata.name' 2>/dev/null | head -1) + fi + + # Vérifier les IngressRoute (Traefik CRD) + local ingressroute_found=false + if [ -z "$target_cluster" ]; then + ingressroute_found=$(kubectl get ingressroute -n "$ns" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls.secretName == $secret) | .metadata.name' 2>/dev/null | head -1) + else + ingressroute_found=$(kubectl get ingressroute -n "$ns" --context="$target_cluster" -o json 2>/dev/null | jq -r --arg secret "$secret_name" '.items[] | select(.spec.tls.secretName == $secret) | .metadata.name' 2>/dev/null | head -1) + fi + + # Si le secret est référencé dans ce namespace, l'ajouter à la liste + if [ -n "$ingress_found" ] || [ -n "$ingressroute_found" ]; then + WILDCARD_TARGET_NAMESPACES+=("$ns") + echo " ✅ $ns (détecté via Ingress/IngressRoute)" + fi + done + + if [ ${#WILDCARD_TARGET_NAMESPACES[@]} -eq 0 ]; then + echo " ⚠️ Aucun namespace n'utilise actuellement le secret $secret_name" + echo " Le secret sera synchronisé lors de la prochaine utilisation" + return 0 # Ne pas échouer, juste avertir + fi return 0 } @@ -281,8 +320,8 @@ for i in $(seq 0 $((CERT_COUNT - 1))); do if [ "$IS_WILDCARD" = true ]; then echo " 🌐 Certificat wildcard détecté" - # Obtenir la liste des namespaces cibles - if ! get_wildcard_target_namespaces "$CERT_NAME"; then + # Obtenir la liste des namespaces cibles (détection automatique) + if ! get_wildcard_target_namespaces "$CERT_NAME" "$SECRET_NAME" "$TARGET_CLUSTER"; then echo " ⚠️ Impossible de déterminer les namespaces cibles pour le wildcard" rm -f "$TEMP_FILE" SKIP_COUNT=$((SKIP_COUNT + 1)) @@ -290,6 +329,14 @@ for i in $(seq 0 $((CERT_COUNT - 1))); do continue fi + if [ ${#WILDCARD_TARGET_NAMESPACES[@]} -eq 0 ]; then + echo " ℹ️ Aucun namespace n'utilise actuellement ce certificat" + rm -f "$TEMP_FILE" + SKIP_COUNT=$((SKIP_COUNT + 1)) + echo "" + continue + fi + echo " Destination: $TARGET_CLUSTER (namespaces: ${WILDCARD_TARGET_NAMESPACES[*]})" # Copier le secret dans chaque namespace cible