]> git.ipfire.org Git - ipfire.org.git/blob - download/getfile.py
Added mirror5.ipfire.org to the load balancer.
[ipfire.org.git] / download / getfile.py
1 #!/usr/bin/python
2
3 import os
4 import random
5 import urllib2
6 import urlparse
7 import cgi
8 from mimetypes import guess_type
9
10 debug = None #open("debug.log", "a")
11
12 hosts = (
13 # PRIO SCHEME HOSTNAME PATH
14 ( 2, "http", "mirror1.ipfire.org", "/",),
15 ( 4, "http", "mirror2.ipfire.org", "/",),
16 ( 4, "http", "mirror5.ipfire.org", "/",),
17 ( 8, "http", "www.rowie.at", "/ipfire/",),
18 ( 8, "http", "ipfire.earl-net.com", "/",),
19 ( 8, "http", "ipfire.kbarthel.de", "/",),
20 ( 8, "http", "ipfire.1l0v3u.com", "/",),
21 ( 4, "http", "hex2.sv-altikon.ch", "/ipfire/",),
22 ( 8, "http", "ipfire.wintertech.de", "/",),
23 )
24
25 def rnd(servers):
26 return random.randint(0, len(servers)-1)
27
28 def servefile(file):
29 mimetype = guess_type(file)[0] or "text/plain"
30 f = open(file, "rb")
31 size = os.fstat(f.fileno()).st_size
32 print "Status: 200 OK"
33 print "Content-Type:", mimetype
34 if size:
35 print "Content-Length:", size
36 print
37 print f.read(),
38 f.close()
39
40 class Server:
41 def __init__(self, scheme="http", hostname=None, path=None, priority=0):
42 self.hostname = hostname
43 self.path = path
44
45 self.scheme = scheme
46 self.priority = priority
47
48 def url(self):
49 return "%s://%s%s" % (self.scheme, self.hostname, self.path)
50
51 def __str__(self):
52 return self.url()
53
54 def __repr__(self):
55 return "<%s.%s %s>" % (__name__, __class__, self.__str__())
56
57 def noping(self):
58 return os.system("ping -c1 -w1 %s &>/dev/null" % self.hostname)
59
60 def file(self, file):
61 ret = None
62 try:
63 f = urllib2.urlopen("%s" % urlparse.urljoin(self.url(), file))
64 except (urllib2.HTTPError, urllib2.URLError), e:
65 if debug:
66 debug.write("ERR %s %s\n" % (self.url(), e))
67 else:
68 ret = f.geturl()
69 f.close()
70 return ret
71
72 class Servers:
73 def __init__(self):
74 self.servers = []
75 self.prio_servers = []
76
77 def __call__(self):
78 return self.all()
79
80 def all(self):
81 return self.servers
82
83 def shuffled(self):
84 tmp = []
85 for server in self.all():
86 for priority in range(0, server.priority):
87 tmp.append(server)
88 return tmp
89
90 def one(self):
91 servers = self.shuffled()
92 return servers[rnd(servers)]
93
94 def add(self, server):
95 self.servers.append(server)
96
97 def rem(self, server):
98 tmp = []
99 for host in self.all():
100 if not host == server:
101 tmp.append(host)
102 self.servers = tmp
103
104 # main()
105 servers = Servers()
106 for (priority, scheme, hostname, path) in hosts:
107 servers.add(Server(scheme=scheme, hostname=hostname, path=path, priority=priority))
108
109 file = cgi.FieldStorage().getfirst("file")
110
111 while servers.all():
112 server = servers.one()
113
114 if server.noping():
115 servers.rem(server)
116 continue
117
118 url = server.file(file)
119 if not url:
120 servers.rem(server)
121 continue
122
123 print "Status: 302 Moved Temporarily"
124 print "Location:", url
125 print "Pragma: no-cache"
126 print
127
128 if debug:
129 debug.write("OK %s\n" % url)
130
131 break
132 else:
133 if os.access(file, os.R_OK):
134 servefile(file)
135 else:
136 print "Status: 404 Not Found"
137 print "Pragma: no-cache"
138 print
139
140 if debug:
141 debug.write("ERR %s wasn't found on any server" % file)
142
143 if debug:
144 debug.close()