From 95ff73f6e7103ac9f110fb46df7f207583c592eb Mon Sep 17 00:00:00 2001 From: CyberMind-FR Date: Fri, 30 Jan 2026 18:17:38 +0100 Subject: [PATCH] fix(metablogizer): Fix DNS resolution parsing (127.0.0.1:53 bug) KISS approach to DNS resolution: 1. Primary: Use Google DNS API (https://dns.google/resolve) - Most reliable, bypasses local resolver issues 2. Fallback: nslookup with tail -1 to skip DNS server line 3. Fallback: host command The bug was parsing nslookup output which includes DNS server address (127.0.0.1) before the actual resolved IP. Co-Authored-By: Claude Opus 4.5 --- .../root/usr/libexec/rpcd/luci.metablogizer | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/package/secubox/luci-app-metablogizer/root/usr/libexec/rpcd/luci.metablogizer b/package/secubox/luci-app-metablogizer/root/usr/libexec/rpcd/luci.metablogizer index e62085c1..fc825ed6 100755 --- a/package/secubox/luci-app-metablogizer/root/usr/libexec/rpcd/luci.metablogizer +++ b/package/secubox/luci-app-metablogizer/root/usr/libexec/rpcd/luci.metablogizer @@ -780,16 +780,31 @@ method_get_settings() { json_dump } -# Helper: Check DNS resolution for a domain +# Helper: Check DNS resolution for a domain (KISS approach) +# Returns the resolved IP address, not the DNS server check_dns_resolution() { local domain="$1" local resolved_ip="" - if command -v nslookup >/dev/null 2>&1; then - resolved_ip=$(nslookup "$domain" 2>/dev/null | grep -A1 "Name:" | grep "Address" | head -1 | awk '{print $2}') - [ -z "$resolved_ip" ] && resolved_ip=$(nslookup "$domain" 2>/dev/null | grep "Address" | tail -1 | awk '{print $2}' | grep -v "^$") - elif command -v host >/dev/null 2>&1; then - resolved_ip=$(host "$domain" 2>/dev/null | grep "has address" | head -1 | awk '{print $4}') + + # Method 1: Use external DNS API (most reliable, avoids local resolver issues) + resolved_ip=$(wget -qO- -T 3 "https://dns.google/resolve?name=${domain}&type=A" 2>/dev/null | \ + jsonfilter -e '@.Answer[0].data' 2>/dev/null) + + # Method 2: Fallback to nslookup with careful parsing + if [ -z "$resolved_ip" ] && command -v nslookup >/dev/null 2>&1; then + # Get last Address line (skip DNS server which comes first) + resolved_ip=$(nslookup "$domain" 2>/dev/null | \ + grep "Address" | tail -1 | \ + sed 's/.*: *//' | sed 's/#.*//' | \ + grep -v '^127\.') fi + + # Method 3: Fallback to host command + if [ -z "$resolved_ip" ] && command -v host >/dev/null 2>&1; then + resolved_ip=$(host -t A "$domain" 2>/dev/null | \ + grep "has address" | head -1 | awk '{print $NF}') + fi + echo "$resolved_ip" }