mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-25 03:17:13 +00:00
65 lines
1.5 KiB
Nix
65 lines
1.5 KiB
Nix
|
# This module adds a scripted iPXE entry to the GRUB boot menu.
|
||
|
|
||
|
{ config, lib, pkgs, ... }:
|
||
|
|
||
|
with lib;
|
||
|
|
||
|
let
|
||
|
scripts = builtins.attrNames config.boot.loader.grub.ipxe;
|
||
|
|
||
|
grubEntry = name:
|
||
|
''
|
||
|
menuentry "iPXE - ${name}" {
|
||
|
linux16 @bootRoot@/ipxe.lkrn
|
||
|
initrd16 @bootRoot@/${name}.ipxe
|
||
|
}
|
||
|
|
||
|
'';
|
||
|
|
||
|
scriptFile = name:
|
||
|
let
|
||
|
value = builtins.getAttr name config.boot.loader.grub.ipxe;
|
||
|
in
|
||
|
if builtins.typeOf value == "path" then value
|
||
|
else builtins.toFile "${name}.ipxe" value;
|
||
|
in
|
||
|
{
|
||
|
options =
|
||
|
{ boot.loader.grub.ipxe = mkOption {
|
||
|
type = types.attrsOf (types.either types.path types.str);
|
||
|
description =
|
||
|
''
|
||
|
Set of iPXE scripts available for
|
||
|
booting from the GRUB boot menu.
|
||
|
'';
|
||
|
default = { };
|
||
|
example = literalExample ''
|
||
|
{ demo = '''
|
||
|
#!ipxe
|
||
|
dhcp
|
||
|
chain http://boot.ipxe.org/demo/boot.php
|
||
|
''';
|
||
|
};
|
||
|
'';
|
||
|
};
|
||
|
};
|
||
|
|
||
|
config = mkIf (builtins.length scripts != 0) {
|
||
|
|
||
|
boot.loader.grub.extraEntries =
|
||
|
if config.boot.loader.grub.version == 2 then
|
||
|
toString (map grubEntry scripts)
|
||
|
else
|
||
|
throw "iPXE is not supported with GRUB 1.";
|
||
|
|
||
|
boot.loader.grub.extraFiles =
|
||
|
{ "ipxe.lkrn" = "${pkgs.ipxe}/ipxe.lkrn"; }
|
||
|
//
|
||
|
builtins.listToAttrs ( map
|
||
|
(name: { name = name+".ipxe"; value = scriptFile name; })
|
||
|
scripts
|
||
|
);
|
||
|
};
|
||
|
|
||
|
}
|