diff options
Diffstat (limited to 'modules-available/serversetup-bwlp/api.inc.php')
-rw-r--r-- | modules-available/serversetup-bwlp/api.inc.php | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/modules-available/serversetup-bwlp/api.inc.php b/modules-available/serversetup-bwlp/api.inc.php new file mode 100644 index 00000000..36f9063c --- /dev/null +++ b/modules-available/serversetup-bwlp/api.inc.php @@ -0,0 +1,242 @@ +<?php + +$BOOT_METHODS = [ + 'EXIT' => 'exit 1', + 'COMBOOT' => 'chain /tftp/chain.c32 hd0', + 'SANBOOT' => 'sanboot --no-describe', +]; + +$serverIp = Property::getServerIp(); + +$ip = $_SERVER['REMOTE_ADDR']; +if (substr($ip, 0, 7) === '::ffff:') { + $ip = substr($ip, 7); +} +$uuid = Request::any('uuid', false, 'string'); +$menu = IPxeMenu::forClient($ip, $uuid); + +// Get platform - EFI or PCBIOS +$platform = strtoupper(Request::any('platform', 'PCBIOS', 'string')); + +// Get preferred localboot method, depending on system model +$localboot = false; +$model = false; +if ($uuid !== false && Module::get('statistics') !== false) { + $row = Database::queryFirst('SELECT systemmodel FROM machine WHERE machineuuid = :uuid', ['uuid' => $uuid]); + if ($row !== false && !empty($row['systemmodel'])) { + $model = $row['systemmodel']; + } +} +if ($model === false) { + function modfilt($str) + { + if (empty($str) || preg_match('/product\s+name|be\s+filled|unknown|default\s+string/i', $str)) + return false; + return trim(preg_replace('/\s+/', ' ', $str)); + } + $manuf = modfilt(Request::any('manuf', false, 'string')); + $product = modfilt(Request::any('product', false, 'string')); + if (!empty($product)) { + $model = $product; + if (!empty($manuf)) { + $model .= " ($manuf)"; + } + } +} +// Query +if ($model !== false) { + $row = Database::queryFirst("SELECT bootmethod FROM serversetup_localboot WHERE systemmodel = :model LIMIT 1", + ['model' => $model]); + if ($row !== false) { + $localboot = $row['bootmethod']; + } +} +if ($localboot === false || !isset($BOOT_METHODS[$localboot])) { + $localboot = Property::get('serversetup.localboot', false); + if ($localboot === false) { + if ($platform === 'EFI') { + // It seems most (all) EFI platforms won't enumerate any drives in ipxe. + // No idea if this can be fixed in ipxe code in the future. + $localboot = 'EXIT'; + } else { + $localboot = 'SANBOOT'; + } + } +} +if (isset($BOOT_METHODS[$localboot])) { + // Move preferred method first + $BOOT_METHODS[] = $BOOT_METHODS[$localboot]; + unset($BOOT_METHODS[$localboot]); + $BOOT_METHODS = array_reverse($BOOT_METHODS); +} + +$output = <<<HERE +#!ipxe + +goto init || goto fail || + +# functions + +# password check with gotos +# set slx_hash to the expected hash +# slx_salt to the salt to use +# slx_pw_ok to the label to jump on success +# slx_pw_fail to label for wrong pw +:slx_pass_check +login || +set slxtmp_pw \${password:md5}-\${slx_salt} || goto fail +set slxtmp_pw \${slxtmp_pw:md5} || goto fail +clear password || +iseq \${slxtmp_pw} \${slx_hash} || prompt Wrong password. Press a key. || +iseq \${slxtmp_pw} \${slx_hash} || goto \${slx_pw_fail} || +iseq \${slxtmp_pw} \${slx_hash} && goto \${slx_pw_ok} || +goto fail + +# local boot with either exit 1 or sanboot +:slx_localboot +console || + +HERE; + +foreach ($BOOT_METHODS as $line) { + $output .= "$line || goto fail\n"; +} + +$output .= <<<HERE +goto fail + +# start +:init + +iseq \${nic} \${} && set nic 0 || + +set ipappend1 ip=\${net\${nic}/ip}:{$serverIp}:\${net\${nic}/gateway}:\${net\${nic}/netmask} +set ipappend2 BOOTIF=01-\${net\${nic}/mac:hexhyp} +set serverip $serverIp || + +# Clean up in case we've been chained to +imgfree || + +ifopen || + +imgfetch --name bg-load /tftp/openslx.png || + +imgfetch --name bg-menu /tftp/pxe-menu.png || + +:start + +console --left 55 --top 88 --right 63 --bottom 64 --keep --picture bg-menu || + +colour --rgb 0xffffff 7 +colour --rgb 0xcccccc 5 +cpair --foreground 0 --background 4 1 +cpair --foreground 7 --background 5 2 +cpair --foreground 7 --background 9 0 + +:slx_menu + +console --left 55 --top 88 --right 63 --bottom 64 --quick --keep --picture bg-menu || + +HERE; + +$output .= $menu->getMenuDefinition('target'); + +$output .= <<<HERE + +console --left 60 --top 130 --right 67 --bottom 86 --quick || +goto \${target} || +echo Could not find menu entry in script. +prompt Press any key to continue. +goto start + +HERE; + +$output .= $menu->getItemsCode(); + +/* +:i1 +#console || +echo Welcome to Shell || +shell +goto slx_menu + +:i2 +imgfree || +kernel /boot/default/kernel slxbase=boot/default slxsrv=$serverIp splash BOOTIF=01-\${net\${nic}/mac:hexhyp} || echo Could not download kernel +initrd /boot/default/initramfs-stage31 || echo Could not download initrd +boot -ar || goto fail + +:i3 +chain -ar \${self} || +chain -ar /tftp/undionly.kpxe || goto fail + +:i4 +imgfree || +sanboot --no-describe --drive 0x80 || goto fail + +:i5 +chain -a /tftp/memtest.0 passes=1 onepass || goto membad +prompt Memory OK. Press a key. +goto init + +:i6 +console --left 60 --top 130 --right 67 --bottom 96 --quick --picture bg-load --keep || +echo Welcome to Shell || +shell +goto slx_menu + +:i7 +chain -ar tftp://132.230.4.6/ipxelinux.0 || prompt FAILED PRESS A KEY +goto slx_menu + +:i8 +set x:int32 0 +:again +console --left 60 --top 130 --right 67 --bottom 96 --picture bg-load --keep --quick || +console --left 55 --top 88 --right 63 --bottom 64 --picture bg-menu --keep --quick || +inc x +iseq \${x} 20 || goto again +prompt DONE. Press dein Knie. +goto slx_menu + +:i9 +reboot || +prompt Reboot failed. Press a key. +goto slx_menu + +:i10 +poweroff || +prompt Poweroff failed. Press a key. +goto slx_menu + +:membad +iseq \${errno} 0x1 || goto memaborted +params +param scrot \${vram} +imgfetch -a http://132.230.8.113/screen.php##params || +prompt Memory is bad. Press a key. +goto init + +:memaborted +params +param scrot \${vram} +imgfetch -a http://132.230.8.113/screen.php##params || +prompt Memory test aborted. Press a key. +goto init + +*/ + +$output .= <<<HERE +:fail +prompt Boot failed. Press any key to start. +goto init +HERE; + +if ($platform === 'EFI') { + $cs = 'ASCII'; +} else { + $cs = 'IBM437'; +} +Header('Content-Type: text/plain; charset=' . $cs); + +echo iconv('UTF-8', $cs . '//TRANSLIT//IGNORE', $output); |