UnifiDDNSWinco/ddns_update_winco.sh
walter dfed76e28e Atualizar ddns_update_winco.sh
Melhorias e correção de bugs!
2025-06-07 16:20:00 +00:00

125 lines
3.6 KiB
Bash

#!/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