From dfa652bb0d1a7a4512df17446a24b76334d8db4c Mon Sep 17 00:00:00 2001 From: walter Date: Fri, 6 Jun 2025 13:29:56 +0000 Subject: [PATCH] ddns_update.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Está comentado! --- ddns_update_winco.sh | 134 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 ddns_update_winco.sh diff --git a/ddns_update_winco.sh b/ddns_update_winco.sh new file mode 100644 index 0000000..a0702d1 --- /dev/null +++ b/ddns_update_winco.sh @@ -0,0 +1,134 @@ +#!/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 "$@" \ No newline at end of file