← Retour
#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════════
# DNS.SH - Gestion automatique DNS via API O2switch (cPanel)
# Crée les enregistrements DNS wildcard si nécessaires
# ═══════════════════════════════════════════════════════════════════════════
# ───────────────────────────────────────────────────────────────────────────
# Configuration O2switch
# ───────────────────────────────────────────────────────────────────────────
O2SWITCH_API_URL="${O2SWITCH_API_URL:-https://yellow.o2switch.net:2083}"
O2SWITCH_USERNAME="${O2SWITCH_USERNAME:-deas8499}"
O2SWITCH_PASSWORD="${O2SWITCH_PASSWORD:-d9fx-RNEz-xfK(}"
O2SWITCH_DOMAIN="${O2SWITCH_DOMAIN:-nowhere84.com}"
PUBLIC_IP="${PUBLIC_IP:-82.65.119.221}"
DNS_TTL="${DNS_TTL:-14400}"
# ───────────────────────────────────────────────────────────────────────────
# Vérifier si un enregistrement DNS existe
# Usage: dns_record_exists "subdomain.nowhere84.com"
# ───────────────────────────────────────────────────────────────────────────
dns_record_exists() {
local fqdn="$1"
# Extraire le subdomain (sans le domaine principal)
local subdomain="${fqdn%.${O2SWITCH_DOMAIN}}"
local result=$(curl -s -u "${O2SWITCH_USERNAME}:${O2SWITCH_PASSWORD}" \
"${O2SWITCH_API_URL}/json-api/cpanel?cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=fetchzone&domain=${O2SWITCH_DOMAIN}" | \
jq -r ".cpanelresult.data[0].record[] | select(.name == \"${subdomain}.${O2SWITCH_DOMAIN}.\") | .name" 2>/dev/null)
[[ -n "$result" ]]
}
# ───────────────────────────────────────────────────────────────────────────
# Créer un enregistrement DNS A
# Usage: dns_create_record "subdomain" "ip"
# ───────────────────────────────────────────────────────────────────────────
dns_create_record() {
local subdomain="$1"
local ip="${2:-$PUBLIC_IP}"
log_info "Création DNS: ${subdomain}.${O2SWITCH_DOMAIN} → ${ip}"
local result=$(curl -s -u "${O2SWITCH_USERNAME}:${O2SWITCH_PASSWORD}" \
"${O2SWITCH_API_URL}/json-api/cpanel?cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=add_zone_record&domain=${O2SWITCH_DOMAIN}&name=${subdomain}&type=A&address=${ip}&ttl=${DNS_TTL}")
if echo "$result" | grep -q '"status":1'; then
log_success "DNS créé: ${subdomain}.${O2SWITCH_DOMAIN}"
return 0
else
local error=$(echo "$result" | jq -r '.cpanelresult.data[0].statusmsg' 2>/dev/null)
log_warning "Erreur DNS: $error"
return 1
fi
}
# ───────────────────────────────────────────────────────────────────────────
# S'assurer qu'un wildcard DNS existe
# Usage: ensure_dns_wildcard "api.33800"
# Crée *.33800.nowhere84.com si nécessaire
# ───────────────────────────────────────────────────────────────────────────
ensure_dns_wildcard() {
local domain="$1"
# Patterns supportés:
# - "api.33800" → vérifie *.33800.nowhere84.com
# - "api.33800.nowhere84.com" → vérifie *.33800.nowhere84.com
# - "myapp.86000.nowhere84.com" → vérifie *.86000.nowhere84.com
# Extraire le préfixe (33800, 86000, etc.)
local prefix=""
if [[ "$domain" =~ ^([a-z0-9-]+)\.([0-9]{5})$ ]]; then
# Format: api.33800
prefix="${BASH_REMATCH[2]}"
elif [[ "$domain" =~ ^([a-z0-9-]+)\.([0-9]{5})\.nowhere84\.com$ ]]; then
# Format: api.33800.nowhere84.com
prefix="${BASH_REMATCH[2]}"
elif [[ "$domain" =~ ^([a-z0-9-]+)\.([a-z0-9-]+)\.nowhere84\.com$ ]]; then
# Format: api.custom.nowhere84.com
prefix="${BASH_REMATCH[2]}"
else
log_warning "Format de domaine non reconnu: $domain"
return 1
fi
log_step "Vérification DNS wildcard pour *.${prefix}.${O2SWITCH_DOMAIN}..."
# Vérifier si le wildcard existe
if dns_record_exists "*.${prefix}.${O2SWITCH_DOMAIN}"; then
log_info "Wildcard DNS *.${prefix}.${O2SWITCH_DOMAIN} existe déjà"
return 0
fi
# Créer le wildcard
log_info "Création du wildcard DNS..."
# Créer *.prefix
if dns_create_record "*.${prefix}" "$PUBLIC_IP"; then
log_success "Wildcard *.${prefix}.${O2SWITCH_DOMAIN} créé"
else
log_error "Échec création wildcard"
return 1
fi
# Créer aussi l'enregistrement de base (prefix sans wildcard)
if ! dns_record_exists "${prefix}.${O2SWITCH_DOMAIN}"; then
dns_create_record "${prefix}" "$PUBLIC_IP"
fi
log_success "DNS configuré pour *.${prefix}.${O2SWITCH_DOMAIN}"
return 0
}
# ───────────────────────────────────────────────────────────────────────────
# Lister les enregistrements DNS existants
# Usage: dns_list_records
# ───────────────────────────────────────────────────────────────────────────
dns_list_records() {
local filter="${1:-}"
log_step "Récupération des enregistrements DNS..."
local records=$(curl -s -u "${O2SWITCH_USERNAME}:${O2SWITCH_PASSWORD}" \
"${O2SWITCH_API_URL}/json-api/cpanel?cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=ZoneEdit&cpanel_jsonapi_func=fetchzone&domain=${O2SWITCH_DOMAIN}" | \
jq -r '.cpanelresult.data[0].record[] | select(.type == "A") | "\(.name) → \(.address)"' 2>/dev/null)
if [[ -n "$filter" ]]; then
echo "$records" | grep -i "$filter"
else
echo "$records"
fi
}
# ───────────────────────────────────────────────────────────────────────────
# Vérifier la propagation DNS
# Usage: dns_check_propagation "api.33800.nowhere84.com"
# ───────────────────────────────────────────────────────────────────────────
dns_check_propagation() {
local fqdn="$1"
local expected_ip="${2:-$PUBLIC_IP}"
log_step "Vérification propagation DNS pour ${fqdn}..."
local resolved_ip=$(dig +short "$fqdn" 2>/dev/null | head -1)
if [[ "$resolved_ip" == "$expected_ip" ]]; then
log_success "DNS propagé: ${fqdn} → ${resolved_ip}"
return 0
elif [[ -n "$resolved_ip" ]]; then
log_warning "DNS résolu mais IP différente: ${resolved_ip} (attendu: ${expected_ip})"
return 1
else
log_warning "DNS non encore propagé pour ${fqdn}"
return 1
fi
}