summaryrefslogtreecommitdiffstats
path: root/modules-available/serversetup-bwlp/inc/bootentry.inc.php
diff options
context:
space:
mode:
authorSimon Rettberg2019-02-12 14:55:12 +0100
committerSimon Rettberg2019-02-12 14:55:12 +0100
commitc2a6dfb649107ce3ad64162e2bb2c3c7275650fb (patch)
tree5a58f34c9c2563bb9baebcf7a36afe3e1d08a120 /modules-available/serversetup-bwlp/inc/bootentry.inc.php
parent[serversetup-bwlp] Auto-import of old PXELinux config on bootup (diff)
downloadslx-admin-c2a6dfb649107ce3ad64162e2bb2c3c7275650fb.tar.gz
slx-admin-c2a6dfb649107ce3ad64162e2bb2c3c7275650fb.tar.xz
slx-admin-c2a6dfb649107ce3ad64162e2bb2c3c7275650fb.zip
[serversetup*] PXELinux and iPXE side-by-side
Diffstat (limited to 'modules-available/serversetup-bwlp/inc/bootentry.inc.php')
-rw-r--r--modules-available/serversetup-bwlp/inc/bootentry.inc.php258
1 files changed, 0 insertions, 258 deletions
diff --git a/modules-available/serversetup-bwlp/inc/bootentry.inc.php b/modules-available/serversetup-bwlp/inc/bootentry.inc.php
deleted file mode 100644
index 69adffd3..00000000
--- a/modules-available/serversetup-bwlp/inc/bootentry.inc.php
+++ /dev/null
@@ -1,258 +0,0 @@
-<?php
-
-abstract class BootEntry
-{
-
- public function __construct($data = false)
- {
- if (is_array($data)) {
- foreach ($data as $key => $value) {
- if (property_exists($this, $key)) {
- $this->{$key} = $value;
- }
- }
- }
- }
-
- public abstract function supportsMode($mode);
-
- public abstract function toScript($failLabel, $mode);
-
- public abstract function toArray();
-
- public abstract function addFormFields(&$array);
-
- /*
- *
- */
-
- /**
- * Return a BootEntry instance from the serialized data.
- *
- * @param string $jsonString serialized entry data
- * @return BootEntry|null instance representing boot entry, null on error
- */
- public static function fromJson($data)
- {
- if (is_string($data)) {
- $data = json_decode($data, true);
- }
- if (isset($data['script'])) {
- return new CustomBootEntry($data);
- }
- if (isset($data['executable'])) {
- return new StandardBootEntry($data);
- }
- return null;
- }
-
- public static function newStandardBootEntry($initData)
- {
- $ret = new StandardBootEntry($initData);
- $list = [];
- if ($ret->arch() !== StandardBootEntry::EFI) {
- $list[] = StandardBootEntry::BIOS;
- }
- if ($ret->arch() === StandardBootEntry::EFI || $ret->arch() === StandardBootEntry::BOTH) {
- $list[] = StandardBootEntry::EFI;
- }
- foreach ($list as $mode) {
- if (empty($initData['executable'][$mode]))
- return null;
- }
- return $ret;
- }
-
- public static function newCustomBootEntry($initData)
- {
- if (empty($initData['script']))
- return null;
- return new CustomBootEntry($initData);
- }
-
- /**
- * Return a BootEntry instance from database with the given id.
- *
- * @param string $id
- * @return BootEntry|null|false false == unknown id, null = unknown entry type, BootEntry instance on success
- */
- public static function fromDatabaseId($id)
- {
- $row = Database::queryFirst("SELECT data FROM serversetup_bootentry
- WHERE entryid = :id LIMIT 1", ['id' => $id]);
- if ($row === false)
- return false;
- return self::fromJson($row['data']);
- }
-
-}
-
-class StandardBootEntry extends BootEntry
-{
- protected $executable;
- protected $initRd;
- protected $commandLine;
- protected $replace;
- protected $autoUnload;
- protected $resetConsole;
- protected $arch; // Constants below
-
- const BIOS = 'PCBIOS'; // Only valid for legacy BIOS boot
- const EFI = 'EFI'; // Only valid for EFI boot
- const BOTH = 'PCBIOS-EFI'; // Supports both via distinct entry
- const AGNOSTIC = 'agnostic'; // Supports both via same entry (PCBIOS entry)
-
- public function __construct($data = false)
- {
- if ($data instanceof PxeSection) {
- // Gets arrayfied below
- $this->executable = $data->kernel;
- $this->initRd = $data->initrd;
- $this->commandLine = ' ' . str_replace('vga=current', '', $data->append) . ' ';
- $this->resetConsole = true;
- $this->replace = true;
- $this->autoUnload = true;
- if (strpos($this->commandLine, ' quiet ') !== false) {
- $this->commandLine .= ' loglevel=5 rd.systemd.show_status=auto';
- }
- if ($data->ipAppend & 1) {
- $this->commandLine .= ' ${ipappend1}';
- }
- if ($data->ipAppend & 2) {
- $this->commandLine .= ' ${ipappend2}';
- }
- if ($data->ipAppend & 4) {
- $this->commandLine .= ' SYSUUID=${uuid}';
- }
- $this->commandLine = trim(preg_replace('/\s+/', ' ', $this->commandLine));
- } else {
- parent::__construct($data);
- }
- // Convert legacy DB format
- foreach (['executable', 'initRd', 'commandLine', 'replace', 'autoUnload', 'resetConsole'] as $key) {
- if (!is_array($this->{$key})) {
- $this->{$key} = [ 'PCBIOS' => $this->{$key}, 'EFI' => '' ];
- }
- }
- if ($this->arch === null) {
- $this->arch = self::AGNOSTIC;
- }
- }
-
- public function arch()
- {
- return $this->arch;
- }
-
- public function supportsMode($mode)
- {
- if ($mode === $this->arch || $this->arch === self::AGNOSTIC)
- return true;
- if ($mode === self::BIOS || $mode === self::EFI) {
- return $this->arch === self::BOTH;
- }
- error_log('Unknown iPXE platform: ' . $mode);
- return false;
- }
-
- public function toScript($failLabel, $mode)
- {
- if (!$this->supportsMode($mode)) {
- return "prompt Entry doesn't have an executable for mode $mode\n";
- }
- if ($this->arch === self::AGNOSTIC) {
- $mode = self::BIOS;
- }
-
- $script = '';
- if ($this->resetConsole[$mode]) {
- $script .= "console ||\n";
- }
- if (!empty($this->initRd[$mode])) {
- $script .= "imgfree ||\n";
- if (!is_array($this->initRd[$mode])) {
- $script .= "initrd {$this->initRd[$mode]} || goto $failLabel\n";
- } else {
- foreach ($this->initRd[$mode] as $initrd) {
- $script .= "initrd $initrd || goto $failLabel\n";
- }
- }
- }
- $script .= "boot ";
- if ($this->autoUnload[$mode]) {
- $script .= "-a ";
- }
- if ($this->replace[$mode]) {
- $script .= "-r ";
- }
- $script .= $this->executable[$mode];
- $rdBase = basename($this->initRd[$mode]);
- if (!empty($this->commandLine[$mode])) {
- $script .= " initrd=$rdBase {$this->commandLine[$mode]}";
- }
- $script .= " || goto $failLabel\n";
- if ($this->resetConsole[$mode]) {
- $script .= "goto start ||\n";
- }
- return $script;
- }
-
- public function addFormFields(&$array)
- {
- $array[$this->arch . '_selected'] = 'selected';
- foreach ([self::BIOS, self::EFI] as $mode) {
- $array['entries'][] = [
- 'is' . $mode => true,
- 'mode' => $mode,
- 'executable' => $this->executable[$mode],
- 'initRd' => $this->initRd[$mode],
- 'commandLine' => $this->commandLine[$mode],
- 'replace_checked' => $this->replace[$mode] ? 'checked' : '',
- 'autoUnload_checked' => $this->autoUnload[$mode] ? 'checked' : '',
- 'resetConsole_checked' => $this->resetConsole[$mode] ? 'checked' : '',
- ];
- }
- $array['exec_checked'] = 'checked';
- }
-
- public function toArray()
- {
- return [
- 'executable' => $this->executable,
- 'initRd' => $this->initRd,
- 'commandLine' => $this->commandLine,
- 'replace' => $this->replace,
- 'autoUnload' => $this->autoUnload,
- 'resetConsole' => $this->resetConsole,
- 'arch' => $this->arch,
- ];
- }
-}
-
-class CustomBootEntry extends BootEntry
-{
- protected $script;
-
- public function supportsMode($mode)
- {
- return true;
- }
-
- public function toScript($failLabel, $mode)
- {
- return str_replace('%fail%', $failLabel, $this->script) . "\n";
- }
-
- public function addFormFields(&$array)
- {
- $array['entry'] = [
- 'script' => $this->script,
- ];
- $array['script_checked'] = 'checked';
- }
-
- public function toArray()
- {
- return ['script' => $this->script];
- }
-}