summaryrefslogtreecommitdiff
path: root/hosts/vidhar/network/dhcp/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'hosts/vidhar/network/dhcp/default.nix')
-rw-r--r--hosts/vidhar/network/dhcp/default.nix133
1 files changed, 97 insertions, 36 deletions
diff --git a/hosts/vidhar/network/dhcp/default.nix b/hosts/vidhar/network/dhcp/default.nix
index 4151111d..098d3061 100644
--- a/hosts/vidhar/network/dhcp/default.nix
+++ b/hosts/vidhar/network/dhcp/default.nix
@@ -1,9 +1,32 @@
1{ flake, config, pkgs, lib, ... }: 1{ flake, config, pkgs, lib, sources, ... }:
2 2
3with lib; 3with lib;
4 4
5let 5let
6 nfsrootBaseUrl = "http://nfsroot.vidhar.yggdrasil"; 6 nfsrootBaseUrl = "http://nfsroot.vidhar.yggdrasil";
7 tftpIp = "10.141.0.1";
8 nfsIp = tftpIp;
9 ipxe = pkgs.ipxe.override {
10 additionalTargets = {
11 "bin-i386-efi/ipxe.efi" = "i386-ipxe.efi";
12 };
13 additionalOptions = [
14 "NSLOOKUP_CMD"
15 "PING_CMD"
16 "CONSOLE_CMD"
17 ];
18 embedScript = pkgs.writeText "yggdrasil.ipxe" ''
19 #!ipxe
20
21 cpair --background 9 1
22 cpair --background 9 3
23 cpair --background 9 6
24
25 set user-class iPXE-yggdrasil
26
27 autoboot
28 '';
29 };
7in { 30in {
8 config = { 31 config = {
9 services.kea = { 32 services.kea = {
@@ -25,41 +48,67 @@ in {
25 }; 48 };
26 49
27 client-classes = [ 50 client-classes = [
28 { name = "eostre-ipxe"; 51 { name = "ipxe-eostre";
29 test = "hexstring(pkt4.mac, ':') == '00:d8:61:79:c5:40' and option[77].hex == 'iPXE'"; 52 test = "hexstring(pkt4.mac, ':') == '00:d8:61:79:c5:40' and option[77].hex == 'iPXE-yggdrasil'";
30 next-server = "10.141.0.1"; 53 next-server = tftpIp;
31 boot-file-name = "${nfsrootBaseUrl}/eostre.menu.ipxe"; 54 boot-file-name = "${nfsrootBaseUrl}/eostre.menu.ipxe";
32 only-if-required = true; 55 only-if-required = true;
33 } 56 }
34 { name = "ipxe"; 57 { name = "ipxe-yggdrasil";
35 test = "option[77].hex == 'iPXE'"; 58 test = "option[77].hex == 'iPXE-yggdrasil'";
36 next-server = "10.141.0.1"; 59 next-server = tftpIp;
37 boot-file-name = "${nfsrootBaseUrl}/installer-x86_64-linux.menu.ipxe"; 60 boot-file-name = "${nfsrootBaseUrl}/installer-x86_64-linux.menu.ipxe";
38 only-if-required = true; 61 only-if-required = true;
39 } 62 }
63
64 { name = "uefi-http";
65 test = "option[client-system].hex == 0x0010";
66 option-data = [
67 { name = "vendor-class-identifier"; data = "HTTPClient"; }
68 ];
69 boot-file-name = "${nfsrootBaseUrl}/ipxe.efi";
70 only-if-required = true;
71 }
72
73 { name = "ipxe-uefi-64";
74 test = "option[77].hex == 'iPXE' and (substring(option[60].hex,0,20) == 'PXEClient:Arch:00007' or substring(option[60].hex,0,20) == 'PXEClient:Arch:00008' or substring(option[60].hex,0,20) == 'PXEClient:Arch:00009')";
75 boot-file-name = "${nfsrootBaseUrl}/ipxe.efi";
76 only-if-required = true;
77 }
78 { name = "ipxe-uefi-32";
79 test = "option[77].hex == 'iPXE' and (substring(option[60].hex,0,20) == 'PXEClient:Arch:00002' or substring(option[60].hex,0,20) == 'PXEClient:Arch:00006')";
80 boot-file-name = "${nfsrootBaseUrl}/i386-ipxe.efi";
81 only-if-required = true;
82 }
83 { name = "ipxe-legacy";
84 test = "option[77].hex == 'iPXE' and substring(option[60].hex,0,20) == 'PXEClient:Arch:00000'";
85 boot-file-name = "${nfsrootBaseUrl}/ipxe.lkrn";
86 only-if-required = true;
87 }
88
40 { name = "uefi-64"; 89 { name = "uefi-64";
41 test = "substring(option[60].hex,0,20) == 'PXEClient:Arch:00007' or substring(option[60].hex,0,20) == 'PXEClient:Arch:00008' or substring(option[60].hex,0,20) == 'PXEClient:Arch:00009'"; 90 test = "substring(option[60].hex,0,20) == 'PXEClient:Arch:00007' or substring(option[60].hex,0,20) == 'PXEClient:Arch:00008' or substring(option[60].hex,0,20) == 'PXEClient:Arch:00009'";
42 only-if-required = true;
43 option-data = [ 91 option-data = [
44 { name = "tftp-server-name"; data = "10.141.0.1"; } 92 { name = "tftp-server-name"; data = tftpIp; }
45 ]; 93 ];
46 boot-file-name = "ipxe.efi"; 94 boot-file-name = "ipxe.efi";
95 only-if-required = true;
47 } 96 }
48 { name = "uefi-32"; 97 { name = "uefi-32";
49 test = "substring(option[60].hex,0,20) == 'PXEClient:Arch:00002' or substring(option[60].hex,0,20) == 'PXEClient:Arch:00006'"; 98 test = "substring(option[60].hex,0,20) == 'PXEClient:Arch:00002' or substring(option[60].hex,0,20) == 'PXEClient:Arch:00006'";
50 only-if-required = true;
51 option-data = [ 99 option-data = [
52 { name = "tftp-server-name"; data = "10.141.0.1"; } 100 { name = "tftp-server-name"; data = tftpIp; }
53 ]; 101 ];
54 boot-file-name = "i386-ipxe.efi"; 102 boot-file-name = "i386-ipxe.efi";
103 only-if-required = true;
55 } 104 }
56 { name = "legacy"; 105 { name = "legacy";
57 test = "substring(option[60].hex,0,20) == 'PXEClient:Arch:00000'"; 106 test = "substring(option[60].hex,0,20) == 'PXEClient:Arch:00000'";
58 only-if-required = true;
59 option-data = [ 107 option-data = [
60 { name = "tftp-server-name"; data = "10.141.0.1"; } 108 { name = "tftp-server-name"; data = tftpIp; }
61 ]; 109 ];
62 boot-file-name = "undionly.kpxe"; 110 boot-file-name = "ipxe.lkrn";
111 only-if-required = true;
63 } 112 }
64 ]; 113 ];
65 114
@@ -261,7 +310,7 @@ in {
261 installerBuild = (flake.nixosConfigurations.${"installer-${system}-nfsroot"}.extendModules { 310 installerBuild = (flake.nixosConfigurations.${"installer-${system}-nfsroot"}.extendModules {
262 modules = [ 311 modules = [
263 ({ ... }: { 312 ({ ... }: {
264 config.nfsroot.storeDevice = "10.141.0.1:nix-store"; 313 config.nfsroot.storeDevice = "${nfsIp}:nix-store";
265 config.nfsroot.registrationUrl = "${nfsrootBaseUrl}/installer-${system}/registration"; 314 config.nfsroot.registrationUrl = "${nfsrootBaseUrl}/installer-${system}/registration";
266 }) 315 })
267 ]; 316 ];
@@ -278,9 +327,12 @@ in {
278 name = "installer-${system}.menu.ipxe"; 327 name = "installer-${system}.menu.ipxe";
279 destination = "/installer-${system}.menu.ipxe"; 328 destination = "/installer-${system}.menu.ipxe";
280 text = '' 329 text = ''
330 #!ipxe
331
281 :start 332 :start
282 menu iPXE boot menu for installer-${system} 333 menu iPXE boot menu for installer-${system}
283 item installer Boot installer-${system} 334 item installer installer-${system}
335 item memtest memtest86plus
284 item netboot netboot.xyz 336 item netboot netboot.xyz
285 item shell iPXE shell 337 item shell iPXE shell
286 choose --timeout 0 --default installer selected || goto shell 338 choose --timeout 0 --default installer selected || goto shell
@@ -291,25 +343,34 @@ in {
291 goto start 343 goto start
292 344
293 :installer 345 :installer
294 chain ${nfsrootBaseUrl}/installer-${system}/netboot.ipxe 346 chain installer-${system}/netboot.ipxe
295 goto start 347 goto start
296 348
297 :netboot 349 :netboot
298 chain --autofree ${nfsrootBaseUrl}/netboot.xyz.efi 350 iseq ''${platform} efi && chain --autofree netboot.xyz.efi || chain --autofree netboot.xyz.lkrn
351 goto start
352
353 :memtest
354 iseq ''${platform} efi && chain --autofree memtest.efi || chain --autofree memtest.bin
299 goto start 355 goto start
300 ''; 356 '';
301 }) 357 })
302 ]; 358 ];
303 }) ["x86_64-linux"] 359 }) ["x86_64-linux"]
304 ) ++ [ 360 ) ++ [
305 (pkgs.linkFarm "netbootxyz-efi" [ 361 (pkgs.runCommandLocal "utils" {} ''
306 { name = "netboot.xyz.efi"; path = pkgs.netbootxyz-efi; } 362 mkdir $out
307 ]) 363 install -m 0444 -t $out \
364 ${ipxe}/{ipxe.efi,i386-ipxe.efi,ipxe.lkrn} \
365 ${pkgs.memtest86plus}/{memtest.efi,memtest.bin}
366 install -m 0444 ${sources.netbootxyz-efi.src} $out/netboot.xyz.efi
367 install -m 0444 ${sources.netbootxyz-lkrn.src} $out/netboot.xyz.lkrn
368 '')
308 (let 369 (let
309 eostreBuild = (flake.nixosConfigurations.eostre.extendModules { 370 eostreBuild = (flake.nixosConfigurations.eostre.extendModules {
310 modules = [ 371 modules = [
311 ({ ... }: { 372 ({ ... }: {
312 config.nfsroot.storeDevice = "10.141.0.1:nix-store"; 373 config.nfsroot.storeDevice = "${nfsIp}:nix-store";
313 config.nfsroot.registrationUrl = "${nfsrootBaseUrl}/eostre/registration"; 374 config.nfsroot.registrationUrl = "${nfsrootBaseUrl}/eostre/registration";
314 }) 375 })
315 ]; 376 ];
@@ -326,27 +387,35 @@ in {
326 name = "eostre.menu.ipxe"; 387 name = "eostre.menu.ipxe";
327 destination = "/eostre.menu.ipxe"; 388 destination = "/eostre.menu.ipxe";
328 text = '' 389 text = ''
390 #!ipxe
391
329 set menu-timeout 5000 392 set menu-timeout 5000
330 393
331 :start 394 :start
332 menu iPXE boot menu for eostre 395 menu iPXE boot menu for eostre
333 item eostre Boot eostre 396 item eostre eostre
397 item memtest memtest86plus
334 item netboot netboot.xyz 398 item netboot netboot.xyz
335 item shell iPXE shell 399 item shell iPXE shell
336 choose --timeout ''${menu-timeout} --default eostre selected || goto shell 400 choose --timeout ''${menu-timeout} --default eostre selected || goto shell
401 set menu-timeout 0
337 goto ''${selected} 402 goto ''${selected}
338 403
339 :shell 404 :shell
340 shell
341 set menu-timeout 0 405 set menu-timeout 0
406 shell
342 goto start 407 goto start
343 408
344 :eostre 409 :eostre
345 chain ${nfsrootBaseUrl}/eostre/netboot.ipxe 410 chain eostre/netboot.ipxe
346 goto start 411 goto start
347 412
348 :netboot 413 :netboot
349 chain --autofree ${nfsrootBaseUrl}/netboot.xyz.efi 414 iseq ''${platform} efi && chain --autofree netboot.xyz.efi || chain --autofree netboot.xyz.lkrn
415 goto start
416
417 :memtest
418 iseq ''${platform} efi && chain --autofree memtest.efi || chain --autofree memtest.bin
350 goto start 419 goto start
351 ''; 420 '';
352 }) 421 })
@@ -360,20 +429,12 @@ in {
360 after = [ "network.target" ]; 429 after = [ "network.target" ];
361 wantedBy = [ "multi-user.target" ]; 430 wantedBy = [ "multi-user.target" ];
362 serviceConfig.ExecStart = let 431 serviceConfig.ExecStart = let
363 ipxe = pkgs.ipxe.override {
364 additionalTargets = {
365 "bin-i386-efi/ipxe.efi" = "i386-ipxe.efi";
366 };
367 additionalOptions = [
368 "NSLOOKUP_CMD"
369 ];
370 };
371 tftpRoot = pkgs.runCommandLocal "netboot" {} '' 432 tftpRoot = pkgs.runCommandLocal "netboot" {} ''
372 mkdir -p $out 433 mkdir -p $out
373 install -m 0444 -t $out \ 434 install -m 0444 -t $out \
374 ${ipxe}/ipxe.efi ${ipxe}/i386-ipxe.efi ${ipxe}/undionly.kpxe 435 ${ipxe}/{ipxe.efi,i386-ipxe.efi,ipxe.lkrn}
375 ''; 436 '';
376 in "${pkgs.atftp}/sbin/atftpd --daemon --no-fork --bind-address=10.141.0.1 ${tftpRoot}"; 437 in "${pkgs.atftp}/sbin/atftpd --daemon --no-fork --bind-address=${tftpIp} ${tftpRoot}";
377 }; 438 };
378 }; 439 };
379} 440}