Show TTL in dnseval output and update README (fix #23)

This commit is contained in:
Babak Farrokhi 2016-08-16 15:08:19 +04:30
parent cc5dffc5d5
commit 93b0d6ec51
2 changed files with 64 additions and 62 deletions

View File

@ -100,21 +100,21 @@ 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 of DNS servers. This script is meant for comparing response time of multiple
DNS servers at once: DNS servers at once:
``` ```
% ./dnseval.py -t AAAA -f public-v4.txt -c10 fg.weberdns.de % ./dnseval.py -t AAAA -f public-v4.txt -c10 yahoo.com
server avg(ms) min(ms) max(ms) stddev(ms) lost(%) flags server avg(ms) min(ms) max(ms) stddev(ms) lost(%) ttl flags
------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------
8.8.8.8 94.556 90.488 112.209 6.322 %0 QR -- -- RD RA AD -- 8.8.8.8 270.791 215.599 307.498 40.630 %0 298 QR -- -- RD RA -- --
8.8.4.4 92.599 90.265 94.338 1.086 %0 QR -- -- RD RA AD -- 8.8.4.4 222.955 171.753 307.251 60.481 %10 291 QR -- -- RD RA -- --
ns.ripe.net 92.754 91.632 93.980 0.900 %0 QR -- -- RD RA AD -- ns.ripe.net 174.855 160.949 187.458 10.099 %0 289 QR -- -- RD RA -- --
4.2.2.1 92.703 91.869 93.298 0.482 %0 QR -- -- RD RA AD -- 4.2.2.1 172.798 163.892 189.918 7.823 %0 287 QR -- -- RD RA -- --
4.2.2.2 93.195 91.667 94.919 1.065 %0 QR -- -- RD RA AD -- 4.2.2.2 178.594 169.158 184.696 5.067 %0 285 QR -- -- RD RA -- --
4.2.2.3 93.118 92.076 94.835 0.835 %0 QR -- -- RD RA AD -- 4.2.2.3 153.574 138.509 173.439 12.015 %0 284 QR -- -- RD RA -- --
4.2.2.4 94.308 92.175 103.318 3.261 %0 QR -- -- RD RA AD -- 4.2.2.4 153.182 141.023 162.323 6.700 %0 282 QR -- -- RD RA -- --
4.2.2.5 92.650 91.643 94.460 1.002 %0 QR -- -- RD RA AD -- 4.2.2.5 154.840 141.557 163.889 7.195 %0 281 QR -- -- RD RA -- --
209.244.0.3 92.810 89.961 94.807 1.266 %0 QR -- -- RD RA AD -- 209.244.0.3 156.270 147.320 161.365 3.958 %0 279 QR -- -- RD RA -- --
209.244.0.4 93.127 91.962 95.970 1.227 %0 QR -- -- RD RA AD -- 209.244.0.4 159.329 151.283 163.726 3.958 %0 278 QR -- -- RD RA -- --
195.46.39.39 92.770 90.777 93.656 0.914 %0 QR -- -- RD RA AD -- 195.46.39.39 171.098 163.612 181.147 5.067 %0 276 QR -- -- RD RA -- --
195.46.39.40 92.903 91.280 94.914 1.147 %0 QR -- -- RD RA AD -- 195.46.39.40 175.335 160.920 185.618 8.726 %0 274 QR -- -- RD RA -- --
``` ```
### Author ### Author

View File

@ -123,6 +123,7 @@ def dnsping(host, server, dnsrecord, timeout, count, use_tcp=False, use_edns=Fal
resolver.lifetime = timeout resolver.lifetime = timeout
resolver.retry_servfail = 0 resolver.retry_servfail = 0
flags = 0 flags = 0
ttl = None
answers = None answers = None
if use_edns: if use_edns:
resolver.use_edns(edns=0, payload=8192, ednsflags=dns.flags.edns_from_text('DO')) resolver.use_edns(edns=0, payload=8192, ednsflags=dns.flags.edns_from_text('DO'))
@ -166,8 +167,9 @@ def dnsping(host, server, dnsrecord, timeout, count, use_tcp=False, use_edns=Fal
if answers is not None: if answers is not None:
flags = answers.response.flags flags = answers.response.flags
ttl = answers.rrset.ttl
return server, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags return server, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags, ttl
def main(): def main():
@ -223,58 +225,58 @@ def main():
usage() usage()
try: try:
if fromfile: if fromfile:
with open(inputfilename, 'rt') as flist: with open(inputfilename, 'rt') as flist:
f = flist.read().splitlines() f = flist.read().splitlines()
else: else:
f = resolvers f = resolvers
if len(f) == 0: if len(f) == 0:
print("No nameserver specified") print("No nameserver specified")
f = [name.strip() for name in f] f = [name.strip() for name in f]
width = maxlen(f) width = maxlen(f)
blanks = (width - 5) * ' ' blanks = (width - 5) * ' '
print('server ', blanks, ' avg(ms) min(ms) max(ms) stddev(ms) lost(%) flags') print('server ', blanks, ' avg(ms) min(ms) max(ms) stddev(ms) lost(%) ttl flags')
print((84 + width) * '-') print((90 + width) * '-')
for server in f: for server in f:
# check if we have a valid dns server address # check if we have a valid dns server address
if server.lstrip() == '': # deal with empty lines if server.lstrip() == '': # deal with empty lines
continue continue
server = server.replace(' ', '') server = server.replace(' ', '')
try: try:
ipaddress.ip_address(server) ipaddress.ip_address(server)
except ValueError: # so it is not a valid IPv4 or IPv6 address, so try to resolve host name except ValueError: # so it is not a valid IPv4 or IPv6 address, so try to resolve host name
try: try:
s = socket.getaddrinfo(server, port=None)[1][4][0] s = socket.getaddrinfo(server, port=None)[1][4][0]
except OSError: except OSError:
print('Error: cannot resolve hostname:', server) print('Error: cannot resolve hostname:', server)
s = None s = None
except: except:
pass pass
else: else:
s = server s = server
if not s: if not s:
continue continue
try: try:
(s, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags) = dnsping(hostname, s, dnsrecord, waittime, (s, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags, ttl) = dnsping(hostname, s, dnsrecord, waittime,
count, use_tcp=use_tcp, count, use_tcp=use_tcp,
use_edns=use_edns) use_edns=use_edns)
except dns.resolver.NXDOMAIN: except dns.resolver.NXDOMAIN:
print('%s: NXDOMAIN' % (server)) print('%s: NXDOMAIN' % (server))
continue continue
except Exception as e: except Exception as e:
print('%s: %s' % (server, e)) print('%s: %s' % (server, e))
continue continue
s = server.ljust(width + 1) s = server.ljust(width + 1)
text_flags = flags_to_text(flags) text_flags = flags_to_text(flags)
print("%s %-8.3f %-8.3f %-8.3f %-8.3f %%%-3d %25s" % ( print("%s %-8.3f %-8.3f %-8.3f %-8.3f %%%-3d %-5.0f %21s" % (
s, r_avg, r_min, r_max, r_stddev, r_lost_percent, text_flags), flush=True) s, r_avg, r_min, r_max, r_stddev, r_lost_percent, ttl, text_flags), flush=True)
except Exception as e: except Exception as e:
print('%s: %s' % (server, e)) print('%s' % (server, e))
sys.exit(1) sys.exit(1)