Compare commits
19 Commits
Author | SHA1 | Date | |
---|---|---|---|
3ecc777eb9 | |||
1d37debd96 | |||
0a9b362587 | |||
a81525fc5f | |||
3f8db03853 | |||
f58597f702 | |||
133f5c7952 | |||
3e8e1e41d7 | |||
befeb64a41 | |||
b0f1335664 | |||
0648619d2a | |||
151c383cc1 | |||
|
b78ec5516c | ||
d3a1fd2308 | |||
b8dbe54f1a | |||
|
9e153c406d | ||
|
0fe4786bba | ||
9b47a3084a | |||
b1b4f06730 |
22
.travis.yml
22
.travis.yml
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
[](https://travis-ci.org/farrokhi/dnsdiag) [](https://pypi.python.org/pypi/dnsdiag/) []() []() [](https://github.com/farrokhi/dnsdiag/stargazers)
|
[](https://travis-ci.org/farrokhi/dnsdiag) [](https://pypi.python.org/pypi/dnsdiag/) []() [](https://app.fossa.io/projects/git%2Bgithub.com%2Ffarrokhi%2Fdnsdiag?ref=badge_shield) []() [](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.
|
||||||
|
|
||||||
|
[](https://app.fossa.io/projects/git%2Bgithub.com%2Ffarrokhi%2Fdnsdiag?ref=badge_large)
|
||||||
|
46
dnsping.py
46
dnsping.py
@ -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__':
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
7
setup.py
7
setup.py
@ -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': [
|
||||||
|
Loading…
x
Reference in New Issue
Block a user