#!/bin/bash # Configurações # Lista de hostnames para atualizar (adicione quantos precisar) HOSTNAMES=( "subdominio1.ddns.com.br" "subdominio2.ddns.com.br" "subdominio3.ddns.com.br" # Adicione mais conforme necessário ) DDNS_URL="http://members.ddns.com.br/nic/update" LOG_FILE="/tmp/ddns_update.log" IP_CACHE_FILE="/tmp/last_ip.txt" # 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 get_public_ip() { local ip="" # Lista de serviços para verificar IP público (em ordem de preferência) local services=( "https://ifconfig.me/ip" "https://api.ipify.org" "https://ipecho.net/plain" "https://icanhazip.com" "https://ident.me" ) for service in "${services[@]}"; do ip=$(curl -s --connect-timeout 10 --max-time 15 "$service" | tr -d '\n\r ') # Verifica se o IP é válido (formato IPv4) if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then echo "$ip" return 0 fi done return 1 } # Função para atualizar DDNS update_ddns() { local current_ip="$1" local hostname="$2" local update_url="${DDNS_URL}?hostname=${hostname}&myip=${current_ip}" log_message "Atualizando DDNS para $hostname com IP: $current_ip" # Faz a requisição de atualização local response=$(curl -s --connect-timeout 15 --max-time 30 "$update_url") local curl_exit_code=$? if [ $curl_exit_code -eq 0 ]; then log_message "✓ $hostname atualizado com sucesso. Resposta: $response" return 0 else log_message "✗ Erro ao atualizar $hostname (curl exit code: $curl_exit_code)" return 1 fi } # Função principal main() { log_message "=== Iniciando verificação de IP público ===" # Verifica se há hostnames configurados if [ ${#HOSTNAMES[@]} -eq 0 ]; then log_message "ERRO: Nenhum hostname configurado na lista HOSTNAMES" exit 1 fi log_message "Hostnames configurados: ${HOSTNAMES[*]}" # Obtém o IP público atual current_ip=$(get_public_ip) if [ -z "$current_ip" ]; then log_message "ERRO: Não foi possível obter o IP público" exit 1 fi log_message "IP público detectado: $current_ip" # Verifica se existe cache do último IP if [ -f "$IP_CACHE_FILE" ]; then last_ip=$(cat "$IP_CACHE_FILE" 2>/dev/null) if [ "$current_ip" = "$last_ip" ]; then log_message "IP não mudou ($current_ip), não é necessário atualizar" exit 0 else log_message "IP mudou de $last_ip para $current_ip" fi else log_message "Primeira execução ou cache não encontrado" fi # Contador de sucessos/falhas local success_count=0 local fail_count=0 # Atualiza cada hostname log_message "--- Iniciando atualizações ---" for hostname in "${HOSTNAMES[@]}"; do if update_ddns "$current_ip" "$hostname"; then ((success_count++)) else ((fail_count++)) fi # Pequena pausa entre as requisições para não sobrecarregar o servidor sleep 2 done # Salva o IP no cache apenas se pelo menos uma atualização foi bem-sucedida if [ $success_count -gt 0 ]; then echo "$current_ip" > "$IP_CACHE_FILE" log_message "=== Resumo: $success_count sucessos, $fail_count falhas ===" log_message "IP $current_ip salvo no cache" else log_message "=== ERRO: Todas as atualizações falharam! ===" exit 1 fi log_message "=== Processo concluído ===" } # Executa o script principal main "$@"