]> git.ipfire.org Git - ipfire.org.git/commitdiff
Replaced the rediretor by a new faster one.
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 16 Aug 2008 16:01:57 +0000 (18:01 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 16 Aug 2008 16:01:57 +0000 (18:01 +0200)
download/getfile.py
download/mirrorlist [deleted file]

index d6c1e641387e19eeb46b38659f5e47088c4aaabf..a5e24c313d5526be4287400633b232bca638528b 100644 (file)
 #!/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 (file)
index 8805668..0000000
+++ /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