aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mirrorselect/selectors.py')
-rw-r--r--mirrorselect/selectors.py85
1 files changed, 54 insertions, 31 deletions
diff --git a/mirrorselect/selectors.py b/mirrorselect/selectors.py
index a8f8e24..98bd698 100644
--- a/mirrorselect/selectors.py
+++ b/mirrorselect/selectors.py
@@ -29,18 +29,30 @@ Distributed under the terms of the GNU General Public License v2
"""
import math
-import os
import signal
import socket
import subprocess
import sys
import time
-import urllib
-import urlparse
import hashlib
+
+if int(sys.version[0]) == 3:
+ import urllib.request, urllib.parse, urllib.error
+ url_parse = urllib.parse
+ url_open = urllib.request.urlopen
+else:
+ import urllib
+ import urlparse
+ url_parse = urlparse.urlparse
+ url_open = urllib.urlopen
+
+
from mirrorselect.mirrorparser3 import MirrorParser3
-import codecs
+if sys.hexversion >= 0x3000000:
+ _unicode = str
+else:
+ _unicode = unicode
class Extractor(object):
@@ -95,7 +107,7 @@ class Extractor(object):
self.output.print_info('Downloading a list of mirrors...')
try:
- parser.parse(urllib.urlopen(url).read())
+ parser.parse(url_open(url).read())
except EnvironmentError:
pass
@@ -198,7 +210,7 @@ class Shallow(object):
self.output.write('ran netselect(%s, %s), and got %s\n' % (block, len(block),
host_dict), 2)
- for key in host_dict.keys():
+ for key in list(host_dict.keys()):
ret_hosts[key] = host_dict[key]
block_index += 1
@@ -206,7 +218,7 @@ class Shallow(object):
'%d hosts, in blocks of %s. %s of %s blocks complete.\n'
% (number, block_size, block_index, len(host_blocks)))
- host_ranking_keys = ret_hosts.keys()
+ host_ranking_keys = list(ret_hosts.keys())
host_ranking_keys.sort()
for rank in host_ranking_keys[:number]:
@@ -291,12 +303,12 @@ class Deep(object):
continue
self.output.write('deeptest(): got %s hosts, and returned %s\n' % (num_hosts, \
- str(top_hosts.values())), 2)
+ str(list(top_hosts.values()))), 2)
self.output.write('\n') #this just makes output nicer
#can't just return the dict.valuse, because we want the fastest mirror first...
- keys = top_hosts.keys()
+ keys = list(top_hosts.keys())
keys.sort()
rethosts = []
@@ -319,7 +331,7 @@ class Deep(object):
else:
url = url + '/distfiles/mirrorselect-test'
- url_parts = urlparse.urlparse(url)
+ url_parts = url_parse(url)
class TimeoutException(Exception):
pass
@@ -344,7 +356,7 @@ class Deep(object):
ips.append(ip)
finally:
signal.alarm(0)
- except socket.error, e:
+ except socket.error as e:
self.output.write('deeptime(): dns error for host %s: %s\n' % \
(url_parts.hostname, e), 2)
except TimeoutException:
@@ -363,11 +375,11 @@ class Deep(object):
try:
try:
signal.alarm(self._connect_timeout)
- f = urllib.urlopen(url)
+ f = url_open(url)
break
finally:
signal.alarm(0)
- except EnvironmentError, e:
+ except EnvironmentError as e:
self.output.write(('deeptime(): connection to host %s ' + \
'failed for ip %s: %s\n') % \
(url_parts.hostname, ip, e), 2)
@@ -389,7 +401,7 @@ class Deep(object):
f.close()
finally:
signal.alarm(0)
- except EnvironmentError, e:
+ except EnvironmentError as e:
self.output.write(('deeptime(): close connection to host %s ' + \
'failed for ip %s: %s\n') % \
(url_parts.hostname, ip, e), 2)
@@ -405,7 +417,7 @@ class Deep(object):
try:
signal.alarm(int(math.ceil(maxtime)))
stime = time.time()
- f = urllib.urlopen(url)
+ f = url_open(url)
if hashlib.md5(f.read()).hexdigest() != "bdf077b2e683c506bf9e8f2494eeb044":
return (None, True)
@@ -415,7 +427,7 @@ class Deep(object):
finally:
signal.alarm(0)
- except EnvironmentError, e:
+ except EnvironmentError as e:
self.output.write(('deeptime(): download from host %s ' + \
'failed for ip %s: %s\n') % \
(url_parts.hostname, ip, e), 2)
@@ -445,20 +457,20 @@ class Deep(object):
(time_host[1], time_host[0]), 2)
host_dict.update(dict([time_host]))
- times = host_dict.keys()
+ times = list(host_dict.keys())
times.sort()
else: #We need to make room in the dict before we add. Kill the slowest.
self.output.write('_list_add(): Adding host %s with a time of %s\n' %
(time_host[1], time_host[0]), 2)
- times = host_dict.keys()
+ times = list(host_dict.keys())
times.sort()
self.output.write('_list_add(): removing %s\n' % host_dict[times[-1]],
2)
del host_dict[times[-1]]
host_dict.update(dict([time_host]))
#done adding. now return the appropriate time
- times = host_dict.keys()
+ times = list(host_dict.keys())
times.sort()
if len(host_dict) < maxlen: #check again to choose new timeout
@@ -498,16 +510,17 @@ class Interactive(object):
Some sort of interactive menu thingy.
"""
if options.rsync:
- dialog = 'dialog --stdout --title "Gentoo RSYNC Mirrors"'\
- ' --radiolist "Please select your desired mirror:" 20 110 14'
+ dialog = ['dialog', '--stdout', '--title', '"Gentoo RSYNC Mirrors"',
+ '--radiolist', '"Please select your desired mirror:"',
+ '20', '110', '14']
else:
- dialog = 'dialog --separate-output --stdout --title'\
- ' "Gentoo Download Mirrors" --checklist "Please'\
- ' select your desired mirrors:'
+ dialog = ['dialog', '--separate-output', '--stdout', '--title',
+ '"Gentoo Download Mirrors"', '--checklist',
+ '"Please select your desired mirrors:']
if not options.ipv4 and not options.ipv6:
- dialog += '\n* = supports ipv6'
+ dialog[-1] += '\n* = supports ipv6'
- dialog += '" 20 110 14'
+ dialog.extend(['20', '110', '14'])
for (url, args) in sorted(hosts, key = lambda x: (x[1]['country'].lower(), x[1]['name'].lower()) ):
marker = ""
@@ -518,10 +531,20 @@ class Interactive(object):
if options.ipv6 and ( args['ipv6'] == 'n' ): continue
if options.ipv4 and ( args['ipv4'] == 'n' ): continue
- dialog += ' ' + '"%s" "%s%s: %s" "OFF"' % ( url, marker, args['country'], args['name'] )
+ #dialog.append('"%s" "%s%s: %s" "OFF"' % ( url, marker, args['country'], args['name']))
+ dialog.extend(["%s" %url,
+ "%s%s: %s" %(marker, args['country'], args['name']),
+ "OFF"])
+ dialog = [_unicode(x) for x in dialog]
+ proc = subprocess.Popen( dialog,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ out, err = proc.communicate()
+
+ self.urls = out.splitlines()
- mirror_fd = os.popen('%s' % codecs.encode(dialog, 'utf8'))
- mirrors = mirror_fd.read()
- mirror_fd.close()
+ if hasattr(self.urls[0], 'decode'):
+ self.urls = [x.decode('utf-8').rstrip() for x in self.urls]
+ else:
+ self.urls = [x.rstrip() for x in self.urls]
- self.urls = mirrors.rstrip().split('\n')