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)