Ensure printed messages are flushed immediately (fixes #59)

Also send error messages to stderr
This commit is contained in:
Babak Farrokhi 2019-03-15 17:47:48 +01:00
parent 1d37debd96
commit 3ecc777eb9
Signed by: farrokhi
GPG Key ID: 6B267AD85D632E9A

View File

@ -106,7 +106,7 @@ def main():
"port=", "srcip=", "tcp", "ipv4", "ipv6", "srcport=", "edns"]) "port=", "srcip=", "tcp", "ipv4", "ipv6", "srcport=", "edns"])
except getopt.GetoptError as err: except getopt.GetoptError as err:
# print help information and exit: # print help information and exit:
print(err) # will print something like "option -a not recognized" print(err, file=sys.stderr) # will print something like "option -a not recognized"
usage() usage()
if args and len(args) == 1: if args and len(args) == 1:
@ -145,7 +145,7 @@ def main():
elif o in ("-P", "--srcport"): elif o in ("-P", "--srcport"):
src_port = int(a) src_port = int(a)
if src_port < 1024: if src_port < 1024:
print("WARNING: Source ports below 1024 are only available to superuser") print("WARNING: Source ports below 1024 are only available to superuser", flush=True)
elif o in ("-S", "--srcip"): elif o in ("-S", "--srcip"):
src_ip = a src_ip = a
else: else:
@ -158,7 +158,7 @@ def main():
try: try:
dnsserver = socket.getaddrinfo(dnsserver, port=None, family=af)[1][4][0] dnsserver = socket.getaddrinfo(dnsserver, port=None, family=af)[1][4][0]
except OSError: except OSError:
print('Error: cannot resolve hostname:', dnsserver) print('Error: cannot resolve hostname:', dnsserver, file=sys.stderr, flush=True)
sys.exit(1) sys.exit(1)
resolver = dns.resolver.Resolver() resolver = dns.resolver.Resolver()
@ -174,7 +174,8 @@ def main():
response_time = [] response_time = []
i = 0 i = 0
print("%s DNS: %s:%d, hostname: %s, rdatatype: %s" % (__progname__, dnsserver, dst_port, hostname, dnsrecord)) print("%s DNS: %s:%d, hostname: %s, rdatatype: %s" % (__progname__, dnsserver, dst_port, hostname, dnsrecord),
flush=True)
while not shutdown: while not shutdown:
@ -190,23 +191,23 @@ def main():
etime = time.perf_counter() etime = time.perf_counter()
except dns.resolver.NoNameservers as e: except dns.resolver.NoNameservers as e:
if not quiet: if not quiet:
print("No response to dns request") print("No response to dns request", file=sys.stderr, flush=True)
if verbose: if verbose:
print("error:", e) print("error:", e, file=sys.stderr, flush=True)
sys.exit(1) sys.exit(1)
except dns.resolver.NXDOMAIN as e: except dns.resolver.NXDOMAIN as e:
if not quiet: if not quiet:
print("Hostname does not exist") print("Hostname does not exist", file=sys.stderr, flush=True)
if verbose: if verbose:
print("Error:", e) print("Error:", e, file=sys.stderr, flush=True)
sys.exit(1) sys.exit(1)
except dns.resolver.Timeout: except dns.resolver.Timeout:
if not quiet: if not quiet:
print("Request timeout") print("Request timeout", flush=True)
pass pass
except dns.resolver.NoAnswer: except dns.resolver.NoAnswer:
if not quiet: if not quiet:
print("No answer") print("No answer", flush=True)
pass pass
else: else:
elapsed = answers.response.time * 1000 # convert to milliseconds elapsed = answers.response.time * 1000 # convert to milliseconds
@ -214,10 +215,10 @@ def main():
if not quiet: if not quiet:
print( print(
"%d bytes from %s: seq=%-3d time=%.3f ms" % ( "%d bytes from %s: seq=%-3d time=%.3f ms" % (
len(str(answers.rrset)), dnsserver, i, elapsed)) len(str(answers.rrset)), dnsserver, i, elapsed), flush=True)
if verbose: if verbose:
print(answers.rrset) print(answers.rrset, flush=True)
print("flags:", dns.flags.to_text(answers.response.flags)) print("flags:", dns.flags.to_text(answers.response.flags), flush=True)
time_to_next = (stime + interval) - etime time_to_next = (stime + interval) - etime
if time_to_next > 0: if time_to_next > 0:
@ -241,9 +242,10 @@ def main():
r_avg = 0 r_avg = 0
r_stddev = 0 r_stddev = 0
print('\n--- %s dnsping statistics ---' % dnsserver) print('\n--- %s dnsping statistics ---' % dnsserver, flush=True)
print('%d requests transmitted, %d responses received, %.0f%% lost' % (r_sent, r_received, r_lost_percent)) print('%d requests transmitted, %d responses received, %.0f%% lost' % (r_sent, r_received, r_lost_percent),
print('min=%.3f ms, avg=%.3f ms, max=%.3f ms, stddev=%.3f ms' % (r_min, r_avg, r_max, r_stddev)) flush=True)
print('min=%.3f ms, avg=%.3f ms, max=%.3f ms, stddev=%.3f ms' % (r_min, r_avg, r_max, r_stddev), flush=True)
if __name__ == '__main__': if __name__ == '__main__':