Compare commits

..

No commits in common. "master" and "v1.6.4" have entirely different histories.

7 changed files with 60 additions and 115 deletions

View File

@ -1,18 +1,10 @@
language: python language: python
sudo: false python:
- "3.3"
- "3.4"
- "3.5"
- "3.5-dev" # 3.5 development branch
- "nightly" # currently points to 3.6-dev
install: "pip install -r requirements.txt" install: "pip install -r requirements.txt"
script: nosetests dnstraceroute.py script: nosetests dnstraceroute.py
matrix:
fast_finish: true
include:
- python: "3.3"
- python: "3.4"
- python: "3.5"
- python: "3.6"
- python: "3.7"
dist: xenial
sudo: true
- python: "3.8-dev"
dist: xenial
sudo: true
- python: "pypy3"

View File

@ -1 +1 @@
include LICENSE README.md TODO.md public-servers.txt public-v4.txt rootservers.txt include LICENSE README.md TODO.md public-servers.txt

View File

@ -1,4 +1,4 @@
[![Build Status](https://travis-ci.org/farrokhi/dnsdiag.svg)](https://travis-ci.org/farrokhi/dnsdiag) [![PyPI](https://img.shields.io/pypi/v/dnsdiag.svg?maxAge=8600)](https://pypi.python.org/pypi/dnsdiag/) [![PyPI](https://img.shields.io/pypi/l/dnsdiag.svg?maxAge=8600)]() [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Ffarrokhi%2Fdnsdiag.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Ffarrokhi%2Fdnsdiag?ref=badge_shield) [![PyPI](https://img.shields.io/pypi/pyversions/dnsdiag.svg?maxAge=8600)]() [![GitHub stars](https://img.shields.io/github/stars/farrokhi/dnsdiag.svg?style=social&label=Star&maxAge=8600)](https://github.com/farrokhi/dnsdiag/stargazers) [![Build Status](https://travis-ci.org/farrokhi/dnsdiag.svg)](https://travis-ci.org/farrokhi/dnsdiag) [![PyPI](https://img.shields.io/pypi/v/dnsdiag.svg?maxAge=8600)](https://pypi.python.org/pypi/dnsdiag/) [![PyPI](https://img.shields.io/pypi/l/dnsdiag.svg?maxAge=8600)]() [![PyPI](https://img.shields.io/pypi/pyversions/dnsdiag.svg?maxAge=8600)]() [![GitHub stars](https://img.shields.io/github/stars/farrokhi/dnsdiag.svg?style=social&label=Star&maxAge=8600)](https://github.com/farrokhi/dnsdiag/stargazers)
DNS Diagnostics and Performance Measurement Tools DNS Diagnostics and Performance Measurement Tools
================================================== ==================================================
@ -127,4 +127,3 @@ Babak Farrokhi
dnsdiag is released under a 2 clause BSD license. dnsdiag is released under a 2 clause BSD license.
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Ffarrokhi%2Fdnsdiag.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Ffarrokhi%2Fdnsdiag?ref=badge_large)

View File

@ -58,7 +58,7 @@ usage: %s [-ehqv] [-s server] [-p port] [-P port] [-S address] [-c count] [-t ty
-6 --ipv6 Use IPv6 as default network protocol -6 --ipv6 Use IPv6 as default network protocol
-P --srcport Query source port number (default: 0) -P --srcport Query source port number (default: 0)
-S --srcip Query source IP address (default: default interface address) -S --srcip Query source IP address (default: default interface address)
-c --count Number of requests to send (default: 10, 0 for infinity) -c --count Number of requests to send (default: 10)
-w --wait Maximum wait time for a reply (default: 2 seconds) -w --wait Maximum wait time for a reply (default: 2 seconds)
-i --interval Time between each request (default: 1 seconds) -i --interval Time between each request (default: 1 seconds)
-t --type DNS request record type (default: A) -t --type DNS request record type (default: A)
@ -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, file=sys.stderr) # will print something like "option -a not recognized" print(err) # will print something like "option -a not recognized"
usage() usage()
if args and len(args) == 1: if args and len(args) == 1:
@ -118,7 +118,7 @@ def main():
if o in ("-h", "--help"): if o in ("-h", "--help"):
usage() usage()
elif o in ("-c", "--count"): elif o in ("-c", "--count"):
count = abs(int(a)) count = int(a)
elif o in ("-v", "--verbose"): elif o in ("-v", "--verbose"):
verbose = True verbose = True
elif o in ("-s", "--server"): elif o in ("-s", "--server"):
@ -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", flush=True) print("WARNING: Source ports below 1024 are only available to superuser")
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, file=sys.stderr, flush=True) print('Error: cannot resolve hostname:', dnsserver)
sys.exit(1) sys.exit(1)
resolver = dns.resolver.Resolver() resolver = dns.resolver.Resolver()
@ -174,16 +174,11 @@ 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: for i in range(count):
if shutdown:
if 0 < count <= i:
break break
else:
i += 1
try: try:
stime = time.perf_counter() stime = time.perf_counter()
answers = resolver.query(hostname, dnsrecord, source_port=src_port, source=src_ip, tcp=use_tcp, answers = resolver.query(hostname, dnsrecord, source_port=src_port, source=src_ip, tcp=use_tcp,
@ -191,23 +186,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", file=sys.stderr, flush=True) print("No response to dns request")
if verbose: if verbose:
print("error:", e, file=sys.stderr, flush=True) print("error:", e)
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", file=sys.stderr, flush=True) print("Hostname does not exist")
if verbose: if verbose:
print("Error:", e, file=sys.stderr, flush=True) print("Error:", e)
sys.exit(1) sys.exit(1)
except dns.resolver.Timeout: except dns.resolver.Timeout:
if not quiet: if not quiet:
print("Request timeout", flush=True) print("Request timeout")
pass pass
except dns.resolver.NoAnswer: except dns.resolver.NoAnswer:
if not quiet: if not quiet:
print("No answer", flush=True) print("No answer")
pass pass
else: else:
elapsed = answers.response.time * 1000 # convert to milliseconds elapsed = answers.response.time * 1000 # convert to milliseconds
@ -215,10 +210,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), flush=True) len(str(answers.rrset)), dnsserver, i, elapsed))
if verbose: if verbose:
print(answers.rrset, flush=True) print(answers.rrset)
print("flags:", dns.flags.to_text(answers.response.flags), flush=True) print("flags:", dns.flags.to_text(answers.response.flags))
time_to_next = (stime + interval) - etime time_to_next = (stime + interval) - etime
if time_to_next > 0: if time_to_next > 0:
@ -242,10 +237,9 @@ def main():
r_avg = 0 r_avg = 0
r_stddev = 0 r_stddev = 0
print('\n--- %s dnsping statistics ---' % dnsserver, flush=True) print('\n--- %s dnsping statistics ---' % dnsserver)
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))
flush=True) print('min=%.3f ms, avg=%.3f ms, max=%.3f ms, stddev=%.3f ms' % (r_min, r_avg, r_max, r_stddev))
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__':

