Compare commits
18 Commits
Author | SHA1 | Date | |
---|---|---|---|
25c243efa1
|
|||
a0c26242ec
|
|||
e93120da19
|
|||
dc7f03eac3
|
|||
7390514877
|
|||
bbff3b44f6
|
|||
d93b87b2a2
|
|||
8a9acd9100
|
|||
8283f4dbc2
|
|||
e3ddfff88e
|
|||
1b9849c224
|
|||
76b843d728 | |||
037457f0cc | |||
4c9aaf921b | |||
f1807d34ea | |||
9caa006e5b
|
|||
5a99d58dd1
|
|||
c92ea53e57
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,3 +1,6 @@
|
|||||||
|
# virtualenv
|
||||||
|
.venv/
|
||||||
|
|
||||||
# Byte-compiled / optimized / DLL files
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
|
@ -97,7 +97,7 @@ dnseval is a bulk ping utility that sends an arbitrary DNS query to a give list
|
|||||||
of DNS servers. This script is meant for comparing response time of multiple
|
of DNS servers. This script is meant for comparing response time of multiple
|
||||||
DNS servers at once:
|
DNS servers at once:
|
||||||
```
|
```
|
||||||
% ./dnseval.py -t AAAA -f public-v4.txt -c10 yahoo.com
|
% ./dnseval.py -t AAAA -f public-servers.txt -c10 yahoo.com
|
||||||
server avg(ms) min(ms) max(ms) stddev(ms) lost(%) ttl flags
|
server avg(ms) min(ms) max(ms) stddev(ms) lost(%) ttl flags
|
||||||
------------------------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------
|
||||||
8.8.8.8 270.791 215.599 307.498 40.630 %0 298 QR -- -- RD RA -- --
|
8.8.8.8 270.791 215.599 307.498 40.630 %0 298 QR -- -- RD RA -- --
|
||||||
|
81
dnseval.py
81
dnseval.py
@ -33,6 +33,8 @@ import signal
|
|||||||
import socket
|
import socket
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
import random
|
||||||
|
import string
|
||||||
from statistics import stdev
|
from statistics import stdev
|
||||||
|
|
||||||
import dns.rdatatype
|
import dns.rdatatype
|
||||||
@ -40,7 +42,7 @@ import dns.resolver
|
|||||||
|
|
||||||
__author__ = 'Babak Farrokhi (babak@farrokhi.net)'
|
__author__ = 'Babak Farrokhi (babak@farrokhi.net)'
|
||||||
__license__ = 'BSD'
|
__license__ = 'BSD'
|
||||||
__version__ = "1.6.3"
|
__version__ = "1.6.4"
|
||||||
__progname__ = os.path.basename(sys.argv[0])
|
__progname__ = os.path.basename(sys.argv[0])
|
||||||
shutdown = False
|
shutdown = False
|
||||||
|
|
||||||
@ -67,10 +69,11 @@ def usage():
|
|||||||
print("""%s version %s
|
print("""%s version %s
|
||||||
|
|
||||||
usage: %s [-h] [-f server-list] [-c count] [-t type] [-w wait] hostname
|
usage: %s [-h] [-f server-list] [-c count] [-t type] [-w wait] hostname
|
||||||
-h --help show this help
|
-h --help Show this help
|
||||||
-f --file dns server list to use (default: system resolvers)
|
-f --file DNS server list to use (default: system resolvers)
|
||||||
-c --count number of requests to send (default: 10)
|
-c --count Number of requests to send (default: 10)
|
||||||
-w --wait maximum wait time for a reply (default: 2)
|
-m --cache-miss Force cache miss measurement by prepending a random hostname
|
||||||
|
-w --wait Maximum wait time for a reply (default: 2)
|
||||||
-t --type DNS request record type (default: A)
|
-t --type DNS request record type (default: A)
|
||||||
-T --tcp Use TCP instead of UDP
|
-T --tcp Use TCP instead of UDP
|
||||||
-e --edns Disable EDNS0 (Default: Enabled)
|
-e --edns Disable EDNS0 (Default: Enabled)
|
||||||
@ -137,7 +140,13 @@ def flags_to_text(flags):
|
|||||||
return ' '.join(text_flags)
|
return ' '.join(text_flags)
|
||||||
|
|
||||||
|
|
||||||
def dnsping(host, server, dnsrecord, timeout, count, use_tcp=False, use_edns=False):
|
def random_string(min_length=5, max_length=10):
|
||||||
|
char_set = string.ascii_letters + string.digits
|
||||||
|
length = random.randint(min_length, max_length)
|
||||||
|
return ''.join(map(lambda unused: random.choice(char_set), range(length)))
|
||||||
|
|
||||||
|
|
||||||
|
def dnsping(host, server, dnsrecord, timeout, count, use_tcp=False, use_edns=False, force_miss=False):
|
||||||
resolver = dns.resolver.Resolver()
|
resolver = dns.resolver.Resolver()
|
||||||
resolver.nameservers = [server]
|
resolver.nameservers = [server]
|
||||||
resolver.timeout = timeout
|
resolver.timeout = timeout
|
||||||
@ -156,17 +165,27 @@ def dnsping(host, server, dnsrecord, timeout, count, use_tcp=False, use_edns=Fal
|
|||||||
if shutdown: # user pressed CTRL+C
|
if shutdown: # user pressed CTRL+C
|
||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
|
if force_miss:
|
||||||
|
fqdn = "_dnsdiag_%s_.%s" % (random_string(), host)
|
||||||
|
else:
|
||||||
|
fqdn = host
|
||||||
|
|
||||||
stime = time.perf_counter()
|
stime = time.perf_counter()
|
||||||
answers = resolver.query(host, dnsrecord, tcp=use_tcp,
|
answers = resolver.query(fqdn, dnsrecord, tcp=use_tcp,
|
||||||
raise_on_no_answer=False) # todo: response validation in future
|
raise_on_no_answer=False) # todo: response validation in future
|
||||||
etime = time.perf_counter()
|
|
||||||
except (dns.resolver.NoNameservers, dns.resolver.NoAnswer):
|
except (dns.resolver.NoNameservers, dns.resolver.NoAnswer):
|
||||||
break
|
break
|
||||||
except dns.resolver.Timeout:
|
except dns.resolver.Timeout:
|
||||||
pass
|
pass
|
||||||
else:
|
except dns.resolver.NXDOMAIN:
|
||||||
|
etime = time.perf_counter()
|
||||||
|
if force_miss:
|
||||||
elapsed = (etime - stime) * 1000 # convert to milliseconds
|
elapsed = (etime - stime) * 1000 # convert to milliseconds
|
||||||
response_times.append(elapsed)
|
response_times.append(elapsed)
|
||||||
|
else:
|
||||||
|
elapsed = answers.response.time * 1000 # convert to milliseconds
|
||||||
|
response_times.append(elapsed)
|
||||||
|
|
||||||
r_sent = i + 1
|
r_sent = i + 1
|
||||||
r_received = len(response_times)
|
r_received = len(response_times)
|
||||||
@ -212,13 +231,15 @@ def main():
|
|||||||
fromfile = False
|
fromfile = False
|
||||||
use_tcp = False
|
use_tcp = False
|
||||||
use_edns = True
|
use_edns = True
|
||||||
|
force_miss = False
|
||||||
verbose = False
|
verbose = False
|
||||||
color_mode = False
|
color_mode = False
|
||||||
hostname = 'wikipedia.org'
|
hostname = 'wikipedia.org'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(sys.argv[1:], "hf:c:t:w:TevC",
|
opts, args = getopt.getopt(sys.argv[1:], "hf:c:t:w:TevCm",
|
||||||
["help", "file=", "count=", "type=", "wait=", "tcp", "edns", "verbose", "color"])
|
["help", "file=", "count=", "type=", "wait=", "tcp", "edns", "verbose", "color",
|
||||||
|
"force-miss"])
|
||||||
except getopt.GetoptError as err:
|
except getopt.GetoptError as err:
|
||||||
print(err)
|
print(err)
|
||||||
usage()
|
usage()
|
||||||
@ -238,6 +259,8 @@ def main():
|
|||||||
fromfile = True
|
fromfile = True
|
||||||
elif o in ("-w", "--wait"):
|
elif o in ("-w", "--wait"):
|
||||||
waittime = int(a)
|
waittime = int(a)
|
||||||
|
elif o in ("-m", "--cache-miss"):
|
||||||
|
force_miss = True
|
||||||
elif o in ("-t", "--type"):
|
elif o in ("-t", "--type"):
|
||||||
dnsrecord = a
|
dnsrecord = a
|
||||||
elif o in ("-T", "--tcp"):
|
elif o in ("-T", "--tcp"):
|
||||||
@ -256,14 +279,25 @@ def main():
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
if fromfile:
|
if fromfile:
|
||||||
|
if inputfilename == '-':
|
||||||
|
# read from stdin
|
||||||
|
with sys.stdin as flist:
|
||||||
|
f = flist.read().splitlines()
|
||||||
|
else:
|
||||||
|
try:
|
||||||
with open(inputfilename, 'rt') as flist:
|
with open(inputfilename, 'rt') as flist:
|
||||||
f = flist.read().splitlines()
|
f = flist.read().splitlines()
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
f = resolvers
|
f = resolvers
|
||||||
if len(f) == 0:
|
if len(f) == 0:
|
||||||
print("No nameserver specified")
|
print("No nameserver specified")
|
||||||
|
|
||||||
f = [name.strip() for name in f]
|
f = [name.strip() for name in f] # remove annoying blanks
|
||||||
|
f = [x for x in f if not x.startswith('#') and len(x)] # remove comments and empty entries
|
||||||
|
|
||||||
width = maxlen(f)
|
width = maxlen(f)
|
||||||
blanks = (width - 5) * ' '
|
blanks = (width - 5) * ' '
|
||||||
print('server ', blanks, ' avg(ms) min(ms) max(ms) stddev(ms) lost(%) ttl flags')
|
print('server ', blanks, ' avg(ms) min(ms) max(ms) stddev(ms) lost(%) ttl flags')
|
||||||
@ -277,25 +311,29 @@ def main():
|
|||||||
ipaddress.ip_address(server)
|
ipaddress.ip_address(server)
|
||||||
except ValueError: # so it is not a valid IPv4 or IPv6 address, so try to resolve host name
|
except ValueError: # so it is not a valid IPv4 or IPv6 address, so try to resolve host name
|
||||||
try:
|
try:
|
||||||
s = socket.getaddrinfo(server, port=None)[1][4][0]
|
resolver = socket.getaddrinfo(server, port=None)[1][4][0]
|
||||||
except OSError:
|
except OSError:
|
||||||
print('Error: cannot resolve hostname:', server)
|
print('Error: cannot resolve hostname:', server)
|
||||||
s = None
|
resolver = None
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
s = server
|
resolver = server
|
||||||
|
|
||||||
if not s:
|
if not resolver:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
(s, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags, ttl, answers) = dnsping(hostname, s,
|
(resolver, r_avg, r_min, r_max, r_stddev, r_lost_percent, flags, ttl, answers) = dnsping(
|
||||||
|
hostname,
|
||||||
|
resolver,
|
||||||
dnsrecord,
|
dnsrecord,
|
||||||
waittime,
|
waittime,
|
||||||
count,
|
count,
|
||||||
use_tcp=use_tcp,
|
use_tcp=use_tcp,
|
||||||
use_edns=use_edns)
|
use_edns=use_edns,
|
||||||
|
force_miss=force_miss
|
||||||
|
)
|
||||||
except dns.resolver.NXDOMAIN:
|
except dns.resolver.NXDOMAIN:
|
||||||
print('%-15s NXDOMAIN' % server)
|
print('%-15s NXDOMAIN' % server)
|
||||||
continue
|
continue
|
||||||
@ -303,7 +341,7 @@ def main():
|
|||||||
print('%s: %s' % (server, e))
|
print('%s: %s' % (server, e))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
s = server.ljust(width + 1)
|
resolver = server.ljust(width + 1)
|
||||||
text_flags = flags_to_text(flags)
|
text_flags = flags_to_text(flags)
|
||||||
|
|
||||||
s_ttl = str(ttl)
|
s_ttl = str(ttl)
|
||||||
@ -315,11 +353,12 @@ def main():
|
|||||||
else:
|
else:
|
||||||
l_color = color.N
|
l_color = color.N
|
||||||
print("%s %-8.3f %-8.3f %-8.3f %-8.3f %s%%%-3d%s %-8s %21s" % (
|
print("%s %-8.3f %-8.3f %-8.3f %-8.3f %s%%%-3d%s %-8s %21s" % (
|
||||||
s, r_avg, r_min, r_max, r_stddev, l_color, r_lost_percent, color.N, s_ttl, text_flags), flush=True)
|
resolver, r_avg, r_min, r_max, r_stddev, l_color, r_lost_percent, color.N, s_ttl, text_flags),
|
||||||
|
flush=True)
|
||||||
if verbose and hasattr(answers, 'response'):
|
if verbose and hasattr(answers, 'response'):
|
||||||
ans_index = 1
|
ans_index = 1
|
||||||
for answer in answers.response.answer:
|
for answer in answers.response.answer:
|
||||||
print("Answer %d [ %s%s%s ]" % (ans_index, color.B, answer, color.N))
|
print("Answer %d [ %s%s%s ]" % (ans_index, color.G, answer, color.N))
|
||||||
ans_index += 1
|
ans_index += 1
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ import dns.resolver
|
|||||||
|
|
||||||
__author__ = 'Babak Farrokhi (babak@farrokhi.net)'
|
__author__ = 'Babak Farrokhi (babak@farrokhi.net)'
|
||||||
__license__ = 'BSD'
|
__license__ = 'BSD'
|
||||||
__version__ = "1.6.3"
|
__version__ = "1.6.4"
|
||||||
__progname__ = os.path.basename(sys.argv[0])
|
__progname__ = os.path.basename(sys.argv[0])
|
||||||
shutdown = False
|
shutdown = False
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ usage: %s [-ehqv] [-s server] [-p port] [-P port] [-S address] [-c count] [-t ty
|
|||||||
-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)
|
||||||
-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: 0 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)
|
||||||
-e --edns Disable EDNS0 (default: Enabled)
|
-e --edns Disable EDNS0 (default: Enabled)
|
||||||
""" % (__progname__, __version__, __progname__))
|
""" % (__progname__, __version__, __progname__))
|
||||||
@ -88,7 +88,7 @@ def main():
|
|||||||
dnsrecord = 'A'
|
dnsrecord = 'A'
|
||||||
count = 10
|
count = 10
|
||||||
timeout = 2
|
timeout = 2
|
||||||
interval = 0
|
interval = 1
|
||||||
quiet = False
|
quiet = False
|
||||||
verbose = False
|
verbose = False
|
||||||
dnsserver = dns.resolver.get_default_resolver().nameservers[0]
|
dnsserver = dns.resolver.get_default_resolver().nameservers[0]
|
||||||
@ -205,7 +205,7 @@ def main():
|
|||||||
print("No answer")
|
print("No answer")
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
elapsed = (etime - stime) * 1000 # convert to milliseconds
|
elapsed = answers.response.time * 1000 # convert to milliseconds
|
||||||
response_time.append(elapsed)
|
response_time.append(elapsed)
|
||||||
if not quiet:
|
if not quiet:
|
||||||
print(
|
print(
|
||||||
|
@ -44,7 +44,7 @@ import cymruwhois
|
|||||||
# Global Variables
|
# Global Variables
|
||||||
__author__ = 'Babak Farrokhi (babak@farrokhi.net)'
|
__author__ = 'Babak Farrokhi (babak@farrokhi.net)'
|
||||||
__license__ = 'BSD'
|
__license__ = 'BSD'
|
||||||
__version__ = "1.6.3"
|
__version__ = "1.6.4"
|
||||||
_ttl = None
|
_ttl = None
|
||||||
quiet = False
|
quiet = False
|
||||||
whois_cache = {}
|
whois_cache = {}
|
||||||
@ -133,6 +133,7 @@ def usage():
|
|||||||
print(' -a --asn Turn on AS# lookups for each hop encountered')
|
print(' -a --asn Turn on AS# lookups for each hop encountered')
|
||||||
print(' -s --server DNS server to use (default: first system resolver)')
|
print(' -s --server DNS server to use (default: first system resolver)')
|
||||||
print(' -p --port DNS server port number (default: 53)')
|
print(' -p --port DNS server port number (default: 53)')
|
||||||
|
print(' -S --srcip Query source IP address (default: default interface address)')
|
||||||
print(' -c --count Maximum number of hops (default: 30)')
|
print(' -c --count Maximum number of hops (default: 30)')
|
||||||
print(' -w --wait Maximum wait time for a reply (default: 2)')
|
print(' -w --wait Maximum wait time for a reply (default: 2)')
|
||||||
print(' -t --type DNS request record type (default: A)')
|
print(' -t --type DNS request record type (default: A)')
|
||||||
@ -182,7 +183,7 @@ def expert_report(trace_path, color_mode):
|
|||||||
print(" %s[*]%s No expert hint available for this trace" % (color.G, color.N))
|
print(" %s[*]%s No expert hint available for this trace" % (color.G, color.N))
|
||||||
|
|
||||||
|
|
||||||
def ping(resolver, hostname, dnsrecord, ttl, use_edns=False):
|
def ping(resolver, hostname, dnsrecord, ttl, src_ip, use_edns=False):
|
||||||
global _ttl
|
global _ttl
|
||||||
|
|
||||||
reached = False
|
reached = False
|
||||||
@ -193,7 +194,7 @@ def ping(resolver, hostname, dnsrecord, ttl, use_edns=False):
|
|||||||
resolver.use_edns(edns=0, payload=8192, ednsflags=dns.flags.edns_from_text('DO'))
|
resolver.use_edns(edns=0, payload=8192, ednsflags=dns.flags.edns_from_text('DO'))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
resolver.query(hostname, dnsrecord, raise_on_no_answer=False)
|
resolver.query(hostname, dnsrecord, source=src_ip, raise_on_no_answer=False)
|
||||||
|
|
||||||
except dns.resolver.NoNameservers as e:
|
except dns.resolver.NoNameservers as e:
|
||||||
if not quiet:
|
if not quiet:
|
||||||
@ -237,6 +238,7 @@ def main():
|
|||||||
timeout = 2
|
timeout = 2
|
||||||
dnsserver = dns.resolver.get_default_resolver().nameservers[0]
|
dnsserver = dns.resolver.get_default_resolver().nameservers[0]
|
||||||
dest_port = 53
|
dest_port = 53
|
||||||
|
src_ip = None
|
||||||
hops = 0
|
hops = 0
|
||||||
as_lookup = False
|
as_lookup = False
|
||||||
expert_mode = False
|
expert_mode = False
|
||||||
@ -245,9 +247,9 @@ def main():
|
|||||||
color_mode = False
|
color_mode = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(sys.argv[1:], "aqhc:s:t:w:p:nexC",
|
opts, args = getopt.getopt(sys.argv[1:], "aqhc:s:S:t:w:p:nexC",
|
||||||
["help", "count=", "server=", "quiet", "type=", "wait=", "asn", "port", "expert",
|
["help", "count=", "server=", "quiet", "type=", "wait=", "asn", "port", "expert",
|
||||||
"color"])
|
"color", "srcip="])
|
||||||
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) # will print something like "option -a not recognized"
|
||||||
@ -269,6 +271,8 @@ def main():
|
|||||||
dnsserver = a
|
dnsserver = a
|
||||||
elif o in ("-q", "--quiet"):
|
elif o in ("-q", "--quiet"):
|
||||||
quiet = True
|
quiet = True
|
||||||
|
elif o in ("-S", "--srcip"):
|
||||||
|
src_ip = a
|
||||||
elif o in ("-w", "--wait"):
|
elif o in ("-w", "--wait"):
|
||||||
timeout = int(a)
|
timeout = int(a)
|
||||||
elif o in ("-t", "--type"):
|
elif o in ("-t", "--type"):
|
||||||
@ -301,6 +305,7 @@ def main():
|
|||||||
resolver = dns.resolver.Resolver()
|
resolver = dns.resolver.Resolver()
|
||||||
resolver.nameservers = [dnsserver]
|
resolver.nameservers = [dnsserver]
|
||||||
resolver.timeout = timeout
|
resolver.timeout = timeout
|
||||||
|
resolver.port = dest_port
|
||||||
resolver.lifetime = timeout
|
resolver.lifetime = timeout
|
||||||
resolver.retry_servfail = 0
|
resolver.retry_servfail = 0
|
||||||
|
|
||||||
@ -337,7 +342,7 @@ def main():
|
|||||||
|
|
||||||
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool: # dispatch dns lookup to another thread
|
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool: # dispatch dns lookup to another thread
|
||||||
stime = time.perf_counter()
|
stime = time.perf_counter()
|
||||||
thr = pool.submit(ping, resolver, hostname, dnsrecord, ttl, use_edns=use_edns)
|
thr = pool.submit(ping, resolver, hostname, dnsrecord, ttl, src_ip=src_ip, use_edns=use_edns)
|
||||||
|
|
||||||
try: # expect ICMP response
|
try: # expect ICMP response
|
||||||
_, curr_addr = icmp_socket.recvfrom(512)
|
_, curr_addr = icmp_socket.recvfrom(512)
|
||||||
@ -353,8 +358,8 @@ def main():
|
|||||||
|
|
||||||
if reached:
|
if reached:
|
||||||
curr_addr = dnsserver
|
curr_addr = dnsserver
|
||||||
stime = time.perf_counter() # need to recalculate elapsed time for last hop without waiting for an icmp error reply
|
stime = time.perf_counter() # need to recalculate elapsed time for last hop asynchronously
|
||||||
ping(resolver, hostname, dnsrecord, ttl, use_edns=use_edns)
|
ping(resolver, hostname, dnsrecord, ttl, src_ip=src_ip, use_edns=use_edns)
|
||||||
etime = time.perf_counter()
|
etime = time.perf_counter()
|
||||||
|
|
||||||
elapsed = abs(etime - stime) * 1000 # convert to milliseconds
|
elapsed = abs(etime - stime) * 1000 # convert to milliseconds
|
||||||
@ -387,6 +392,7 @@ def main():
|
|||||||
|
|
||||||
c = color.N # default
|
c = color.N # default
|
||||||
if curr_addr != '*':
|
if curr_addr != '*':
|
||||||
|
try:
|
||||||
IP = ipaddress.ip_address(curr_addr)
|
IP = ipaddress.ip_address(curr_addr)
|
||||||
if IP.is_private:
|
if IP.is_private:
|
||||||
c = color.R
|
c = color.R
|
||||||
@ -394,6 +400,8 @@ def main():
|
|||||||
c = color.B
|
c = color.B
|
||||||
if curr_addr == dnsserver:
|
if curr_addr == dnsserver:
|
||||||
c = color.G
|
c = color.G
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
print("%d\t%s (%s%s%s) %s%.3f ms" % (ttl, curr_name, c, curr_addr, color.N, as_name, elapsed), flush=True)
|
print("%d\t%s (%s%s%s) %s%.3f ms" % (ttl, curr_name, c, curr_addr, color.N, as_name, elapsed), flush=True)
|
||||||
trace_path.append(curr_addr)
|
trace_path.append(curr_addr)
|
||||||
|
@ -2,6 +2,12 @@
|
|||||||
8.8.4.4
|
8.8.4.4
|
||||||
2001:4860:4860::8888
|
2001:4860:4860::8888
|
||||||
2001:4860:4860::8844
|
2001:4860:4860::8844
|
||||||
|
9.9.9.9
|
||||||
|
2620:fe::fe
|
||||||
|
1.1.1.1
|
||||||
|
1.0.0.1
|
||||||
|
2606:4700:4700::1111
|
||||||
|
2606:4700:4700::1001
|
||||||
4.2.2.1
|
4.2.2.1
|
||||||
4.2.2.2
|
4.2.2.2
|
||||||
4.2.2.3
|
4.2.2.3
|
||||||
@ -13,3 +19,7 @@
|
|||||||
195.46.39.40
|
195.46.39.40
|
||||||
216.146.35.35
|
216.146.35.35
|
||||||
216.146.36.36
|
216.146.36.36
|
||||||
|
208.67.222.222
|
||||||
|
208.67.220.220
|
||||||
|
2620:0:ccc::2
|
||||||
|
2620:0:ccd::2
|
||||||
|
18
public-v4.txt
Normal file
18
public-v4.txt
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
8.8.8.8
|
||||||
|
8.8.4.4
|
||||||
|
9.9.9.9
|
||||||
|
1.1.1.1
|
||||||
|
1.0.0.1
|
||||||
|
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
|
2
setup.py
2
setup.py
@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="dnsdiag",
|
name="dnsdiag",
|
||||||
version="1.6.3",
|
version="1.6.4",
|
||||||
packages=find_packages(),
|
packages=find_packages(),
|
||||||
scripts=["dnseval.py", "dnsping.py", "dnstraceroute.py"],
|
scripts=["dnseval.py", "dnsping.py", "dnstraceroute.py"],
|
||||||
install_requires=['dnspython>=1.15.0', 'cymruwhois>=1.6'],
|
install_requires=['dnspython>=1.15.0', 'cymruwhois>=1.6'],
|
||||||
|
Reference in New Issue
Block a user