Here is a alternative to the current sortmirrrors script. It was designed to address this bug: http://bugs.archlinux.org/task/2952. It does not touch your current mirror lists, it simply reads them and outputs timing information for each, and outputs a Server format that can be used in the mirrors list. I've never done any python before, and this is heavily based off the script found in the forums but slightly refined to do different and slightly more intuitive output. (http://bbs.archlinux.org/viewtopic.php?t=19278&sid=475ab18a5d9b31952459fd9912d20d19) Dan __________________________________ #! /usr/bin/python # # rankmirrors : read a list of mirrors from a file and rank them by speed # # Original Idea copyright (c) 2006 R.G. <chesercat> # Modified 2006 by Dan McGee <dpmcgee@gmail.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # import sys, time, socket, urllib2 from optparse import OptionParser socket.setdefaulttimeout(10) def createOptParser(): parser = OptionParser() parser.add_option("-n", dest="num", default=0, help="number of servers to print, 0 for all") parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, help="be verbose in output") return parser def timeCmd(cmd): before = time.time(); try: cmd(); except KeyboardInterrupt, ki: raise ki except socket.timeout, ioe: return 'timeout' except Exception, e: return 'unreachable' return time.time() - before; def talkToServer(serverUrl): opener = urllib2.build_opener() tmp = opener.open(serverUrl).read() def getFuncToTime(serverUrl): return lambda : talkToServer(serverUrl) def cmpPairBySecond(p1, p2): if p1[1] == p2[1]: return 0 if p1[1] < p2[1]: return -1 return 1 if __name__ == "__main__": parser = createOptParser() (options, args) = parser.parse_args() if len(args) != 1: parser.print_help() sys.exit(0) fl = open(args[0], 'r') serverToTime = {} print 'Querying servers, this may take some time...' for ln in fl.readlines(): splitted = ln.split('=') if splitted[0].strip() != 'Server': continue serverUrl = splitted[1].strip() if serverUrl[-1] == '\n': serverUrl = serverUrl[0:-1] if options.verbose: print serverUrl, '...', else: print ' * ', sys.stdout.flush() serverToTime[serverUrl] = timeCmd(getFuncToTime(serverUrl)) if options.verbose: print serverToTime[serverUrl] items = serverToTime.items() items.sort(cmpPairBySecond) numToShow = int(options.num) if numToShow == 0: numToShow = len(items) if len(items) > 0: print print ' Servers sorted by time:' print for i in items[0:numToShow]: print i[1], ':', i[0] if len(items) > 0: print print ' Server list format:' print for i in items[0:numToShow]: print 'Server =', i[0]