]>
Commit | Line | Data |
---|---|---|
5470bdf1 MT |
1 | #!/usr/bin/python |
2 | ||
3 | import logging | |
4 | import os | |
5 | import tornado.httpserver | |
6 | import tornado.ioloop | |
7 | import tornado.locale | |
8 | import tornado.options | |
9 | import tornado.web | |
10 | ||
8b9b631e | 11 | import backend |
5470bdf1 | 12 | |
9068dba1 MT |
13 | from handlers_base import BaseHandler |
14 | ||
5470bdf1 MT |
15 | BASEDIR = os.path.dirname(__file__) |
16 | ||
a9bf3cbe | 17 | def word_wrap(s, width=45): |
7261a759 MT |
18 | paragraphs = s.split('\n') |
19 | lines = [] | |
20 | for paragraph in paragraphs: | |
21 | while len(paragraph) > width: | |
22 | pos = paragraph.rfind(' ', 0, width) | |
23 | if not pos: | |
24 | pos = width | |
25 | lines.append(paragraph[:pos]) | |
26 | paragraph = paragraph[pos:] | |
a9bf3cbe | 27 | lines.append(paragraph.lstrip()) |
7261a759 | 28 | return '\n'.join(lines) |
5470bdf1 | 29 | |
9068dba1 MT |
30 | class BootBaseHandler(BaseHandler): |
31 | pass | |
5470bdf1 MT |
32 | |
33 | ||
8e2e1261 | 34 | class MenuGPXEHandler(BootBaseHandler): |
5470bdf1 MT |
35 | """ |
36 | menu.gpxe | |
37 | """ | |
38 | def get(self): | |
e847f85c MT |
39 | # Check if version of the bootloader is recent enough. |
40 | # Otherwise send the latest version of the PXE loader. | |
41 | user_agent = self.request.headers.get("User-Agent", None) | |
42 | if user_agent: | |
43 | try: | |
44 | client, version = user_agent.split("/") | |
45 | except: | |
46 | pass | |
47 | else: | |
48 | # We replaced gPXE by iPXE. | |
49 | if client == "gPXE": | |
50 | return self.serve_update() | |
51 | ||
52 | # Everything under version 1.0.0 should be | |
53 | # updated. | |
54 | if version < "1.0.0": | |
55 | return self.serve_update() | |
5470bdf1 MT |
56 | |
57 | # Devliver content | |
58 | self.set_header("Content-Type", "text/plain") | |
59 | self.write("#!gpxe\n") | |
e847f85c MT |
60 | |
61 | self.write("set 209:string premenu.cfg\n") | |
62 | self.write("set 210:string http://boot.ipfire.org/\n") | |
63 | self.write("chain pxelinux.0\n") | |
64 | ||
65 | def serve_update(self): | |
66 | self.set_header("Content-Type", "text/plain") | |
67 | self.write("#!gpxe\n") | |
68 | ||
69 | # Small warning | |
70 | self.write("echo\necho Your copy of gPXE/iPXE is too old. ") | |
71 | self.write("Upgrade to avoid seeing this every boot!\n") | |
72 | ||
73 | self.write("chain http://mirror0.ipfire.org/releases/ipfire-boot/latest/ipxe.kpxe\n") | |
5470bdf1 MT |
74 | |
75 | ||
8e2e1261 | 76 | class MenuCfgHandler(BootBaseHandler): |
5470bdf1 MT |
77 | def get(self): |
78 | self.set_header("Content-Type", "text/plain") | |
79 | ||
9068dba1 MT |
80 | latest_release = self.releases.get_latest() |
81 | stable_releases = self.releases.get_stable() | |
82 | try: | |
83 | stable_releases.remove(latest_release) | |
84 | except ValueError: | |
85 | pass | |
86 | ||
87 | development_releases = self.releases.get_unstable() | |
5470bdf1 | 88 | |
9068dba1 MT |
89 | self.render("netboot/menu.cfg", latest_release=latest_release, |
90 | stable_releases=stable_releases, development_releases=development_releases) |