summaryrefslogtreecommitdiffstats
path: root/data/ipxe-embed.template
diff options
context:
space:
mode:
Diffstat (limited to 'data/ipxe-embed.template')
-rw-r--r--data/ipxe-embed.template91
1 files changed, 80 insertions, 11 deletions
diff --git a/data/ipxe-embed.template b/data/ipxe-embed.template
index 8ef845f..3a8a1a7 100644
--- a/data/ipxe-embed.template
+++ b/data/ipxe-embed.template
@@ -1,13 +1,82 @@
#!ipxe
-ifopen
-set net0.dhcp/next-server %ipaddress% ||
-set net0.dhcp/filename ipxelinux.0 ||
-clear net0.dhcp/210:string ||
-#set net0.dhcp/209:string pxelinux.cfg/default ||
-set next-server %ipaddress%
-set filename ipxelinux.0
-clear 210:string
-#set 209:string pxelinux.cfg/default
-imgload pxelinux.0
-boot pxelinux.0
+
+console || goto cmd_fail
+
+# This should always be the case since this is the embed script, but making it dynamic is more flexible during testing
+set slxtest:string something || goto cmd_fail
+iseq \${slxtest:md5} \${} && set slxext 0 || set slxext 1 ||
+
+set dosleep:int32 0 ||
+set idx:int32 -1 ||
+
+# This will be set to usb or pxe
+#goto %mode%
+
+:PXE
+
+set retlbl:string next_open
+:next_open
+inc idx
+iseq 20 ${idx} && goto fail ||
+# No MAC -- done
+iseq ${net${idx}/mac} ${} && goto fail ||
+# Has no IP -- ignore
+iseq ${net${idx}/ip} ${} && goto cleaniface ||
+ifopen net${idx} || goto cleaniface
+# Success
+set retlbl dochain
+goto setvars
+
+# Now try to chain to main script
+:dochain
+set self:string http://%ipaddress%/boot/ipxe?uuid=${uuid}&mac=${mac}&manuf=${manufacturer:uristring}&product=${product:uristring}&platform=${platform:uristring}&slx-extensions=${slxext}
+chain -ar ${self} || goto fail
+echo How the hell did I get here?
+:fail
+set retlbl retry_sleep
+goto cleaniface
+:retry_sleep
+echo Trying again in ${dosleep} seconds...
+sleep ${dosleep} ||
+iseq 0 ${dosleep} && set idx:int32 -1 ||
+set dosleep 5 ||
+:USB
+iseq 20 ${idx} && set idx:int32 -1 ||
+set retlbl:string next_dhcp
+:next_dhcp
+inc idx
+iseq 20 ${idx} && goto fail ||
+# No MAC -- done
+iseq ${net${idx}/mac} ${} && goto next_dhcp ||
+echo Trying net${idx} via DHCP
+dhcp net${idx} || goto cleaniface
+# Success
+set retlbl dochain
+goto setvars
+
+# Clear interface IP address and close it
+# Jumps back to label stored in ${retlbl}
+:cleaniface
+clear net${idx}/ip ||
+clear net${idx}.dhcp/ip ||
+ifclose net${idx} ||
+goto ${retlbl}
+
+# Force global variables to have the values of the interface we succeeded on
+# Jumps back to label stored in ${retlbl}
+:setvars
+set ip ${net${idx}/ip} ||
+set mac ${net${idx}/mac} ||
+set netmask ${net${idx}/netmask} ||
+set gateway ${net${idx}/gateway} ||
+goto ${retlbl}
+
+:cmd_fail
+echo This iPXE was compiled with important commands/features missing
+echo Essential are: console, menu, param, set, clear
+echo Optinally, reboot and poweroff would be nice
+prompt Press any key to reboot ||
+reboot || echo OK, reboot is apparently missing, so....
+prompt Press any key to exit iPXE and return control to the BIOS ||
+exit 1