]> git.ipfire.org Git - ipfire.org.git/blame - src/web/download.py
web: Rename base module
[ipfire.org.git] / src / web / download.py
CommitLineData
e77cd04c
MT
1#!/usr/bin/python
2
ed8116c7 3import random
e77cd04c
MT
4import tornado.web
5
124a8404 6from . import base
e77cd04c
MT
7from . import ui_modules
8
9class IndexHandler(base.BaseHandler):
10 def get(self):
11 release = self.backend.releases.get_latest()
12 if not release:
13 raise tornado.web.HTTPError(404)
14
7e8e995d
MT
15 # Cache this response for one minute
16 self.set_expires(60)
17
63e1f3a3
MT
18 # Redirect to latest release page
19 self.redirect("/download/%s" % release.slug)
e77cd04c
MT
20
21
22class ReleaseHandler(base.BaseHandler):
23 def get(self, slug):
24 release = self.backend.releases.get_by_sname(slug)
25 if not release:
26 raise tornado.web.HTTPError(404)
27
7e8e995d
MT
28 # Cache this response for ten minutes
29 self.set_expires(600)
30
e77cd04c
MT
31 self.render("download/release.html", release=release)
32
33
ed8116c7
MT
34class FileHandler(base.BaseHandler):
35 def prepare(self):
36 self.set_header("Pragma", "no-cache")
37
38 def head(self, filename):
39 self.redirect_to_mirror(filename)
40
41 def get(self, filename):
42 self.redirect_to_mirror(filename, log_download=True)
43
44 def find_mirror(self, filename):
45 exists = self.mirrors.file_exists(filename)
46 if not exists:
47 raise tornado.web.HTTPError(404, "File not found: %s" % filename)
48
49 # Find mirrors located near to the user.
50 # If we have not found any, we use a random one.
51 remote_location = self.get_remote_location()
52
53 if remote_location:
54 mirrors = self.mirrors.get_for_location(remote_location, filename=filename)
55
56 if mirrors:
57 return random.choice(mirrors)
58
59 return self.mirrors.get_random(filename=filename)
60
61 def redirect_to_mirror(self, filename, log_download=False):
62 # Find a random mirror.
63 mirror = self.find_mirror(filename)
64
65 # Construct the redirection URL.
66 download_url = mirror.build_url(filename)
67
68 # Redirect the request.
69 self.redirect(download_url)
70
71 if not log_download:
72 return
73
74 remote_location = self.get_remote_location()
75 if remote_location:
76 country_code = remote_location.country
77 else:
78 country_code = None
79
80 self.db.execute("INSERT INTO log_download(filename, mirror, country_code) \
81 VALUES(%s, %s, %s)", filename, mirror.id, country_code)