Compare commits

..

19 Commits

Author SHA1 Message Date
3ecc777eb9
Ensure printed messages are flushed immediately (fixes #59)
Also send error messages to stderr
2019-03-15 17:47:48 +01:00
1d37debd96
Add -c0 support for infinite loop (fixes #57) 2019-03-15 17:36:39 +01:00
0a9b362587
Update classifiers to reflect support for newer python 3.x and pypy 2018-08-05 16:59:47 +04:30
a81525fc5f
Fix travis config to build 3.7 and 3.8-dev 2018-08-05 16:47:38 +04:30
3f8db03853
Fixing 3.7 build again 2018-08-05 16:45:55 +04:30
f58597f702
Add 3.8-dev target to test 2018-08-05 16:44:02 +04:30
133f5c7952
Trying to fix python 3.7 build on Travis 2018-08-05 16:41:18 +04:30
3e8e1e41d7
Add build-matrix support 2018-08-05 16:33:50 +04:30
befeb64a41
Test with more recent python versions and pypy 2018-08-05 16:28:12 +04:30
b0f1335664
Fix badges 2018-08-05 11:22:22 +04:30
0648619d2a
Merge branch 'master' of github.com:farrokhi/dnsdiag 2018-08-05 11:20:00 +04:30
151c383cc1
Merge pull request #56 from fossabot/master
Add license scan report and status
2018-08-05 11:16:14 +04:30
fossabot
b78ec5516c Add license scan report and status
Signed-off-by: fossabot <badges@fossa.io>
2018-08-04 23:35:44 -07:00
d3a1fd2308
Merge pull request #54 from Bashar/patch-4
updated with sort and comments
2018-05-15 18:24:47 +04:30
b8dbe54f1a
Merge pull request #55 from Bashar/patch-3
updated freenom and the missing quad9 with comments
2018-05-15 18:22:07 +04:30
Bashar Al-Abdulhadi
9e153c406d
updated with sort and comments 2018-05-15 16:47:35 +03:00
Bashar Al-Abdulhadi
0fe4786bba
updated freenom and the missing quad9 with comments 2018-05-15 16:44:57 +03:00
9b47a3084a
minor description change 2018-05-15 16:45:05 +04:30
b1b4f06730
Include sample server files 2018-04-03 17:08:14 +04:30
7 changed files with 115 additions and 60 deletions

View File

@ -1,10 +1,18 @@
language: python language: python
python: sudo: false
- "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 include LICENSE README.md TODO.md public-servers.txt public-v4.txt rootservers.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)]() [![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)]() [![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)
DNS Diagnostics and Performance Measurement Tools DNS Diagnostics and Performance Measurement Tools
================================================== ==================================================
@ -127,3 +127,4 @@ 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) -c --count Number of requests to send (default: 10, 0 for infinity)
-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) # 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:
@ -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 = int(a) count = abs(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") 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,11 +174,16 @@ 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)
for i in range(count): while not shutdown:
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,
@ -186,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
@ -210,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:
@ -237,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__':

View File

@ -1,25 +1,42 @@
8.8.8.8 #Cloudflare
8.8.4.4
2001:4860:4860::8888
2001:4860:4860::8844
9.9.9.9
2620:fe::fe
1.1.1.1
1.0.0.1 1.0.0.1
2606:4700:4700::1111 1.1.1.1
2606:4700:4700::1001 2606:4700:4700::1001
2606:4700:4700::1111
#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
209.244.0.4 #freenom world
195.46.39.39 80.80.80.80
195.46.39.40 80.80.81.81
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 2001:4860:4860::8844
2620:0:ccc::2 2001:4860:4860::8888
2620:0:ccd::2
#PCH's Quad9
9.9.9.9
2620:fe::fe
149.112.112.112

View File

@ -1,18 +1,36 @@
8.8.8.8 #Cloudflare
8.8.4.4
9.9.9.9
1.1.1.1
1.0.0.1 1.0.0.1
1.1.1.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
209.244.0.4 #freenom world
195.46.39.39 80.80.80.80
195.46.39.40 80.80.81.81
216.146.35.35
216.146.36.36 #Google
208.67.222.222 8.8.4.4
208.67.220.220 8.8.8.8
#PCH's Quad9
9.9.9.9
149.112.112.112

View File

@ -12,7 +12,12 @@ 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",
@ -28,7 +33,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", keywords="dns traceroute ping performance",
url="https://dnsdiag.org/", url="https://dnsdiag.org/",
entry_points={ entry_points={
'console_scripts': [ 'console_scripts': [