diff --git a/README.md b/README.md index cec2050..dc48044 100644 --- a/README.md +++ b/README.md @@ -106,18 +106,17 @@ Using `--expert` will instruct dnstraceroute to print expert hints (such as warn dnseval is a bulk ping utility that sends an arbitrary DNS query to a give list of DNS servers. This script is meant for comparing response time of multiple DNS servers at once: -``` -% ./dnseval.py wikipedia.org -server avg(ms) min(ms) max(ms) stddev(ms) lost(%) --------------------------------------------------------------------------- -4.2.2.1 151.067 131.270 221.742 28.643 %10 -4.2.2.2 142.175 132.921 178.133 13.348 %0 -64.6.64.6 133.047 109.145 162.938 20.609 %0 -64.6.65.6 377.270 97.669 661.471 172.717 %0 -8.8.4.4 389.048 294.581 511.134 67.953 %0 -8.8.8.8 0.000 0.000 0.000 0.000 %100 -208.67.222.222 179.068 135.975 258.582 50.681 %0 -208.67.220.220 137.817 135.822 140.113 1.504 %0 +```% ./dnseval.py -f public-v4.txt -c3 ripe.net +server avg(ms) min(ms) max(ms) stddev(ms) lost(%) flags +---------------------------------------------------------------------------------- +8.8.8.8 210.225 109.864 407.420 170.785 %0 QR RD RA +8.8.4.4 107.850 93.134 120.578 13.830 %0 QR RD RA +ns.ripe.net 118.911 114.874 123.389 4.275 %0 QR AA RD +4.2.2.1 104.380 102.449 106.588 2.083 %0 QR RD RA +4.2.2.2 131.056 99.143 193.711 54.264 %0 QR RD RA +4.2.2.3 98.956 97.463 100.310 1.429 %0 QR RD RA +4.2.2.4 223.173 97.418 463.728 208.398 %0 QR RD RA +4.2.2.5 104.290 97.264 117.878 11.770 %0 QR RD RA ``` ### Author diff --git a/dnseval.py b/dnseval.py index 5dac690..f472eea 100755 --- a/dnseval.py +++ b/dnseval.py @@ -36,6 +36,7 @@ from statistics import stdev import dns.rdatatype import dns.resolver +import dns.flags __VERSION__ = 1.0 __PROGNAME__ = os.path.basename(sys.argv[0]) @@ -75,6 +76,7 @@ def dnsping(host, server, dnsrecord, timeout, count): resolver.timeout = timeout resolver.lifetime = timeout resolver.retry_servfail = 0 + flags = "" response_time = [] i = 0 @@ -93,6 +95,7 @@ def dnsping(host, server, dnsrecord, timeout, count): else: elapsed = (etime - stime) * 1000 # convert to milliseconds response_time.append(elapsed) + flags = dns.flags.to_text(answers.response.flags) r_sent = i + 1 r_received = len(response_time) @@ -112,7 +115,7 @@ def dnsping(host, server, dnsrecord, timeout, count): r_avg = 0 r_stddev = 0 - return (server, r_avg, r_min, r_max, r_stddev, r_lost_percent) + return (server, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags) def main(): @@ -172,8 +175,8 @@ def main(): f = [name.strip() for name in f] width = maxlen(f) blanks = (width - 5) * ' ' - print('server ', blanks, ' avg(ms) min(ms) max(ms) stddev(ms) lost(%)') - print((60 + width) * '-') + print('server ', blanks, ' avg(ms) min(ms) max(ms) stddev(ms) lost(%) flags') + print((70 + width) * '-') for server in f: # check if we have a valid dns server address try: @@ -189,12 +192,12 @@ def main(): if not s: continue - (s, r_avg, r_min, r_max, r_stddev, r_lost_percent) = dnsping(hostname, s, dnsrecord, waittime, + (s, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags) = dnsping(hostname, s, dnsrecord, waittime, count) s = server.ljust(width + 1) - print("%s %-8.3f %-8.3f %-8.3f %-8.3f %%%d" % ( - s, r_avg, r_min, r_max, r_stddev, r_lost_percent), flush=True) + print("%s %-8.3f %-8.3f %-8.3f %-8.3f %%%d %13s" % ( + s, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags), flush=True) except Exception as e: print('error: %s' % e)