From c3fcf8b3e73c9aba8a3d0e0955946c856da068ea129e56e33e5b4427cec69c49 Mon Sep 17 00:00:00 2001 From: Discsearcher Date: Tue, 11 Aug 2026 21:16:32 -0400 Subject: [PATCH] Can do all with one argument, and includes start and end timestamps. --- dns_compare.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/dns_compare.py b/dns_compare.py index a76b235..3fea78f 100755 --- a/dns_compare.py +++ b/dns_compare.py @@ -4,6 +4,7 @@ import argparse import json import os import time +from datetime import datetime from concurrent.futures import ThreadPoolExecutor from dns import message from dns import query @@ -28,7 +29,7 @@ builtin_nameservers = { parser = argparse.ArgumentParser() parser.add_argument('--domain', help='Helps if all records to query are on the same domain.') parser.add_argument('--nameservers', nargs='+', help='IPv4 or IPv6 address of nameserver(s) to be queried.') -parser.add_argument('--ns-builtin', nargs='+', help=f'Built-in public DNS servers. Options: {", ".join(builtin_nameservers.keys())}') +parser.add_argument('--ns-builtin', nargs='+', help=f'Built-in public DNS servers. Options: {", ".join(builtin_nameservers.keys())}, all') parser.add_argument('--records', nargs='*', help='Hostname(s) to query. If not provided with --domain, queries the domain itself.') parser.add_argument('--record-type', default='A', help='DNS record type to query. Default: A') parser.add_argument('--list-record-types', action='store_true', help='Print list of supported record types and exit.') @@ -40,15 +41,19 @@ builtin_providers = [] # list of provider keys used # Resolve builtin nameservers to actual IPs if args.ns_builtin: - for provider in args.ns_builtin: - if provider.lower() not in builtin_nameservers: + # Handle 'all' special case + if 'all' in [p.lower() for p in args.ns_builtin]: + builtin_providers = list(builtin_nameservers.keys()) + else: + builtin_providers = [p.lower() for p in args.ns_builtin] + + for provider in builtin_providers: + if provider not in builtin_nameservers: print(f"Error: Unknown DNS provider '{provider}'") - print(f"Available providers: {', '.join(builtin_nameservers.keys())}") + print(f"Available providers: {', '.join(builtin_nameservers.keys())}, all") exit(1) - provider_key = provider.lower() - builtin_providers.append(provider_key) - for ip in builtin_nameservers[provider_key]: - nameserver_map[ip] = provider_key + for ip in builtin_nameservers[provider]: + nameserver_map[ip] = provider # Track manual nameservers separately manual_nameservers = [] @@ -101,6 +106,7 @@ def perform_query(full_domain, ns, record_type): # Start timer start_time = time.time() +start_time_iso = datetime.fromtimestamp(start_time).isoformat() # Determine what to query if args.domain: @@ -171,8 +177,13 @@ for full_domain in full_domains: if (full_domain, ns) in results_map: output[full_domain]["records"][ns] = results_map[(full_domain, ns)] -# Calculate and add runtime -elapsed_time = time.time() - start_time +# Calculate and add timing information +end_time = time.time() +end_time_iso = datetime.fromtimestamp(end_time).isoformat() +elapsed_time = end_time - start_time + +output["start_time"] = start_time_iso +output["end_time"] = end_time_iso output["runtime"] = f"{elapsed_time:.2f}s" print(json.dumps(output, indent=4))