Fix handling invalid TTL and some output string justifications (fix #26, #27)

This commit is contained in:
Babak Farrokhi 2016-08-22 15:58:58 +04:30
parent 93b0d6ec51
commit 50934cbe91
Signed by: farrokhi
GPG Key ID: 6B267AD85D632E9A

View File

@ -25,9 +25,10 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import os
import getopt import getopt
import ipaddress import ipaddress
import os
import signal import signal
import socket import socket
import sys import sys
@ -167,7 +168,8 @@ 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 if answers.rrset is not None:
ttl = answers.rrset.ttl
return server, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags, ttl return server, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags, ttl
@ -225,55 +227,61 @@ 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(%) ttl flags') print('server ', blanks, ' avg(ms) min(ms) max(ms) stddev(ms) lost(%) ttl flags')
print((90 + width) * '-') print((93 + 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, ttl) = dnsping(hostname, s, dnsrecord, waittime, (s, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags, ttl) = dnsping(hostname, s, dnsrecord,
count, use_tcp=use_tcp, waittime,
use_edns=use_edns) count, use_tcp=use_tcp,
except dns.resolver.NXDOMAIN: use_edns=use_edns)
print('%s: NXDOMAIN' % (server)) except dns.resolver.NXDOMAIN:
continue print('%-15s NXDOMAIN' % (server))
except Exception as e: continue
print('%s: %s' % (server, e)) except Exception as e:
continue print('%s: %s' % (server, e))
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 %-5.0f %21s" % (
s, r_avg, r_min, r_max, r_stddev, r_lost_percent, ttl, text_flags), flush=True) s_ttl = str(ttl)
if s_ttl == "None":
s_ttl = "N/A"
print("%s %-8.3f %-8.3f %-8.3f %-8.3f %%%-3d %-8s %21s" % (
s, r_avg, r_min, r_max, r_stddev, r_lost_percent, s_ttl, text_flags), flush=True)
except Exception as e: except Exception as e:
print('%s' % (server, e)) print('%s' % (server, e))