dns_loop.py
1 #!/usr/bin/env python3 2 3 import argparse 4 import socket 5 import time 6 from itertools import cycle 7 8 9 def dns_lookup(hostname, dns_servers): 10 target_dns = next(dns_servers, None) # Use default DNS if none provided 11 try: 12 # Set up a monkey patch only if specific DNS server is provided 13 if target_dns: 14 original_getaddrinfo = socket.getaddrinfo 15 16 def getaddrinfo_monkeypatch(host, port, family=0, type=0, proto=0, flags=0): 17 return original_getaddrinfo(host, port, family, socket.SOCK_DGRAM, proto, flags) 18 19 socket.getaddrinfo = getaddrinfo_monkeypatch 20 21 socket.setdefaulttimeout(10) # Optional: Set a timeout for DNS requests 22 ip_address = socket.gethostbyname(hostname) 23 print( 24 f"Successfully resolved {hostname} to {ip_address} using DNS server {target_dns or 'system default'}" 25 ) 26 return True 27 except Exception as e: # Broad exception to catch all possible errors 28 print( 29 f"Failed to resolve {hostname} using DNS server {target_dns or 'system default'}: {e}" 30 ) 31 return False 32 finally: 33 if target_dns: 34 socket.getaddrinfo = original_getaddrinfo # Restore original getaddrinfo 35 36 37 def main(dns_servers): 38 dns_servers_cycle = ( 39 cycle(dns_servers) if dns_servers else cycle([None]) 40 ) # Cycle through provided DNS servers or use default 41 success_count, fail_count = 0, 0 # Initialize counters 42 43 while True: # Loop indefinitely 44 for i in range(args.nodes): 45 hostname = f"nodes-{i}" 46 if dns_lookup(hostname, dns_servers_cycle): 47 success_count += 1 48 else: 49 fail_count += 1 50 51 # Print counts every iteration to show progress 52 print( 53 f"Processed {i + 1}/{args.nodes} hostnames, Success: {success_count}, Failures: {fail_count}" 54 ) 55 time.sleep(args.delay) 56 57 58 if __name__ == "__main__": 59 parser = argparse.ArgumentParser( 60 description="Perform DNS lookups with specified target DNS server or system default" 61 ) 62 parser.add_argument( 63 "--target", help="IP address of the target DNS server", nargs="*", default=[] 64 ) 65 parser.add_argument( 66 "--accept-input", action="store_true", help="Accept a list of IP addresses from user input" 67 ) 68 parser.add_argument("--nodes", help="Number of nodes to resolve", type=int, default=1000) 69 parser.add_argument("--delay", help="Delay in seconds", type=float, default=0.4) 70 args = parser.parse_args() 71 72 dns_servers = args.target 73 if args.accept_input: 74 input_servers = ( 75 input("Enter DNS IP addresses (comma or space-separated): ").replace(",", " ").split() 76 ) 77 dns_servers.extend(input_servers) 78 79 # Check if there are no DNS servers provided and not using system default 80 if not dns_servers: 81 print("No specific DNS servers provided; using system default DNS settings.") 82 83 main(dns_servers)