From: Michael Tremer Date: Sat, 16 Aug 2008 16:01:57 +0000 (+0200) Subject: Replaced the rediretor by a new faster one. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=16d373bc2b3f815e83da583edc3d95c4c9642cdc;p=ipfire.org.git Replaced the rediretor by a new faster one. --- diff --git a/download/getfile.py b/download/getfile.py index d6c1e641..a5e24c31 100644 --- a/download/getfile.py +++ b/download/getfile.py @@ -1,56 +1,142 @@ #!/usr/bin/python -# This is a short script for spread our files... +import os +import random +import urllib2 +import urlparse +import cgi +from mimetypes import guess_type -import cgi, random, urllib2, sys +debug = None #open("debug.log", "a") -def redirect(url): - print 'Status: 302 Moved Temporarily' - print 'Location:', url - print 'Pragma: no-cache' - print 'Content-Type: text/html' - print +hosts = ( +# PRIO SCHEME HOSTNAME PATH + ( 2, "http", "mirror1.ipfire.org", "/",), + ( 4, "http", "mirror2.ipfire.org", "/",), + ( 8, "http", "www.rowie.at", "/ipfire/",), + ( 8, "http", "ipfire.earl-net.com", "/",), + ( 8, "http", "ipfire.kbarthel.de", "/",), + ( 8, "http", "ipfire.1l0v3u.com", "/",), + ( 4, "http", "hex2.sv-altikon.ch", "/ipfire/",), +) + +def rnd(servers): + return random.randint(0, len(servers)-1) -def notfound(): - print 'Status: 404 Not Found' - print 'Pragma: no-cache' +def servefile(file): + mimetype = guess_type(file)[0] or "text/plain" + f = open(file, "rb") + size = os.fstat(f.fileno()).st_size + print "Status: 200 OK" + print "Content-Type:", mimetype + if size: + print "Content-Length:", size print - -def selectserver(filename): - servers = [] - f = open("mirrorlist") - while True: - line = f.readline() - if len(line) == 0: - break # EOF - line = line.rstrip('\n') - servers.append(line) + print f.read(), f.close() - - while True: - if len(servers) == 0: - url = "None" - break - rand = random.randint(0, len(servers)-1) - url = "%s/%s" % (servers[rand], cgi.escape(filename)) - try: - req = urllib2.Request(url) - req.add_header('User-Agent', 'IPFire/DownloadScript-1.0') - urllib2.urlopen(req) - except urllib2.HTTPError, e: - servers.pop(rand) - except urllib2.URLError, e: - servers.pop(rand) + +class Server: + def __init__(self, scheme="http", hostname=None, path=None, priority=0): + self.hostname = hostname + self.path = path + + self.scheme = scheme + self.priority = priority + + def url(self): + return "%s://%s%s" % (self.scheme, self.hostname, self.path) + + def __str__(self): + return self.url() + + def __repr__(self): + return "<%s.%s %s>" % (__name__, __class__, self.__str__()) + + def noping(self): + return os.system("ping -c1 -w1 %s &>/dev/null" % self.hostname) + + def file(self, file): + ret = None + try: + f = urllib2.urlopen("%s" % urlparse.urljoin(self.url(), file)) + except (urllib2.HTTPError, urllib2.URLError), e: + if debug: + debug.write("ERR %s %s\n" % (self.url(), e)) else: - break - return url + ret = f.geturl() + f.close() + return ret + +class Servers: + def __init__(self): + self.servers = [] + self.prio_servers = [] + + def __call__(self): + return self.all() + + def all(self): + return self.servers -form = cgi.FieldStorage() -filename = form.getfirst('file') + def shuffled(self): + tmp = [] + for server in self.all(): + for priority in range(0, server.priority): + tmp.append(server) + return tmp -url = selectserver(filename) + def one(self): + servers = self.shuffled() + return servers[rnd(servers)] -if url == "None": - notfound() + def add(self, server): + self.servers.append(server) + + def rem(self, server): + tmp = [] + for host in self.all(): + if not host == server: + tmp.append(host) + self.servers = tmp + +# main() +servers = Servers() +for (priority, scheme, hostname, path) in hosts: + servers.add(Server(scheme=scheme, hostname=hostname, path=path, priority=priority)) + +file = cgi.FieldStorage().getfirst("file") + +while servers.all(): + server = servers.one() + + if server.noping(): + servers.rem(server) + continue + + url = server.file(file) + if not url: + servers.rem(server) + continue + + print "Status: 302 Moved Temporarily" + print "Location:", url + print "Pragma: no-cache" + print + + if debug: + debug.write("OK %s\n" % url) + + break else: - redirect(url) + if os.access(file, os.R_OK): + servefile(file) + else: + print "Status: 404 Not Found" + print "Pragma: no-cache" + print + + if debug: + debug.write("ERR %s wasn't found on any server" % file) + +if debug: + debug.close() diff --git a/download/mirrorlist b/download/mirrorlist deleted file mode 100644 index 88056684..00000000 --- a/download/mirrorlist +++ /dev/null @@ -1,6 +0,0 @@ -http://mirror1.ipfire.org -http://www.rowie.at/ipfire -http://ipfire.earl-net.com -http://ipfire.kbarthel.de -http://ipfire.1l0v3u.com -http://hex2.sv-altikon.ch/ipfire