#!/bin/bash # Configurações LOG_FILE="/tmp/ddns_update.log" DDNS_URL="http://members.ddns.com.br/nic/update" # Array associativo com hostname e suas credenciais reais DDNS_CONFIGS=( "virtux1.ddns.com.br:virtux1.ddns.com.br:c6aa8858d0" ) # Interfaces em ordem de prioridade para DETECTAR E USAR na atualização DDNS INTERFACES_ORDERED=("eth8" "eth6" "eth7") # Função para log log_message() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE" } # Função para obter IP público usando interface get_public_ip_from_interface() { local iface="$1" ip=$(curl -s --interface "$iface" https://ifconfig.me || curl -s --interface "$iface" https://icanhazip.com) # Valida se é IP válido if [[ "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "$ip" return 0 else return 1 fi } # Função para extrair partes da config parse_config() { local config="$1" local field="$2" local hostname=$(echo "$config" | cut -d':' -f1) local username=$(echo "$config" | cut -d':' -f2) local password=$(echo "$config" | cut -d':' -f3-) case "$field" in "hostname") echo "$hostname" ;; "username") echo "$username" ;; "password") echo "$password" ;; esac } # Atualiza DDNS usando IP e interface de envio update_ddns() { local current_ip="$1" local config="$2" local iface="$3" local hostname=$(parse_config "$config" "hostname") local username=$(parse_config "$config" "username") local password=$(parse_config "$config" "password") local update_url="${DDNS_URL}?hostname=${hostname}&myip=${current_ip}" log_message "Atualizando DDNS para $hostname com IP: $current_ip (usuário: $username) via interface $iface" response=$(curl -s --interface "$iface" \ --connect-timeout 15 --max-time 30 \ --user "$username:$password" \ "$update_url") local curl_exit_code=$? if [ $curl_exit_code -eq 0 ] && [[ "$response" == *"good"* || "$response" == *"nochg"* ]]; then log_message "SUCESSO: $hostname atualizado com IP $current_ip. Resposta: $response" return 0 else log_message "FALHA: Falha ao atualizar $hostname. Código: $curl_exit_code, Resposta: $response" return 1 fi } # Função principal main() { log_message "=== Iniciando verificação de IP público ===" if [ ${#DDNS_CONFIGS[@]} -eq 0 ]; then log_message "ERRO: Nenhuma configuração definida no array DDNS_CONFIGS" exit 1 fi # Obtém IP de forma prioritária e determina a interface que será usada current_ip="" used_interface="" for iface in "${INTERFACES_ORDERED[@]}"; do ip=$(get_public_ip_from_interface "$iface") if [ $? -eq 0 ]; then current_ip="$ip" used_interface="$iface" log_message "IP público encontrado através da interface $iface: $current_ip" break else log_message "Interface $iface não retornou IP válido. Tentando próxima..." fi done if [ -z "$current_ip" ]; then log_message "ERRO: Nenhum IP público pôde ser determinado pelas interfaces especificadas." exit 1 fi success_count=0 fail_count=0 for config in "${DDNS_CONFIGS[@]}"; do if update_ddns "$current_ip" "$config" "$used_interface"; then ((success_count++)) else ((fail_count++)) fi sleep 2 done log_message "=== Resumo: $success_count sucesso(s), $fail_count falha(s) ===" log_message "=== Processo concluído ===" } main