Atualizar ddns_update_winco.sh
Melhorias e correção de bugs!
This commit is contained in:
parent
15825fb0d0
commit
dfed76e28e
@ -1,60 +1,45 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Configurações
|
# Configurações
|
||||||
# Array associativo com hostname e suas credenciais
|
|
||||||
# Formato: "hostname:usuario:senha"
|
|
||||||
DDNS_CONFIGS=(
|
|
||||||
"subdominio1.ddns.com.br:usuario1:senha1"
|
|
||||||
"subdominio2.ddns.com.br:usuario2:senha2"
|
|
||||||
"subdominio3.ddns.com.br:usuario3:senha3"
|
|
||||||
# Adicione mais conforme necessário
|
|
||||||
# "meudominio.ddns.com.br:meuusuario:minhasenha"
|
|
||||||
)
|
|
||||||
DDNS_URL="http://members.ddns.com.br/nic/update"
|
|
||||||
LOG_FILE="/tmp/ddns_update.log"
|
LOG_FILE="/tmp/ddns_update.log"
|
||||||
IP_CACHE_FILE="/tmp/last_ip.txt"
|
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
|
# Função para log
|
||||||
log_message() {
|
log_message() {
|
||||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
|
echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Função para obter IP público
|
# Função para obter IP público usando interface
|
||||||
get_public_ip() {
|
get_public_ip_from_interface() {
|
||||||
local ip=""
|
local iface="$1"
|
||||||
|
ip=$(curl -s --interface "$iface" https://ifconfig.me || curl -s --interface "$iface" https://icanhazip.com)
|
||||||
# Lista de serviços para verificar IP público (em ordem de preferência)
|
|
||||||
local services=(
|
# Valida se é IP válido
|
||||||
"https://ifconfig.me/ip"
|
if [[ "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
"https://api.ipify.org"
|
echo "$ip"
|
||||||
"https://ipecho.net/plain"
|
return 0
|
||||||
"https://icanhazip.com"
|
else
|
||||||
"https://ident.me"
|
return 1
|
||||||
)
|
fi
|
||||||
|
|
||||||
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 extrair dados da configuração
|
# Função para extrair partes da config
|
||||||
parse_config() {
|
parse_config() {
|
||||||
local config="$1"
|
local config="$1"
|
||||||
local field="$2"
|
local field="$2"
|
||||||
|
|
||||||
# Separa hostname:usuario:senha
|
|
||||||
local hostname=$(echo "$config" | cut -d':' -f1)
|
local hostname=$(echo "$config" | cut -d':' -f1)
|
||||||
local username=$(echo "$config" | cut -d':' -f2)
|
local username=$(echo "$config" | cut -d':' -f2)
|
||||||
local password=$(echo "$config" | cut -d':' -f3-)
|
local password=$(echo "$config" | cut -d':' -f3-)
|
||||||
|
|
||||||
case "$field" in
|
case "$field" in
|
||||||
"hostname") echo "$hostname" ;;
|
"hostname") echo "$hostname" ;;
|
||||||
"username") echo "$username" ;;
|
"username") echo "$username" ;;
|
||||||
@ -62,30 +47,31 @@ parse_config() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
# Função para atualizar DDNS
|
# Atualiza DDNS usando IP e interface de envio
|
||||||
update_ddns() {
|
update_ddns() {
|
||||||
local current_ip="$1"
|
local current_ip="$1"
|
||||||
local config="$2"
|
local config="$2"
|
||||||
|
local iface="$3"
|
||||||
|
|
||||||
local hostname=$(parse_config "$config" "hostname")
|
local hostname=$(parse_config "$config" "hostname")
|
||||||
local username=$(parse_config "$config" "username")
|
local username=$(parse_config "$config" "username")
|
||||||
local password=$(parse_config "$config" "password")
|
local password=$(parse_config "$config" "password")
|
||||||
|
|
||||||
local update_url="${DDNS_URL}?hostname=${hostname}&myip=${current_ip}"
|
local update_url="${DDNS_URL}?hostname=${hostname}&myip=${current_ip}"
|
||||||
|
|
||||||
log_message "Atualizando DDNS para $hostname com IP: $current_ip (usuário: $username)"
|
log_message "Atualizando DDNS para $hostname com IP: $current_ip (usuário: $username) via interface $iface"
|
||||||
|
|
||||||
# Faz a requisição de atualização com autenticação HTTP Basic
|
response=$(curl -s --interface "$iface" \
|
||||||
local response=$(curl -s --connect-timeout 15 --max-time 30 \
|
--connect-timeout 15 --max-time 30 \
|
||||||
--user "${username}:${password}" \
|
--user "$username:$password" \
|
||||||
"$update_url")
|
"$update_url")
|
||||||
local curl_exit_code=$?
|
local curl_exit_code=$?
|
||||||
|
|
||||||
if [ $curl_exit_code -eq 0 ]; then
|
if [ $curl_exit_code -eq 0 ] && [[ "$response" == *"good"* || "$response" == *"nochg"* ]]; then
|
||||||
log_message "✓ $hostname atualizado com sucesso. Resposta: $response"
|
log_message "SUCESSO: $hostname atualizado com IP $current_ip. Resposta: $response"
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
log_message "✗ Erro ao atualizar $hostname (curl exit code: $curl_exit_code)"
|
log_message "FALHA: Falha ao atualizar $hostname. Código: $curl_exit_code, Resposta: $response"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -93,87 +79,46 @@ update_ddns() {
|
|||||||
# Função principal
|
# Função principal
|
||||||
main() {
|
main() {
|
||||||
log_message "=== Iniciando verificação de IP público ==="
|
log_message "=== Iniciando verificação de IP público ==="
|
||||||
|
|
||||||
# Verifica se há configurações
|
|
||||||
if [ ${#DDNS_CONFIGS[@]} -eq 0 ]; then
|
if [ ${#DDNS_CONFIGS[@]} -eq 0 ]; then
|
||||||
log_message "ERRO: Nenhuma configuração definida no array DDNS_CONFIGS"
|
log_message "ERRO: Nenhuma configuração definida no array DDNS_CONFIGS"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Valida se as configurações não são os exemplos padrão
|
# Obtém IP de forma prioritária e determina a interface que será usada
|
||||||
local has_default=false
|
current_ip=""
|
||||||
for config in "${DDNS_CONFIGS[@]}"; do
|
used_interface=""
|
||||||
if [[ "$config" =~ ^subdominio[123]\.ddns\.com\.br:usuario[123]:senha[123]$ ]]; then
|
for iface in "${INTERFACES_ORDERED[@]}"; do
|
||||||
has_default=true
|
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
|
break
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$has_default" = true ]; then
|
|
||||||
log_message "ERRO: Configurações padrão detectadas! Configure seus domínios e credenciais reais"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Lista os domínios configurados
|
|
||||||
local hostnames=()
|
|
||||||
for config in "${DDNS_CONFIGS[@]}"; do
|
|
||||||
hostnames+=($(parse_config "$config" "hostname"))
|
|
||||||
done
|
|
||||||
log_message "Domínios 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
|
else
|
||||||
log_message "IP mudou de $last_ip para $current_ip"
|
log_message "Interface $iface não retornou IP válido. Tentando próxima..."
|
||||||
fi
|
fi
|
||||||
else
|
done
|
||||||
log_message "Primeira execução ou cache não encontrado"
|
|
||||||
|
if [ -z "$current_ip" ]; then
|
||||||
|
log_message "ERRO: Nenhum IP público pôde ser determinado pelas interfaces especificadas."
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Contador de sucessos/falhas
|
success_count=0
|
||||||
local success_count=0
|
fail_count=0
|
||||||
local fail_count=0
|
|
||||||
|
|
||||||
# Atualiza cada domínio com suas credenciais
|
|
||||||
log_message "--- Iniciando atualizações ---"
|
|
||||||
for config in "${DDNS_CONFIGS[@]}"; do
|
for config in "${DDNS_CONFIGS[@]}"; do
|
||||||
if update_ddns "$current_ip" "$config"; then
|
if update_ddns "$current_ip" "$config" "$used_interface"; then
|
||||||
((success_count++))
|
((success_count++))
|
||||||
else
|
else
|
||||||
((fail_count++))
|
((fail_count++))
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Pequena pausa entre as requisições para não sobrecarregar o servidor
|
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
|
|
||||||
# Salva o IP no cache apenas se pelo menos uma atualização foi bem-sucedida
|
log_message "=== Resumo: $success_count sucesso(s), $fail_count falha(s) ==="
|
||||||
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 ==="
|
log_message "=== Processo concluído ==="
|
||||||
}
|
}
|
||||||
|
|
||||||
# Executa o script principal
|
main
|
||||||
main "$@"
|
|
||||||
|
Loading…
Reference in New Issue
Block a user