]>
git.ipfire.org Git - ipfire.org.git/blob - src/web/handlers_boot.py
5 import tornado
.httpserver
13 from handlers_base
import BaseHandler
15 BASEDIR
= os
.path
.dirname(__file__
)
17 LATEST_VERSION
= "2.0"
19 def word_wrap(s
, width
=45):
20 paragraphs
= s
.split('\n')
22 for paragraph
in paragraphs
:
23 while len(paragraph
) > width
:
24 pos
= paragraph
.rfind(' ', 0, width
)
27 lines
.append(paragraph
[:pos
])
28 paragraph
= paragraph
[pos
:]
29 lines
.append(paragraph
.lstrip())
30 return '\n'.join(lines
)
32 class BootBaseHandler(BaseHandler
):
35 arch
= self
.get_argument("arch", "i386")
36 if not arch
in ("x86_64", "i586", "i386"):
37 raise tornado
.web
.HTTPError(400, "Invalid architecture")
46 platform
= self
.get_argument("platform", "pcbios")
47 if not platform
in ("pcbios", "efi"):
48 raise tornado
.web
.HTTPError(400, "Invalid platform")
53 class MenuGPXEHandler(BootBaseHandler
):
59 version
= self
.get_argument("version", None)
60 if not version
or version
< LATEST_VERSION
:
61 return self
.serve_update()
64 self
.set_header("Content-Type", "text/plain")
65 self
.write("#!gpxe\n")
67 self
.write("set 209:string premenu.cfg?arch=%s&platform=%s\n" \
68 % (self
.arch
, self
.platform
))
69 self
.write("set 210:string http://boot.ipfire.org/\n")
70 self
.write("chain pxelinux.0\n")
72 def serve_update(self
):
73 self
.set_header("Content-Type", "text/plain")
74 self
.write("#!gpxe\n")
77 self
.write("echo\necho Your copy of gPXE/iPXE is too old. ")
78 self
.write("Upgrade to avoid seeing this every boot!\n")
80 self
.write("chain static/netboot/ipxe.kpxe\n")
83 class PremenuCfgHandler(BootBaseHandler
):
85 self
.set_header("Content-Type", "text/plain")
87 self
.render("netboot/premenu.cfg", arch
=self
.arch
, platform
=self
.platform
)
90 class MenuCfgHandler(BootBaseHandler
):
91 class NightlyBuildReleaseDummy(object):
93 name
= "Nightly Build"
94 sname
= "nightly-build"
96 def supports_arch(self
, arch
):
97 return arch
in ("i586", "x86_64")
99 def supports_platform(self
, platform
):
100 return platform
== "pcbios"
102 def netboot_kernel_url(self
, arch
, platform
):
103 return "https://nightly.ipfire.org/next/latest/%s/images/vmlinuz" % arch
105 def netboot_initrd_url(self
, arch
, platform
):
106 return "https://nightly.ipfire.org/next/latest/%s/images/instroot" % arch
108 def netboot_args(self
, arch
, platform
):
109 return "installer.download-url=https://nightly.ipfire.org/next/latest/%s/images/installer.iso" % arch
111 def is_netboot_capable(self
):
114 nightly_build
= NightlyBuildReleaseDummy()
117 self
.set_header("Content-Type", "text/plain")
119 latest_release
= self
.releases
.get_latest()
120 if latest_release
and not latest_release
.supports_arch(self
.arch
):
121 latest_release
= None
123 stable_releases
= [r
for r
in self
.releases
.get_stable()
124 if r
.supports_arch(self
.arch
) and r
.supports_platform(self
.platform
)]
126 stable_releases
.remove(latest_release
)
130 development_releases
= [r
for r
in self
.releases
.get_unstable()
131 if r
.supports_arch(self
.arch
) and r
.supports_platform(self
.platform
)]
132 development_releases
.insert(0, self
.nightly_build
)
134 self
.render("netboot/menu.cfg", latest_release
=latest_release
,
135 stable_releases
=stable_releases
, development_releases
=development_releases
,
136 arch
=self
.arch
, platform
=self
.platform
)