import backend
+from handlers_base import BaseHandler
+
BASEDIR = os.path.dirname(__file__)
def word_wrap(s, width=45):
lines.append(paragraph.lstrip())
return '\n'.join(lines)
-class BootBaseHandler(tornado.web.RequestHandler):
+class BootBaseHandler(BaseHandler):
+ @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 netboot(self):
- return backend.NetBoot()
+ 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):
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):
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")
-class MenuCfgHandler(BootBaseHandler):
- def _menu_string(self, menu, level=0):
- s = ""
-
- for entry in menu:
- s += self._menu_entry(entry, level=level)
-
- return s
-
- def _menu_entry(self, entry, level=0):
- lines = []
+ self.render("netboot/premenu.cfg", arch=self.arch, platform=self.platform)
- ident = "\t" * level
- if entry.type == "seperator":
- lines.append(ident + "menu separator")
+class MenuCfgHandler(BootBaseHandler):
+ class NightlyBuildReleaseDummy(object):
+ id = 100
+ name = "Nightly Build"
+ sname = "nightly-build"
- elif entry.type == "header":
- lines.append(ident + "menu begin %d" % entry.id)
- lines.append(ident + "\tmenu title %s" % entry.title)
+ def supports_arch(self, arch):
+ return arch in ("i586", "x86_64")
- # Add "Back..." entry
- lines.append(ident + "\tlabel %d.back" % entry.id)
- lines.append(ident + "\t\tmenu label Back...")
- lines.append(ident + "\t\tmenu exit")
- lines.append(ident + "\tmenu separator")
+ def supports_platform(self, platform):
+ return platform == "pcbios"
- lines.append("%s" % self._menu_string(entry.submenu, level=level+1))
- lines.append(ident + "menu end")
+ def netboot_kernel_url(self, arch, platform):
+ return "http://nightly.ipfire.org/next/latest/%s/images/vmlinuz" % arch
- elif entry.type == "config":
- config = self.netboot.get_config(entry.item)
+ def netboot_initrd_url(self, arch, platform):
+ return "http://nightly.ipfire.org/next/latest/%s/images/instroot" % arch
- lines.append(ident + "label %d" % config.id)
- lines.append(ident + "\tmenu label %s" % config.title)
- if config.description:
- lines.append(ident + "\ttext help")
- lines.append(word_wrap(config.description))
- lines.append(ident + "\tendtext")
+ def netboot_args(self, arch, platform):
+ return "installer.download-url=http://nightly.ipfire.org/next/latest/%s/images/installer.iso" % arch
- lines.append(ident + "\tkernel %s" % config.image1)
- if config.image2:
- lines.append(ident + "\tinitrd %s" % config.image2)
- if config.args:
- lines.append(ident + "\tappend %s" % config.args)
+ def is_netboot_capable(self):
+ return True
- return "\n".join(lines + [""])
+ nightly_build = NightlyBuildReleaseDummy()
def get(self):
self.set_header("Content-Type", "text/plain")
- menu = self._menu_string(self.netboot.get_menu(1))
+ latest_release = self.releases.get_latest()
+ 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 = [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", menu=menu)
+ self.render("netboot/menu.cfg", latest_release=latest_release,
+ stable_releases=stable_releases, development_releases=development_releases,
+ arch=self.arch, platform=self.platform)