{{ _("Install %s...") % release.name }}
endtext
- kernel {{ release.netboot_kernel }}
- initrd {{ release.netboot_initrd }}
- append vga=791
+ kernel {{ release.netboot_kernel_url(arch, platform) }}
+ initrd {{ release.netboot_initrd_url(arch, platform) }}
+ append {{ release.netboot_args(arch, platform) }} vga=791
{% module NetBootMenuSeparator() %}
{{ _("Install in text mode.") }}
endtext
- kernel {{ release.netboot_kernel }}
- initrd {{ release.netboot_initrd }}
+ kernel {{ release.netboot_kernel_url(arch, platform) }}
+ initrd {{ release.netboot_initrd_url(arch, platform) }}
+ {% if release.netboot_args(arch, platform) %}append {{ release.netboot_args(arch, platform) }}{% end %}
{% if release.id >= 75 %}
label {{ release.sname }}.scon
{{ _("Install with serial console.") }}
endtext
- kernel {{ release.netboot_kernel }}
- initrd {{ release.netboot_initrd }}
- append console=ttyS0,115200 novga
+ kernel {{ release.netboot_kernel_url(arch, platform) }}
+ initrd {{ release.netboot_initrd_url(arch, platform) }}
+ append {{ release.netboot_args(arch, platform) }} console=ttyS0,115200 novga
{% end %}
{% module NetBootMenuSeparator() %}
menu label {{ _("Back...") }}
menu exit
menu end
+{% comment new line %}
{% module NetBootMenuSeparator() %}
- {% for r in [r for r in releases if r.is_netboot_capable()] %}{% module NetBootMenuConfig(r) %}{% end %}
+ {% for r in [r for r in releases if r.is_netboot_capable()] %}{% module NetBootMenuConfig(r, arch=arch, platform=platform) %}{% end %}
menu end
menu background boot.png
prompt 0
-menu title {{ _("IPFire boot menu") }}
+menu title {{ _("IPFire boot menu") }} ({{ arch }})
-{% module NetBootMenuConfig(latest_release) %}
+{% if latest_release %}
+ {% module NetBootMenuConfig(latest_release, arch=arch, platform=platform) %}
+ {% module NetBootMenuSeparator() %}
+{% end %}
-{% module NetBootMenuSeparator() %}
+{% if stable_releases %}
+ {% module NetBootMenuHeader(_("Stable releases"), stable_releases, arch=arch, platform=platform) %}
+{% end %}
-{% module NetBootMenuHeader(_("Stable releases"), stable_releases) %}
-{% module NetBootMenuHeader(_("Development releases"), development_releases) %}
+{% if development_releases %}
+ {% module NetBootMenuHeader(_("Development releases"), development_releases, arch=arch, platform=platform) %}
+{% end %}
+
+{% if arch == "x86_64" %}
+ menu separator
+
+ label change.to.i586
+ text help
+{{ _("You can as well install a 32-bit version of IPFire") }}
+ endtext
+ menu label {{ _("Change to i586") }}
+ kernel vesamenu.c32
+ append premenu.cfg?arch=i586&platform={{ platform }}
+{% end %}
endtext
menu label Graphical menu
kernel vesamenu.c32
- append menu.cfg
+ append menu.cfg?arch={{ arch }}&platform={{ platform }}
label text
menu label Text menu
Use this menu if the graphical menu does not work on your system.
endtext
kernel menu.c32
- append menu.cfg
+ append menu.cfg?arch={{ arch }}&platform={{ platform }}
(r"/", tornado.web.RedirectHandler, { "url" : "http://www.ipfire.org/download" }),
# Configurations
+ (r"/premenu.cfg", PremenuCfgHandler),
(r"/menu.gpxe", MenuGPXEHandler),
(r"/menu.cfg", MenuCfgHandler),
# Static files
- (r"/(boot\.png|premenu\.cfg|pxelinux\.0|menu\.c32|vesamenu\.c32)",
+ (r"/(boot\.png|pxelinux\.0|menu\.c32|vesamenu\.c32)",
tornado.web.StaticFileHandler, { "path" : BOOT_STATIC_PATH }),
])
if f:
f.close()
+ def supports_arch(self, arch):
+ # Currently there is nothing else than i586 supported
+ if arch == "i586":
+ return True
+
+ return False
+
+ def supports_platform(self, platform):
+ # Currently there is nothing else than pcbios supported
+ if platform == "pcbios":
+ return True
+
+ return False
+
def is_netboot_capable(self):
return self.path and "ipfire-2.x" in self.path
- @property
- def netboot_kernel(self):
+ def netboot_kernel_url(self, arch, platform):
+ assert self.supports_arch(arch)
+ assert self.supports_platform(platform)
+
return "http://downloads.ipfire.org/%s/images/vmlinuz" % self.path
- @property
- def netboot_initrd(self):
+ def netboot_initrd_url(self, arch, platform):
+ assert self.supports_arch(arch)
+ assert self.supports_platform(platform)
+
return "http://downloads.ipfire.org/%s/images/instroot" % self.path
+ def netboot_args(self, arch, platform):
+ return ""
+
@property
def news_id(self):
return self.__data.news_id
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):
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")
+
+ self.render("netboot/premenu.cfg", arch=self.arch, platform=self.platform)
+
class MenuCfgHandler(BootBaseHandler):
class NightlyBuildReleaseDummy(object):
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
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)
class NetBootMenuConfigModule(UIModule):
- def render(self, release):
- return self.render_string("netboot/menu-config.cfg", release=release)
+ def render(self, release, arch=None, platform=None):
+ return self.render_string("netboot/menu-config.cfg", release=release,
+ arch=arch, platform=platform)
class NetBootMenuHeaderModule(UIModule):
- def render(self, title, releases):
+ def render(self, title, releases, arch=None, platform=None):
id = unicodedata.normalize("NFKD", unicode(title)).encode("ascii", "ignore")
id = re.sub(r"[^\w]+", " ", id)
id = "-".join(id.lower().strip().split())
return self.render_string("netboot/menu-header.cfg", id=id,
- title=title, releases=releases)
+ title=title, releases=releases, arch=arch, platform=platform)
class NetBootMenuSeparatorModule(UIModule):