1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
| # dns_monitor.py
import dns.resolver
from typing import List, Dict
import time
def check_dns_resolution(hostname: str, expected_ips: List[str] = None,
nameservers: List[str] = None) -> Dict:
"""Check DNS resolution for a hostname."""
resolver = dns.resolver.Resolver()
if nameservers:
resolver.nameservers = nameservers
start = time.time()
try:
answers = resolver.resolve(hostname, 'A')
duration = time.time() - start
resolved_ips = [str(rdata) for rdata in answers]
result = {
'hostname': hostname,
'resolved': True,
'ips': resolved_ips,
'ttl': answers.ttl,
'duration_ms': round(duration * 1000, 2),
'nameserver': resolver.nameservers[0] if resolver.nameservers else 'default'
}
if expected_ips:
result['expected_ips'] = expected_ips
result['matches'] = set(resolved_ips) == set(expected_ips)
return result
except dns.resolver.NXDOMAIN:
return {'hostname': hostname, 'resolved': False, 'error': 'NXDOMAIN'}
except dns.resolver.NoAnswer:
return {'hostname': hostname, 'resolved': False, 'error': 'NoAnswer'}
except Exception as e:
return {'hostname': hostname, 'resolved': False, 'error': str(e)}
def check_propagation(hostname: str, expected_ip: str) -> Dict:
"""Check DNS propagation across multiple nameservers."""
public_dns = {
'google_1': '8.8.8.8',
'google_2': '8.8.4.4',
'cloudflare_1': '1.1.1.1',
'cloudflare_2': '1.0.0.1',
'quad9': '9.9.9.9',
'opendns': '208.67.222.222'
}
results = {}
propagated = 0
for name, ns in public_dns.items():
result = check_dns_resolution(hostname, [expected_ip], [ns])
results[name] = result
if result.get('matches'):
propagated += 1
return {
'hostname': hostname,
'expected_ip': expected_ip,
'propagation_percentage': (propagated / len(public_dns)) * 100,
'results': results
}
# Usage
result = check_propagation('api.example.com', '203.0.113.10')
print(f"Propagation: {result['propagation_percentage']}%")
|