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):
- @property
- def netboot(self):
- return backend.NetBoot()
+class BootBaseHandler(BaseHandler):
+ pass
class MenuGPXEHandler(BootBaseHandler):
menu.gpxe
"""
def get(self):
- # XXX Check if version of the bootloader is allright
+ # Check if version of the bootloader is recent enough.
+ # Otherwise send the latest version of the PXE loader.
+ user_agent = self.request.headers.get("User-Agent", None)
+ if user_agent:
+ try:
+ client, version = user_agent.split("/")
+ except:
+ pass
+ else:
+ # We replaced gPXE by iPXE.
+ if client == "gPXE":
+ return self.serve_update()
+
+ # Everything under version 1.0.0 should be
+ # updated.
+ if version < "1.0.0":
+ return self.serve_update()
# Devliver content
self.set_header("Content-Type", "text/plain")
self.write("#!gpxe\n")
- self.write("chain menu.c32 premenu.cfg\n")
-
-
-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 = []
-
- ident = "\t" * level
-
- if entry.type == "seperator":
- lines.append(ident + "menu separator")
- elif entry.type == "header":
- lines.append(ident + "menu begin %d" % entry.id)
- lines.append(ident + "\tmenu title %s" % entry.title)
+ self.write("set 209:string premenu.cfg\n")
+ self.write("set 210:string http://boot.ipfire.org/\n")
+ self.write("chain pxelinux.0\n")
- # 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 serve_update(self):
+ self.set_header("Content-Type", "text/plain")
+ self.write("#!gpxe\n")
- lines.append("%s" % self._menu_string(entry.submenu, level=level+1))
- lines.append(ident + "menu end")
+ # Small warning
+ self.write("echo\necho Your copy of gPXE/iPXE is too old. ")
+ self.write("Upgrade to avoid seeing this every boot!\n")
- elif entry.type == "config":
- lines.append(ident + "label %d" % entry.id)
- lines.append(ident + "\tmenu label %s" % entry.title)
- if entry.description:
- lines.append(ident + "\ttext help")
- lines.append(word_wrap(entry.description))
- lines.append(ident + "\tendtext")
- lines.append(ident + "\tkernel /config/%s/boot.gpxe" % entry.item)
+ self.write("chain http://mirror0.ipfire.org/releases/ipfire-boot/latest/ipxe.kpxe\n")
- return "\n".join(lines + [""])
+class MenuCfgHandler(BootBaseHandler):
def get(self):
self.set_header("Content-Type", "text/plain")
- menu = self._menu_string(self.netboot.get_menu(1))
-
- self.render("menu.cfg", menu=menu)
-
-
-class BootGPXEHandler(BootBaseHandler):
- def get(self, id):
- config = self.netboot.get_config(id)
- if not config:
- raise tornado.web.HTTPError(404, "Configuration with ID '%s' was not found" % id)
-
- lines = ["#!gpxe", "imgfree",]
-
- line = "kernel -n img %s" % config.image1
- if line.endswith(".iso"):
- line += " iso"
- if config.args:
- line += " %s" % config.args
- lines.append(line)
-
- if config.image2:
- lines.append("initrd -n img %s" % config.image2)
+ latest_release = self.releases.get_latest()
+ stable_releases = self.releases.get_stable()
+ try:
+ stable_releases.remove(latest_release)
+ except ValueError:
+ pass
- lines.append("boot img")
+ development_releases = self.releases.get_unstable()
- for line in lines:
- self.write("%s\n" % line)
+ self.render("netboot/menu.cfg", latest_release=latest_release,
+ stable_releases=stable_releases, development_releases=development_releases)