Skip to content

Instantly share code, notes, and snippets.

@john-clark
Last active February 27, 2023 21:46
Show Gist options
  • Save john-clark/5355544 to your computer and use it in GitHub Desktop.
Save john-clark/5355544 to your computer and use it in GitHub Desktop.
ipxe php boot system
#!ipxe
#
# This file gets compiled into undionly.kpxe
################################################################
:vars
set next-server 192.168.2.121
cpuid --ext 29 && set arch amd64 || set arch x86
:netconfig
dhcp net0 || goto ipxeshell
:prompt
prompt --key 0x02 --timeout 3000 Press Ctrl-B for the iPXE command line... && goto ipxeshell ||
#
# We call strap so we can escape out of logging for some computers
chain http://${next-server}/boot/strap.php && goto exit ||
echo
echo Failed to boot to: http://${next-server}/boot/strap.php
echo
echo Type help for commands.
:ipxeshell
shell
:exit
exit
<?php
echo "#!ipxe\n:start\necho Boot menu\nmenu Selection\n";
$directory = new RecursiveDirectoryIterator("/var/www/iso/");
$display = Array ( 'iso' );
$count = 0;
foreach(new RecursiveIteratorIterator($directory) as $file)
{
if (in_array(strtolower(array_pop(explode('.', $file))), $display))
echo "item ". $count . " " . array_pop(explode("/", $file)) . "\n";
$count += 1;
}
echo "choose os && goto \${os}\n";
$count = 0;
foreach(new RecursiveIteratorIterator($directory) as $file)
{
if (in_array(strtolower(array_pop(explode('.', $file))), $display))
echo ":". $count ."\nsanboot http://debian" . substr($file,8) . "\ngoto start\n";
$count += 1;
}
?>
<?php
//////////////////////////////////////////////////////////////////////////////////////////////////////
//
// This is for logging or not who is booting
//
// make sure bootlog.csv is writable by the webserver
// use skipfile.txt a list of mac address on each line to skip logging
//
//////////////////////////////////////////////////////////////////////////////////////////////////////
//if you no mac or webview is set then it is probably a webbrowser
if (!isset($_GET['MAC']) ) {
?>
<table style="border:5px dotted red" width=800><tr><td>
This was not started as an iPXE script. There is a logic in the script you can't see.<br>
</td></tr></table>
<pre>
<?php
}
// start building the file display
echo "#!ipxe\n";
echo "imgfree\n";
//get variables
foreach($_GET as $k=>$v) {
$$k=$v;
#echo "echo $k=$v\n"; #uncomment to debug
}
$logfile = 'bootlog.csv';
//check to make sure logfile can be opened
if (!$handle = fopen($logfile, 'a+')) {
die("Failed to open log file");
}
//first lets figure out what protocol is needed
//this isn't actually used corectly when building the file - fix
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) {
$serverproto = "https://";
} else {
$serverproto = "http://";
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Check for macaddress to skip adding to the log file ...aka machines you test boot a lot
//
//////////////////////////////////////////////////////////////////////////////////////////////////////
$skipfile = "skipmaclog.txt";
//check to see if file exists load it
if ($skipfile) { $skipmac = file($skipfile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); }
//if mac matches then
if (in_array($MAC, $skipmac)) {
echo "echo not logged.\n";
echo "chain http://".$_SERVER['SERVER_NAME']."/boot/menu.php?MANUFACTURER=\${manufacturer}&PRODUCT=\${product}&SERIAL=\${serial}&MAC=\${netX/mac}&ASSET=\${asset}&HOSTNAME=\${hostname}&USER-CLASS=\${user-class}&UUID=\${uuid}&DHCP-SERVER=\${dhcp-server}&NEXT-SERVER=\${next-server}&FILENAME=\${filename}&ROOT-PATH=\${root-path}&IQN=\${initiator-iqn}\n";
// this was break for php 5 but that no longer works
return false;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//
// computer mac is not in skip file so finish the ipxe file contruction
//
//////////////////////////////////////////////////////////////////////////////////////////////////////
//fill out variables for log file
$ipaddress = $_SERVER['REMOTE_ADDR'];
$servername = $_SERVER['SERVER_NAME'];
$port = $_SERVER['SERVER_PORT'];
$page = "http://{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}";
$page .= (!empty($_SERVER['QUERY_STRING'])) ? "?{$_SERVER['QUERY_STRING']}" : "";
$referrer = $_SERVER['HTTP_REFERER'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
$remotehost = @getHostByAddr($ipaddress);
$datetime = mktime();
$logline = $datetime . '|' . $serverproto . '|' . $servername . '|' . $port . '|' . $page . '|' . $referrer . '|' . $useragent . '|' . $MANUFACTURER . '|' . $PRODUCT . '|' . $SERIAL . '|' . $ARCH . '|' . $remotehost . '|'. $ipaddress . '|' . $MAC . '|' . $UUID . "\n";
//echo "echo $datetime . '|' . $serverproto . '|' . $servername . '|' . $port . '|' . $page . '|' . $referrer . '|' . $useragent . '|' . $MANUFACTURER . '|' . $PRODUCT . '|' . $SERIAL . '|' . $ARCH . '|' . $remotehost . '|'. $ipaddress . '|' . $MAC . '|' . $UUID . "\n"";
if (fwrite($handle, $logline) === FALSE) {
die("Failed to write to log file");
}
fclose($handle);
echo "echo logged.\n";
echo "chain http://".$_SERVER['SERVER_NAME']."/boot/menu.php?MANUFACTURER=\${manufacturer}&PRODUCT=\${product}&SERIAL=\${serial}&MAC=\${netX/mac}&ASSET=\${asset}&HOSTNAME=\${hostname}&USER-CLASS=\${user-class}&UUID=\${uuid}&DHCP-SERVER=\${dhcp-server}&NEXT-SERVER=\${next-server}&FILENAME=\${filename}&ROOT-PATH=\${root-path}&IQN=\${initiator-iqn}\n";
?>
<?php
//////////////////////////////////////////////////////////////////////////////////////////////////////
//
// this massive file was an early version of creating a ipxe txt menu in php
// if viewed on a webpage you get a choice to look at different files
// this was never really finished but worked well enough for a while
//
//////////////////////////////////////////////////////////////////////////////////////////////////////
ini_set('display_errors', 1);
date_default_timezone_set('America/Chicago');
foreach($_GET as $k=>$v){ $$k=$v; }
//there is probably a better way of doing this
// if you have mac and no webview then it is probably the nic
if (isset($_GET['MAC']) && !isset($_GET['webview'])) {
$mac = $_GET['MAC'];
//header ( "Content-type: text/plain" );
}
//if you no mac or webview is set then it is probably a webbrowser
if (!isset($_GET['MAC']) || isset($_GET['webview'])) {
$mac = $_GET['MAC'];
?>
<table style="border:5px dotted red" width=800><tr><td>
This was not started as an iPXE script. There is a decision in the script to decide if it knows who you are.<br>
<p><form method="get">
Select an option to display a different case:
<select name="MAC" onchange="this.form.submit()"">
<option value="">Select...</option>
<option value="">default</option>
<option value="00:15:5d:7a:b3:1d">iscsimenu</option>
<option value="00:15:5d:7a:b3:1a">test vm</option>
<option value="00:15:5d:7a:b3:20">windows7iscsi</option>
<option value="00:15:5d:7a:b3:1f">windows8iscsi</option>
<option value="00:e0:b8:xx:xx:xx">all dell mac addresses</option>
</select>
<input type="hidden" name="webview" value="true">
</form></p><a href=/boot/menu.phps>View the source to this page.</a>
</td></tr></table>
<?php
echo "<pre>\n";
}
//setup ipxe
ipxeheader();
switch ($mac) {
//xp64 vm
case "00:15:5d:7a:b3:1d":
echo "shell\n";
break;
//test vm
case "00:15:5d:7a:b3:1a":
//iscsiboot("xp","86","","0x80");
wds();
break;
//windows7iscsi
case "00:15:5d:7a:b3:20":
iscsi7();
break;
//windows8iscsi
case "00:15:5d:7a:b3:1f":
iscsi8();
break;
//sample (ie all dell macs)
case "00:e0:b8:xx:xx:xx":
wds();
break;
default:
welcome();
break;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// BEGIN MENU FUNCTIONS
//
//////////////////////////////////////////////////////////////////////////////////////////////////
function welcome() {
echo "#######################################################################################\n";
echo ":welsome\n";
echo "menu BOOTSKY iPXE Boot menu\n";
gap();
gap();
gap();
gap();
echo "item --gap -- Please wait... \n";
gap();
echo "item exitpxe Continue booting\n";
echo "item menu Choose iPXE boot menu.\n";
gap();
gap();
gap();
disclaimer();
menuprompt("exitpxe",3);
echo "\n";
exitpxe();
echo "\n";
menu();
}
function menu() {
echo "#######################################################################################\n";
echo ":menu\n";
echo "menu BOOTSKY iPXE Boot menu\n";
gap();
echo "item --gap -- Deployment\n";
echo "item wds Windows Deployment Server\n";
gap();
echo "item --gap -- Other\n";
echo "item workingmenu Verified Menu\n";
echo "item testingmenu Testing Menu\n";
echo "item iscsimenu iSCSI Menu\n";
gap();
echo "item --gap -- Local Boot Devices\n";
echo "item exitpxe Exit to next boot device\n";
echo "item localboot_0x80 Try to force boot from hard drive\n";
echo "item localboot_0x81 Try to force boot from cdrom\n";
echo "item reboot Reset the computer\n";
gap();
echo "item shell iPXE Shell\n";
menuprompt("shell",99);
echo "\n";
reboot();
echo "\n";
localboot("0x80");
echo "\n";
localboot("0x81");
echo "\n";
wds();
//includes other menus
echo "\n";
workingmenu();
echo "\n";
testingmenu();
echo "\n";
iscsimenu();
echo "\n";
shell();
echo "\n";
exitpxe();
}
function workingmenu() {
echo "#######################################################################################\n";
echo ":workingmenu\n";
menutitle();
echo "item --gap -- Tools\n";
echo "item winpe Windows Pre-execution Environment\n";
echo "item hdt Hardware Detection Tool (HDT)\n";
echo "item ubcda Ultimate Boot CD (load from apache)\n";
echo "item ubcdiis Ultimate Boot CD (load from iis - works?)\n";
echo "item --gap -- \n";
echo "item --gap -- Live Distro\n";
echo "item xpud xPUD (xpud-0.9.2.iso)\n";
echo "item --gap -- \n";
echo "item --gap -- Remote targets\n";
echo "item ritboot rit.edu clone of boot.kernel.org\n";
echo "item netboott netboot.me (http)\n";
menuprompt("reboot",99);
echo "\n";
winpe();
echo "\n";
sanboot("hdt" ,"","\${files-server}","/boot/img/" ,"hdt-0.5.2.iso");
echo "\n";
sanboot("ubcda" ,"","\${linux-server}","/" ,"ubcd520.iso");
sanboot("ubcdiis" ,"","\${files-server}","/boot/img/" ,"ubcd520.iso");
echo "\n";
sanboot("xpud" ,"","\${files-server}","/shares/linux/_live/" ,"xpud-0.9.2.iso");
echo "\n";
ritboot();
echo "\n";
netboott();
}
function testingmenu() {
echo "#######################################################################################\n";
echo ":testingmenu\n";
menutitle();
echo "item --gap -- Targets that are being Tested\n";
echo "item android Android iso\n";
echo "item ubuntu Ubuntu Desktop 12.10 iso (wait for it)\n";
echo "item chrome chrome os";
echo "item dos DOS (ISO)\n";
echo "item tails Tails (tails-i386-0.15.iso)\n";
echo "item puppy Puppy (puppy-4.2.1-k2.6.25.16-seamonkey.iso)\n";
echo "item --gap -- \n";
echo "item --gap -- Remote Targets\n";
echo "item netbooti netboot.me (iso from install)\n";
menuprompt("reboot",99);
echo "\n";
sanboot("android" ,"","\${files-server}","/shares/Linux/Google/Android/","android-x86-vm-20120130.iso");
echo "\n";
sanboot("ubuntu","--drive 0x80 --no-describe","\${files-server}","/shares/Linux/Ubuntu/","ubuntu-12.10-desktop-amd64.iso");
echo "\n";
sanboot("chrome","--drive 0x80 --no-describe","\${files-server}","/shares/Linux/google/chromium_os/","chrome_os.img");
echo "\n";
sanboot("dos" ,"","\${linux-server}","/" ,"winme_bootdisk.iso");
echo "\n";
sanboot("tails" ,"","\${files-server}","/shares/linux/_other/tails/" ,"tails-i386-0.15.iso");
echo "\n";
sanboot("puppy" ,"","\${files-server}","/shares/linux/_mini/" ,"puppy-4.2.1-k2.6.25.16-seamonkey.iso");
echo "\n";
sanboot("netbooti" ,"","\${files-server}","/boot/img/" ,"netbootme.iso");
}
function iscsimenu() {
echo "#######################################################################################\n";
echo ":iscsimenu\n";
menutitle();
echo "item --gap -- iSCSI Targets\n";
echo "item iscsiboot_xp86 iscsi Windows XP x86\n";
echo "item iscsiboot_xp64 iscsi Windows XP x64\n";
gap();
echo "item iscsiboot_win7x64 iscsi Windows 7 x64\n";
gap();
echo "item iscsiboot_win8x64 iscsi Windows 8 x64\n";
gap();
echo "item iscsiboot_dc2012core iscsi 2012 Data Center Core (pw: Psychology06)\n";
menuprompt("reboot",99);
echo "\n";
iscsiboot("win7","x64","","0x80");
echo "\n";
iscsiboot("win8","x64","","0x80");
echo "\n";
iscsiboot("xp","86","","0x80");
echo "\n";
iscsiboot("xp","64","","0x80");
echo "\n";
iscsiboot("dc","2012","core","0x80");
echo "\n";
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// END MENU FUNCTIONS - BEGIN ACTIONS
//
//////////////////////////////////////////////////////////////////////////////////////////////////
function winpe() {
if ($arch == 'x64') { $arch = 'amd64'; }
echo ":winpe\n";
echo "kernel winpe/wimboot\n";
echo "initrd winpe/\${arch}/media/bootmgr bootmgr\n";
echo "initrd winpe/\${arch}/media/boot/bcd BCD\n";
echo "initrd winpe/\${arch}/media/boot/boot.sdi boot.sdi\n";
echo "initrd winpe/\${arch}/winpe.wim boot.wim\n";
echo "boot\n";
}
function wds() {
echo ":wds\n";
echo "imgfree\n";
echo "set next-server \${files-server}\n";
echo "set filename boot/x86/wdsnbp.com\n";
echo "autoboot\n";
pause();
echo "goto menu\n";
}
/////////////////////////////////////////////////////////////////
//call function with 0x80 or 0x81 or 0x90 or 0x91
function localboot($drive) {
echo ":localboot_".$drive."\n";
echo "sanboot --no-describe --drive ".$drive."\n";
echo "goto menu\n";
}
/////////////////////////////////////////////////////////////////
// function call example iscsiboot("xp","86","")
// the menu entry would be iscsiboot_xp86
//
// function call example iscsiboot("8","x64","test")
// the menu entry would be iscsiboot_7x64test
//
function iscsiboot($os,$ver,$id,$drive) {
echo ":iscsiboot_".$os.$ver.$id."\n";
mountiscsi($os.$ver.$id,$drive);
echo "sanboot --drive ".$drive."\n";
echo "exit\n";
}
/////////////////////////////////////////////////////////////////
// function call example iscsiboot("xp","86","")
function mountiscsi($fname,$drive) {
//echo ":mountiscsi\n";
echo "set keep-san 1\n";
echo "set initiator-iqn ".$fname."\n";
echo "set root-path iscsi:\${files-server}::::".$fname."\n";
echo "sanhook --drive ".$drive." \${root-path} && echo mounted || goto error\n";
}
function mountiso($fname) {
//echo ":mountiso\n";
switch ($fname) {
case "xp":
echo "sanhook --drive 0x81 http://\${files-server}/shares/microsoft/os/xp/en_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-73974.iso && echo mounted || echo failed\n";
break;
case "xp64":
echo "sanhook --drive 0x81 http://\${files-server}/shares/microsoft/os/xp/en_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-73974.iso && echo mounted || echo failed\n";
break;
case "win7x86":
echo "sanhook --drive 0x81 http://\${files-server}/shares/microsoft/os/7/en_windows_7_enterprise_with_sp1_x86_dvd_u_677710.iso && echo mounted || echo failed\n";
break;
case "win7x64":
echo "sanhook --drive 0x81 http://\${files-server}/shares/microsoft/os/7/en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.iso && echo mounted || echo failed\n";
break;
case "win8x86":
echo "sanhook --drive 0x81 http://\${files-server}/shares/microsoft/os/7/en_windows_8_enterprise_x86_dvd_917587.iso && echo mounted || echo failed\n";
break;
case "win8x64":
echo "sanhook --drive 0x81 http://\${files-server}/shares/microsoft/os/7/en_windows_8_enterprise_x64_dvd_917522.iso && echo mounted || echo failed\n";
break;
default:
echo "shell";
break;
}
}
////////////////////////////////////////////////////////////////
function sanboot($section,$options,$server,$dir,$filename) {
echo ":".$section."\n";
echo "imgfree\n";
echo "sanboot ".$options." http://".$server.$dir.$filename."\n";
echo "goto menu\n";
}
////////////////////////////////////////////////////////////////
function netboott() {
echo ":netboott\n";
echo "imgfree\n";
echo "set next-server 78.46.210.145\n";
echo "set filename netbootme.kpxe\n";
echo "chain http://\${files-server}/boot/netbootme.kpxe\n";
echo "goto menu\n";
}
function ritboot() {
echo ":ritboot\n";
echo "set 209:string pxelinux.cfg/default\n";
echo "set 210:string http://boot.rit.edu/bko/\n";
echo "chain http://boot.rit.edu/bko/pxelinux.0\n";
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// COMMON FUNCTIONS
//
//////////////////////////////////////////////////////////////////////////////////////////////////
function ipxeheader() {
echo "#!ipxe\n";
echo "#\n";
echo "# This script created by johnrclark3@gmail.com\n";
echo "#\n";
echo "#######################################################################################\n";
echo "set files-server 192.168.122.235\n";
echo "set linux-server 192.168.142.236\n";
//echo "set cls:hex 1b:5b:32:4a\n";
echo "set esc:hex 1b # ANSI escape character - \"^[\"\n";
echo "set cls \${esc:string}[2J # ANSI clear screen sequence - \"^[[2J\"\n";
}
function menutitle() {
echo "menu Skyman's Network Boot iPXE menu\n";
echo "item --gap -- Back\n";
echo "item menu Root Menu\n";
echo "item --gap -- \n";
}
function menuprompt($default_choice,$num) {
echo "choose --default ".$default_choice." --timeout ".($num*1000)." target && goto \${target} || goto error\n";
}
function disclaimer() {
echo "item --gap -- \n";
echo "item --gap -- Note: All Testing has been done under Windows 8 Hyper-V.\n";
echo "item --gap -- Real hardware or other VMS may perform differently.\n";
echo "item --gap -- ** If you have any questions email me: johnrclark3@gmail.com **\n";
}
function reboot() {
echo ":reboot\n";
echo "imgfree\n";
clearscreen();
echo "reboot\n";
}
function error() {
echo ":error\n";
echo "echo something bad happened.\n";
echo "shell\n";
}
function pause() {
echo "prompt Press any key to continue\n";
}
function gap() {
echo "item --gap --\n";
}
function clearscreen() {
echo "echo \${cls}\n";
}
function shell() {
echo ":shell\n";
clearscreen();
echo "echo \n";
echo "echo \n";
echo "echo mac...............: \${mac}\n";
echo "echo ip................: \${ip}\n";
echo "echo netmask...........: \${netmask}\n";
echo "echo gateway...........: \${gateway}\n";
echo "echo dns...............: \${dns}\n";
echo "echo domain............: \${domain}\n";
echo "echo dhcp-server.......: \${dhcp-server}\n";
echo "echo syslog............: \${syslog}\n";
echo "echo filename..........: \${filename}\n";
echo "echo next-server.......: \${next-server}\n";
echo "echo hostname..........: \${hostname}\n";
echo "echo uuid..............: \${uuid}\n";
echo "echo serial............: \${serial}\n";
echo "echo \n";
echo "shell\n";
}
function exitpxe() {
echo ":exitpxe\n";
clearscreen();
echo "exit\n";
}
////////////////////////////////////////////////////////////////
?>
<?php
header ( "Content-type: text/plain" );
echo "#!ipxe \n";
echo "imgfree\n";
echo "cpuid --ext 29 && set arch x64 || set arch x86\n";
echo "chain http://".$_SERVER['SERVER_NAME']."/boot/log.php?MANUFACTURER=\${manufacturer}&PRODUCT=\${product}&SERIAL=\${serial}&MAC=\${netX/mac}&ASSET=\${asset}&ARCH=\${arch}&HOSTNAME=\${hostname}&USER-CLASS=\${user-class}&UUID=\${uuid}&DHCP-SERVER=\${dhcp-server}&NEXT-SERVER=\${next-server}&FILENAME=\${filename}&ROOT-PATH=\${root-path}&IQN=\${initiator-iqn}\n";
?>
<?php
//////////////////////////////////////////////////////////////////////////////////////////////////////
//
// This file views the csv file made by log.php
//
//////////////////////////////////////////////////////////////////////////////////////////////////////
$logfile = 'bootlog.csv';
if (file_exists($logfile)) {
$handle = fopen($logfile, "r");
$log = fread($handle, filesize($logfile));
fclose($handle);
} else {
die ("The log file doesn't exist!");
}
$log = explode("\n", trim($log));
for ($i = 0; $i < count($log); $i++) {
$log[$i] = trim($log[$i]);
$log[$i] = explode('|', $log[$i]);
}
echo count($log) . " have hit this file.";
echo '<table border="1">';
echo '<th>Date</th>';
//echo '<th>Proto</th>';
//echo '<th>Server</th>';
//echo '<th>Port</th>';
//echo '<th>Page</th>';
//echo '<th>Referrer</th>';
//echo '<th>Useragent</th>';
echo '<th>Manufacturer</th>';
echo '<th>Product</th>';
echo '<th>Service Tag</th>';
echo '<th>Arch</th>';
echo '<th>Remote Hostname</th>';
echo '<th>IP Address</th>';
echo '<th>MAC Address</th>';
echo '<th>UUID</th>';
foreach ($log as $logline) {
echo '<tr>';
echo '<td nowrap>' . date('d/m/Y H:i:s', $logline['0']) . '</td>';
//echo '<td nowrap>' . $logline['1'] . '</td>';
//echo '<td nowrap>' . $logline['2'] . '</td>';
//echo '<td nowrap>' . $logline['3'] . '</td>';
//echo '<td nowrap>' . $logline['4'] . '</td>';
//echo '<td nowrap>' . $logline['5'] . '</td>';
//echo '<td nowrap>' . $logline['6'] . '</td>';
echo '<td nowrap>' . $logline['7'] . '</td>';
echo '<td nowrap>' . $logline['8'] . '</td>';
echo '<td nowrap>' . $logline['9'] . '</td>';
echo '<td nowrap>' . $logline['10'] . '</td>';
echo '<td nowrap>' . $logline['11'] . '</td>';
echo '<td nowrap>' . $logline['12'] . '</td>';
echo '<td nowrap>' . urldecode($logline['13']) . '</td>';
echo '<td nowrap>' . $logline['14'] . '</td>';
echo '</tr>';
}
echo '</table>';
?>
@john-clark
Copy link
Author

john-clark commented Apr 27, 2013

Info

I was playing around with ipxe and php in 2013

I was asked about it in 2020 and took a look at it. PHP no longer supports the shortcuts I took (aka if break) and so I fixed a few things.

This probably isn't the best way to do this, or ever was. It was just a learning experience.

install

  • Setup webserver with php
  • put files in /boot/
  • fix all ip's and servers as needed
  • compile i.pxe in the ipxe undi rom
  • point pxe server at tftp undi rom

notes

  • i.pxe boots to strap.php
  • strap.php overloads information into log.php
  • bootlog.csv should be writable by your webserver
  • skipmaclog.txt is a file with mac addresses per line that you want to skip logging info (useful for test booting machines)
  • log.php then loads menu.php

view.php shows bootlog.csv of the computers hitting the server

list.php was never implemented but just a test script

About

http://creativecommons.org/licenses/by-sa/3.0/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment