fix(yield): Check multiple DNS servers to handle propagation delays
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
This commit is contained in:
@ -29,13 +29,20 @@ class YieldDNSCheckResult:
|
|||||||
error: Optional[str]
|
error: Optional[str]
|
||||||
|
|
||||||
|
|
||||||
def _resolver() -> dns.resolver.Resolver:
|
def _resolver(nameserver: str | None = None) -> dns.resolver.Resolver:
|
||||||
|
"""Create a DNS resolver, optionally using a specific nameserver."""
|
||||||
r = dns.resolver.Resolver()
|
r = dns.resolver.Resolver()
|
||||||
|
if nameserver:
|
||||||
|
r.nameservers = [nameserver]
|
||||||
r.timeout = 3
|
r.timeout = 3
|
||||||
r.lifetime = 5
|
r.lifetime = 5
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
# Multiple public DNS servers to check (for propagation consistency)
|
||||||
|
PUBLIC_DNS_SERVERS = ['8.8.8.8', '8.8.4.4', '9.9.9.9', '1.1.1.1']
|
||||||
|
|
||||||
|
|
||||||
def _normalize_host(host: str) -> str:
|
def _normalize_host(host: str) -> str:
|
||||||
return host.rstrip(".").lower().strip()
|
return host.rstrip(".").lower().strip()
|
||||||
|
|
||||||
@ -58,6 +65,23 @@ def _resolve_a(host: str) -> list[str]:
|
|||||||
return sorted({str(rr) for rr in answers})
|
return sorted({str(rr) for rr in answers})
|
||||||
|
|
||||||
|
|
||||||
|
def _resolve_a_from_multiple_dns(host: str) -> set[str]:
|
||||||
|
"""
|
||||||
|
Resolve A records from multiple public DNS servers.
|
||||||
|
Returns the union of all IPs found (handles propagation delays).
|
||||||
|
"""
|
||||||
|
all_ips: set[str] = set()
|
||||||
|
for ns in PUBLIC_DNS_SERVERS:
|
||||||
|
try:
|
||||||
|
r = _resolver(ns)
|
||||||
|
answers = r.resolve(host, "A")
|
||||||
|
for rr in answers:
|
||||||
|
all_ips.add(str(rr))
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
return all_ips
|
||||||
|
|
||||||
|
|
||||||
def verify_yield_dns(domain: str, expected_nameservers: list[str], cname_target: str) -> YieldDNSCheckResult:
|
def verify_yield_dns(domain: str, expected_nameservers: list[str], cname_target: str) -> YieldDNSCheckResult:
|
||||||
"""
|
"""
|
||||||
Verify that a domain is connected for Yield.
|
Verify that a domain is connected for Yield.
|
||||||
@ -84,9 +108,11 @@ def verify_yield_dns(domain: str, expected_nameservers: list[str], cname_target:
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Option A: Direct A-record to our server IP (SIMPLEST!)
|
# Option A: Direct A-record to our server IP (SIMPLEST!)
|
||||||
|
# Check multiple DNS servers to handle propagation delays
|
||||||
try:
|
try:
|
||||||
actual_a = _resolve_a(domain)
|
all_ips = _resolve_a_from_multiple_dns(domain)
|
||||||
if YIELD_SERVER_IP in actual_a:
|
actual_a = sorted(all_ips)
|
||||||
|
if YIELD_SERVER_IP in all_ips:
|
||||||
return YieldDNSCheckResult(
|
return YieldDNSCheckResult(
|
||||||
verified=True,
|
verified=True,
|
||||||
method="a_record",
|
method="a_record",
|
||||||
@ -95,8 +121,6 @@ def verify_yield_dns(domain: str, expected_nameservers: list[str], cname_target:
|
|||||||
cname_ok=False,
|
cname_ok=False,
|
||||||
error=None,
|
error=None,
|
||||||
)
|
)
|
||||||
except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
|
|
||||||
pass
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return YieldDNSCheckResult(
|
return YieldDNSCheckResult(
|
||||||
verified=False,
|
verified=False,
|
||||||
|
|||||||
Reference in New Issue
Block a user