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
|
||||
python:
|
||||
- "3.3"
|
||||
- "3.4"
|
||||
- "3.5"
|
||||
- "3.5-dev" # 3.5 development branch
|
||||
- "nightly" # currently points to 3.6-dev
|
||||
sudo: false
|
||||
install: "pip install -r requirements.txt"
|
||||
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
|
||||
==================================================
|
||||
@ -127,3 +127,4 @@ Babak Farrokhi
|
||||
|
||||
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
|
||||
-P --srcport Query source port number (default: 0)
|
||||
-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)
|
||||
-i --interval Time between each request (default: 1 seconds)
|
||||
-t --type DNS request record type (default: A)
|
||||
@ -106,7 +106,7 @@ def main():
|
||||
"port=", "srcip=", "tcp", "ipv4", "ipv6", "srcport=", "edns"])
|
||||
except getopt.GetoptError as err:
|
||||
# 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()
|
||||
|
||||
if args and len(args) == 1:
|
||||
@ -118,7 +118,7 @@ def main():
|
||||
if o in ("-h", "--help"):
|
||||
usage()
|
||||
elif o in ("-c", "--count"):
|
||||
count = int(a)
|
||||
count = abs(int(a))
|
||||
elif o in ("-v", "--verbose"):
|
||||
verbose = True
|
||||
elif o in ("-s", "--server"):
|
||||
@ -145,7 +145,7 @@ def main():
|
||||
elif o in ("-P", "--srcport"):
|
||||
src_port = int(a)
|
||||
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"):
|
||||
src_ip = a
|
||||
else:
|
||||
@ -158,7 +158,7 @@ def main():
|
||||
try:
|
||||
dnsserver = socket.getaddrinfo(dnsserver, port=None, family=af)[1][4][0]
|
||||
except OSError:
|
||||
print('Error: cannot resolve hostname:', dnsserver)
|
||||
print('Error: cannot resolve hostname:', dnsserver, file=sys.stderr, flush=True)
|
||||
sys.exit(1)
|
||||
|
||||
resolver = dns.resolver.Resolver()
|
||||
@ -174,11 +174,16 @@ def main():
|
||||
response_time = []
|
||||
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):
|
||||
if shutdown:
|
||||
while not shutdown:
|
||||
|
||||
if 0 < count <= i:
|
||||
break
|
||||
else:
|
||||
i += 1
|
||||
|
||||
try:
|
||||
stime = time.perf_counter()
|
||||
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()
|
||||
except dns.resolver.NoNameservers as e:
|
||||
if not quiet:
|
||||
print("No response to dns request")
|
||||
print("No response to dns request", file=sys.stderr, flush=True)
|
||||
if verbose:
|
||||
print("error:", e)
|
||||
print("error:", e, file=sys.stderr, flush=True)
|
||||
sys.exit(1)
|
||||
except dns.resolver.NXDOMAIN as e:
|
||||
if not quiet:
|
||||
print("Hostname does not exist")
|
||||
print("Hostname does not exist", file=sys.stderr, flush=True)
|
||||
if verbose:
|
||||
print("Error:", e)
|
||||
print("Error:", e, file=sys.stderr, flush=True)
|
||||
sys.exit(1)
|
||||
except dns.resolver.Timeout:
|
||||
if not quiet:
|
||||
print("Request timeout")
|
||||
print("Request timeout", flush=True)
|
||||
pass
|
||||
except dns.resolver.NoAnswer:
|
||||
if not quiet:
|
||||
print("No answer")
|
||||
print("No answer", flush=True)
|
||||
pass
|
||||
else:
|
||||
elapsed = answers.response.time * 1000 # convert to milliseconds
|
||||
@ -210,10 +215,10 @@ def main():
|
||||
if not quiet:
|
||||
print(
|
||||
"%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:
|
||||
print(answers.rrset)
|
||||
print("flags:", dns.flags.to_text(answers.response.flags))
|
||||
print(answers.rrset, flush=True)
|
||||
print("flags:", dns.flags.to_text(answers.response.flags), flush=True)
|
||||
|
||||
time_to_next = (stime + interval) - etime
|
||||
if time_to_next > 0:
|
||||
@ -237,9 +242,10 @@ def main():
|
||||
r_avg = 0
|
||||
r_stddev = 0
|
||||
|
||||
print('\n--- %s dnsping statistics ---' % dnsserver)
|
||||
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))
|
||||
print('\n--- %s dnsping statistics ---' % dnsserver, flush=True)
|
||||
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), flush=True)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
@ -1,25 +1,42 @@
|
||||
8.8.8.8
|
||||
8.8.4.4
|
||||
2001:4860:4860::8888
|
||||
2001:4860:4860::8844
|
||||
9.9.9.9
|
||||
2620:fe::fe
|
||||
1.1.1.1
|
||||
#Cloudflare
|
||||
1.0.0.1
|
||||
2606:4700:4700::1111
|
||||
1.1.1.1
|
||||
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.2
|
||||
4.2.2.3
|
||||
4.2.2.4
|
||||
4.2.2.5
|
||||
209.244.0.3
|
||||
209.244.0.4
|
||||
195.46.39.39
|
||||
195.46.39.40
|
||||
216.146.35.35
|
||||
216.146.36.36
|
||||
208.67.222.222
|
||||
208.67.220.220
|
||||
2620:0:ccc::2
|
||||
2620:0:ccd::2
|
||||
|
||||
#freenom world
|
||||
80.80.80.80
|
||||
80.80.81.81
|
||||
#Google
|
||||
8.8.4.4
|
||||
8.8.8.8
|
||||
2001:4860:4860::8844
|
||||
2001:4860:4860::8888
|
||||
|
||||
#PCH's Quad9
|
||||
9.9.9.9
|
||||
2620:fe::fe
|
||||
149.112.112.112
|
||||
|
@ -1,18 +1,36 @@
|
||||
8.8.8.8
|
||||
8.8.4.4
|
||||
9.9.9.9
|
||||
1.1.1.1
|
||||
#Cloudflare
|
||||
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.2
|
||||
4.2.2.3
|
||||
4.2.2.4
|
||||
4.2.2.5
|
||||
209.244.0.3
|
||||
209.244.0.4
|
||||
195.46.39.39
|
||||
195.46.39.40
|
||||
216.146.35.35
|
||||
216.146.36.36
|
||||
208.67.222.222
|
||||
208.67.220.220
|
||||
|
||||
#freenom world
|
||||
80.80.80.80
|
||||
80.80.81.81
|
||||
|
||||
#Google
|
||||
8.8.4.4
|
||||
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",
|
||||
"Intended Audience :: Developers",
|
||||
"License :: OSI Approved :: BSD License",
|
||||
"Programming Language :: Python :: 3.3",
|
||||
"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)",
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
"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.
|
||||
""",
|
||||
license="BSD",
|
||||
keywords="dns traceroute ping",
|
||||
keywords="dns traceroute ping performance",
|
||||
url="https://dnsdiag.org/",
|
||||
entry_points={
|
||||
'console_scripts': [
|
||||
|
Loading…
x
Reference in New Issue
Block a user