]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blobdiff - webapp/handlers_boot.py
netboot: Allow booting multiple architectures
[people/shoehn/ipfire.org.git] / webapp / handlers_boot.py
index 6fed8dd7878600dbdfe612a85872ed6a9f8b98e9..bccf5865f3403f494eb6d5620aae13e729b391b7 100644 (file)
@@ -28,7 +28,24 @@ def word_wrap(s, width=45):
        return '\n'.join(lines)
 
 class BootBaseHandler(BaseHandler):
-       pass
+       @property
+       def arch(self):
+               arch = self.get_argument("arch", "i386")
+               if not arch in ("x86_64", "i586", "i386"):
+                       raise tornado.web.HTTPError(400, "Invalid architecture")
+
+               if arch == "i386":
+                       arch = "i586"
+
+               return arch
+
+       @property
+       def platform(self):
+               platform = self.get_argument("platform", "pcbios")
+               if not platform in ("pcbios", "efi"):
+                       raise tornado.web.HTTPError(400, "Invalid platform")
+
+               return platform
 
 
 class MenuGPXEHandler(BootBaseHandler):
@@ -58,8 +75,9 @@ class MenuGPXEHandler(BootBaseHandler):
                self.set_header("Content-Type", "text/plain")
                self.write("#!gpxe\n")
 
-               self.write("set 209:string premenu.cfg\n")
-               self.write("set 210:string http://boot.ipfire.org/\n")
+               self.write("set 209:string premenu.cfg?arch=%s&platform=%s\n" \
+                       % (self.arch, self.platform))
+               self.write("set 210:string http://boot.dev.ipfire.org/\n")
                self.write("chain pxelinux.0\n")
 
        def serve_update(self):
@@ -72,6 +90,12 @@ class MenuGPXEHandler(BootBaseHandler):
 
                self.write("chain http://mirror0.ipfire.org/releases/ipfire-boot/latest/ipxe.kpxe\n")
 
+class PremenuCfgHandler(BootBaseHandler):
+       def get(self):
+               self.set_header("Content-Type", "text/plain")
+
+               self.render("netboot/premenu.cfg", arch=self.arch, platform=self.platform)
+
 
 class MenuCfgHandler(BootBaseHandler):
        class NightlyBuildReleaseDummy(object):
@@ -79,8 +103,20 @@ class MenuCfgHandler(BootBaseHandler):
                name = "Nightly Build"
                sname = "nightly-build"
 
-               netboot_kernel = "http://nightly.ipfire.org/next/latest/i586/images/vmlinuz"
-               netboot_initrd = "http://nightly.ipfire.org/next/latest/i586/images/instroot"
+               def supports_arch(self, arch):
+                       return arch in ("i586", "x86_64")
+
+               def supports_platform(self, platform):
+                       return platform == "pcbios"
+
+               def netboot_kernel_url(self, arch, platform):
+                       return "http://nightly.ipfire.org/next/latest/%s/images/vmlinuz" % arch
+
+               def netboot_initrd_url(self, arch, platform):
+                       return "http://nightly.ipfire.org/next/latest/%s/images/instroot" % arch
+
+               def netboot_args(self, arch, platform):
+                       return "installer.download-url=http://nightly.ipfire.org/next/latest/%s/images/installer.iso" % arch
 
                def is_netboot_capable(self):
                        return True
@@ -91,14 +127,20 @@ class MenuCfgHandler(BootBaseHandler):
                self.set_header("Content-Type", "text/plain")
 
                latest_release = self.releases.get_latest()
-               stable_releases = self.releases.get_stable()
+               if latest_release and not latest_release.supports_arch(self.arch):
+                       latest_release = None
+
+               stable_releases = [r for r in self.releases.get_stable()
+                       if r.supports_arch(self.arch) and r.supports_platform(self.platform)]
                try:
                        stable_releases.remove(latest_release)
                except ValueError:
                        pass
 
-               development_releases = self.releases.get_unstable()
+               development_releases = [r for r in self.releases.get_unstable()
+                       if r.supports_arch(self.arch) and r.supports_platform(self.platform)]
                development_releases.insert(0, self.nightly_build)
 
                self.render("netboot/menu.cfg", latest_release=latest_release,
-                       stable_releases=stable_releases, development_releases=development_releases)
+                       stable_releases=stable_releases, development_releases=development_releases,
+                       arch=self.arch, platform=self.platform)