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