[pacman-dev] rankmirrors script

Dan McGee dpmcgee at gmail.com
Fri Dec 8 14:47:14 EST 2006


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 at 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]




More information about the pacman-dev mailing list