[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