33800 Docs

← 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 }