]>
git.ipfire.org Git - ipfire.org.git/blob - webapp/handlers_boot.py
635d3c0794b2b0d22f1fa853afefa8141f021001
5 import tornado
.httpserver
13 from handlers_base
import BaseHandler
15 BASEDIR
= os
.path
.dirname(__file__
)
17 def word_wrap(s
, width
=45):
18 paragraphs
= s
.split('\n')
20 for paragraph
in paragraphs
:
21 while len(paragraph
) > width
:
22 pos
= paragraph
.rfind(' ', 0, width
)
25 lines
.append(paragraph
[:pos
])
26 paragraph
= paragraph
[pos
:]
27 lines
.append(paragraph
.lstrip())
28 return '\n'.join(lines
)
30 class BootBaseHandler(BaseHandler
):
33 arch
= self
.get_argument("arch", "i386")
34 if not arch
in ("x86_64", "i586", "i386"):
35 raise tornado
.web
.HTTPError(400, "Invalid architecture")
44 platform
= self
.get_argument("platform", "pcbios")
45 if not platform
in ("pcbios", "efi"):
46 raise tornado
.web
.HTTPError(400, "Invalid platform")
51 class MenuGPXEHandler(BootBaseHandler
):
56 # Check if version of the bootloader is recent enough.
57 # Otherwise send the latest version of the PXE loader.
58 user_agent
= self
.request
.headers
.get("User-Agent", None)
61 client
, version
= user_agent
.split("/")
65 # We replaced gPXE by iPXE.
67 return self
.serve_update()
69 # Everything under version 1.0.0 should be
71 if version
< "1.0.0" or version
== "1.0.0+":
72 return self
.serve_update()
74 # This is an outdated git build
75 for v
in ("c4bce", "300a371"):
77 return self
.serve_update()
80 self
.set_header("Content-Type", "text/plain")
81 self
.write("#!gpxe\n")
83 self
.write("set 209:string premenu.cfg?arch=%s&platform=%s\n" \
84 % (self
.arch
, self
.platform
))
85 self
.write("set 210:string http://boot.ipfire.org/\n")
86 self
.write("chain pxelinux.0\n")
88 def serve_update(self
):
89 self
.set_header("Content-Type", "text/plain")
90 self
.write("#!gpxe\n")
93 self
.write("echo\necho Your copy of gPXE/iPXE is too old. ")
94 self
.write("Upgrade to avoid seeing this every boot!\n")
96 self
.write("chain http://mirror1.ipfire.org/releases/ipfire-boot/latest/ipxe.kpxe\n")
99 class PremenuCfgHandler(BootBaseHandler
):
101 self
.set_header("Content-Type", "text/plain")
103 self
.render("netboot/premenu.cfg", arch
=self
.arch
, platform
=self
.platform
)
106 class MenuCfgHandler(BootBaseHandler
):
107 class NightlyBuildReleaseDummy(object):
109 name
= "Nightly Build"
110 sname
= "nightly-build"
112 def supports_arch(self
, arch
):
113 return arch
in ("i586", "x86_64")
115 def supports_platform(self
, platform
):
116 return platform
== "pcbios"
118 def netboot_kernel_url(self
, arch
, platform
):
119 return "https://nightly.ipfire.org/next/latest/%s/images/vmlinuz" % arch
121 def netboot_initrd_url(self
, arch
, platform
):
122 return "https://nightly.ipfire.org/next/latest/%s/images/instroot" % arch
124 def netboot_args(self
, arch
, platform
):
125 return "installer.download-url=https://nightly.ipfire.org/next/latest/%s/images/installer.iso" % arch
127 def is_netboot_capable(self
):
130 nightly_build
= NightlyBuildReleaseDummy()
133 self
.set_header("Content-Type", "text/plain")
135 latest_release
= self
.releases
.get_latest()
136 if latest_release
and not latest_release
.supports_arch(self
.arch
):
137 latest_release
= None
139 stable_releases
= [r
for r
in self
.releases
.get_stable()
140 if r
.supports_arch(self
.arch
) and r
.supports_platform(self
.platform
)]
142 stable_releases
.remove(latest_release
)
146 development_releases
= [r
for r
in self
.releases
.get_unstable()
147 if r
.supports_arch(self
.arch
) and r
.supports_platform(self
.platform
)]
148 development_releases
.insert(0, self
.nightly_build
)
150 self
.render("netboot/menu.cfg", latest_release
=latest_release
,
151 stable_releases
=stable_releases
, development_releases
=development_releases
,
152 arch
=self
.arch
, platform
=self
.platform
)