Can do all with one argument, and includes start and end timestamps.

This commit is contained in:
Discsearcher
2026-08-11 21:16:32 -04:00
parent ea9bebac3d
commit c3fcf8b3e7
+21 -10
View File
@@ -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))