diff options
author | 2013-10-17 23:45:23 -0700 | |
---|---|---|
committer | 2013-10-18 07:14:42 -0700 | |
commit | 6a703ce2d162d96df2a08124e3d3ca3d2f657f07 (patch) | |
tree | a85cd11a5dccd1bcab1e43b09bc6894414bde928 | |
parent | Add -f, --file & -m, --md5 options to override mirrorselect-test file used. (diff) | |
download | mirrorselect-6a703ce2d162d96df2a08124e3d3ca3d2f657f07.tar.gz mirrorselect-6a703ce2d162d96df2a08124e3d3ca3d2f657f07.tar.bz2 mirrorselect-6a703ce2d162d96df2a08124e3d3ca3d2f657f07.zip |
refactor Deep classes deeptime()
Thanks to Douglas Freed, fixed many errors,
including dns errors on my system.
Adds improved debug reporting.
Adds total download failures output to the results.
-rw-r--r-- | mirrorselect/selectors.py | 65 |
1 files changed, 37 insertions, 28 deletions
diff --git a/mirrorselect/selectors.py b/mirrorselect/selectors.py index 2c7bac8..4da6156 100644 --- a/mirrorselect/selectors.py +++ b/mirrorselect/selectors.py @@ -39,11 +39,13 @@ import hashlib if sys.version_info[0] >= 3: import urllib.request, urllib.parse, urllib.error url_parse = urllib.parse.urlparse + url_unparse = urllib.parse.urlunparse url_open = urllib.request.urlopen else: import urllib import urlparse url_parse = urlparse.urlparse + url_unparse = urlparse.urlunparse url_open = urllib.urlopen @@ -200,9 +202,7 @@ class Deep(object): elif options.ipv6: addr_families.append(socket.AF_INET6) else: - addr_families.append(socket.AF_INET) - if socket.has_ipv6: - addr_families.append(socket.AF_INET6) + addr_families.append(socket.AF_UNSPEC) self._addr_families = addr_families @@ -219,6 +219,7 @@ class Deep(object): maxtime = self._download_timeout hosts = [host[0] for host in self._hosts] num_hosts = len(hosts) + self.dl_failures = 0 for host in hosts: @@ -252,7 +253,9 @@ class Deep(object): #self.output.write('deeptest(): adding rethost %s, %s' % (key, top_hosts[key]), 2) rethosts.append(top_hosts[key]) - self.output.write('deeptest(): final rethost %s' % (rethosts), 2) + self.output.write('deeptest(): final rethost %s\n' % (rethosts), 2) + self.output.write('deeptest(): final md5 failures %s of %s\n' + % (self.dl_failures, num_hosts), 2) self.urls = rethosts @@ -280,40 +283,38 @@ class Deep(object): signal.signal(signal.SIGALRM, timeout_handler) ips = [] - for family in self._addr_families: - ipv6 = family == socket.AF_INET6 + for addr_family in self._addr_families: try: - try: - signal.alarm(self._dns_timeout) - for family, socktype, proto, canonname, sockaddr in \ - socket.getaddrinfo(url_parts.hostname, None, - family, socket.SOCK_STREAM): - ip = sockaddr[0] - if ipv6: - ip = "[%s]" % ip - ips.append(ip) - finally: - signal.alarm(0) + signal.alarm(self._dns_timeout) + for result in socket.getaddrinfo(url_parts.hostname, None, + addr_family, socket.SOCK_STREAM, 0, socket.AI_ADDRCONFIG): + family, _, __, ___, sockaddr = result + ip = sockaddr[0] + if family == socket.AF_INET6: + ip = "[%s]" % ip + ips.append(ip) except socket.error as e: - self.output.write('deeptime(): dns error for host %s: %s\n' % \ - (url_parts.hostname, e), 2) + self.output.write('deeptime(): dns error for host %s: %s\n' % (url_parts.hostname, e), 2) except TimeoutException: - self.output.write('deeptime(): dns timeout for host %s\n' % \ - (url_parts.hostname,), 2) + self.output.write('deeptime(): dns timeout for host %s\n' % url_parts.hostname, 2) + finally: + signal.alarm(0) if not ips: - self.output.write('deeptime(): unable to resolve ip for host %s\n' % \ - (url_parts.hostname,), 2) + self.output.write('deeptime(): unable to resolve ip for host %s\n' % url_parts.hostname, 2) return (None, True) delta = 0 f = None for ip in ips: + test_parts = url_parts._replace(netloc=ip) + test_url = url_unparse(test_parts) + self.output.write('deeptime(): testing url: %s\n' % test_url, 2) try: try: signal.alarm(self._connect_timeout) - f = url_open(url) + f = url_open(test_url) break finally: signal.alarm(0) @@ -324,7 +325,7 @@ class Deep(object): except TimeoutException: self.output.write(('deeptime(): connection to host %s ' + \ 'timed out for ip %s\n') % \ - (url_parts.hostname, ip), 2) + (test_parts.hostname, ip), 2) if f is None: self.output.write('deeptime(): unable to ' + \ @@ -355,13 +356,21 @@ class Deep(object): try: signal.alarm(int(math.ceil(maxtime))) stime = time.time() - f = url_open(url) + f = url_open(test_url) - if hashlib.md5(f.read()).hexdigest() != "bdf077b2e683c506bf9e8f2494eeb044": - return (None, True) + md5 = hashlib.md5(f.read()).hexdigest() delta = time.time() - stime f.close() + if md5 != self.test_md5: + self.output.write( + "deeptime(): md5sum error for file: %s\n" % self.test_file + + " expected: %s\n" % self.test_md5 + + " got.....: %s\n" % md5 + + " host....: %s, %s\n" % (url_parts.hostname, ip)) + self.dl_failures += 1 + return (None, True) + finally: signal.alarm(0) |