diff --git a/dns_compare.py b/dns_compare.py index a003770..63813d3 100755 --- a/dns_compare.py +++ b/dns_compare.py @@ -9,6 +9,7 @@ from concurrent.futures import ThreadPoolExecutor from dns import message from dns import query from dns import rdatatype +from dns import rcode from dns import name from dns import flags from dns import exception @@ -103,12 +104,21 @@ def perform_query(full_domain, ns, record_type, timeout): if r.flags & flags.TC: r = query.tcp(q, ns, timeout=timeout) + # Check response code + response_rcode = r.rcode() + if response_rcode != 0: # 0 = NOERROR + rcode_name = rcode.to_text(response_rcode) + return (full_domain, ns, f"RCODE: {rcode_name}") + results = [] answers = r.answer if answers: for rrset in answers: for item in rrset: results.append(str(item)) + else: + # No answer records returned (NODATA) + return (full_domain, ns, "NO RECORDS") return (full_domain, ns, results) except (exception.Timeout, TimeoutError): @@ -184,8 +194,8 @@ for full_domain in full_domains: provider = nameserver_map.get(ns) if (full_domain, ns) in results_map: results = results_map[(full_domain, ns)] - # Handle error/timeout cases (strings starting with specific markers) - if isinstance(results, str) and (results == "TIMED OUT" or results.startswith("ERROR:")): + # Handle error/timeout/rcode cases (strings) + if isinstance(results, str): output[full_domain]["records"][provider][ns] = results else: results = sorted(results) @@ -196,8 +206,8 @@ for full_domain in full_domains: for ns in all_nameservers: if (full_domain, ns) in results_map: results = results_map[(full_domain, ns)] - # Handle error/timeout cases (strings starting with specific markers) - if isinstance(results, str) and (results == "TIMED OUT" or results.startswith("ERROR:")): + # Handle error/timeout/rcode cases (strings) + if isinstance(results, str): output[full_domain]["records"][ns] = results else: results = sorted(results)