View File

@ -1,42 +1,25 @@
#Cloudflare 8.8.8.8
1.0.0.1 8.8.4.4
2001:4860:4860::8888
2001:4860:4860::8844
9.9.9.9
2620:fe::fe
1.1.1.1 1.1.1.1
2606:4700:4700::1001 1.0.0.1
2606:4700:4700::1111 2606:4700:4700::1111
2606:4700:4700::1001
#SafeDNS
195.46.39.39
195.46.39.40
#OpenDNS
208.67.220.220
208.67.222.222
2620:0:ccc::2
2620:0:ccd::2
#DYN DNS
216.146.35.35
216.146.36.36
#Level3
209.244.0.3
209.244.0.4
4.2.2.1 4.2.2.1
4.2.2.2 4.2.2.2
4.2.2.3 4.2.2.3
4.2.2.4 4.2.2.4
4.2.2.5 4.2.2.5
209.244.0.3
#freenom world 209.244.0.4
80.80.80.80 195.46.39.39
80.80.81.81 195.46.39.40
#Google 216.146.35.35
8.8.4.4 216.146.36.36
8.8.8.8 208.67.222.222
2001:4860:4860::8844 208.67.220.220
2001:4860:4860::8888 2620:0:ccc::2
2620:0:ccd::2
#PCH's Quad9
9.9.9.9
2620:fe::fe
149.112.112.112

View File

@ -1,36 +1,18 @@
#Cloudflare 8.8.8.8
1.0.0.1 8.8.4.4
9.9.9.9
1.1.1.1 1.1.1.1
1.0.0.1
#SafeDNS
195.46.39.39
195.46.39.40
#OpenDNS
208.67.220.220
208.67.222.222
#DYN DNS
216.146.35.35
216.146.36.36
#Level3
209.244.0.3
209.244.0.4
4.2.2.1 4.2.2.1
4.2.2.2 4.2.2.2
4.2.2.3 4.2.2.3
4.2.2.4 4.2.2.4
4.2.2.5 4.2.2.5
209.244.0.3
#freenom world 209.244.0.4
80.80.80.80 195.46.39.39
80.80.81.81 195.46.39.40
216.146.35.35
#Google 216.146.36.36
8.8.4.4 208.67.222.222
8.8.8.8 208.67.220.220
#PCH's Quad9
9.9.9.9
149.112.112.112

View File

@ -12,12 +12,7 @@ setup(
"Environment :: Console", "Environment :: Console",
"Intended Audience :: Developers", "Intended Audience :: Developers",
"License :: OSI Approved :: BSD License", "License :: OSI Approved :: BSD License",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: Implementation :: PyPy",
"Topic :: Internet :: Name Service (DNS)", "Topic :: Internet :: Name Service (DNS)",
"Development Status :: 5 - Production/Stable", "Development Status :: 5 - Production/Stable",
"Operating System :: OS Independent", "Operating System :: OS Independent",
@ -33,7 +28,7 @@ you can measure your DNS response quality from delay and loss perspective
as well as tracing the path your DNS query takes to get to DNS server. as well as tracing the path your DNS query takes to get to DNS server.
""", """,
license="BSD", license="BSD",
keywords="dns traceroute ping performance", keywords="dns traceroute ping",
url="https://dnsdiag.org/", url="https://dnsdiag.org/",
entry_points={ entry_points={
'console_scripts': [ 'console_scripts': [