diff options
author | Simon Rettberg | 2018-06-12 17:15:44 +0200 |
---|---|---|
committer | Simon Rettberg | 2018-06-12 17:15:44 +0200 |
commit | 2e78eec281815d6ba42ff2cf7c3a937abe6d83c5 (patch) | |
tree | d98495500354de9b735b31c64e02856eeb179098 /modules-available/serversetup-bwlp/inc/menuentry.inc.php | |
parent | [inc/Database] Method to return single-column queries as array (diff) | |
download | slx-admin-2e78eec281815d6ba42ff2cf7c3a937abe6d83c5.tar.gz slx-admin-2e78eec281815d6ba42ff2cf7c3a937abe6d83c5.tar.xz slx-admin-2e78eec281815d6ba42ff2cf7c3a937abe6d83c5.zip |
[serversetup-bwlp] Start rewrite as purely iPXE-based
Diffstat (limited to 'modules-available/serversetup-bwlp/inc/menuentry.inc.php')
-rw-r--r-- | modules-available/serversetup-bwlp/inc/menuentry.inc.php | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/modules-available/serversetup-bwlp/inc/menuentry.inc.php b/modules-available/serversetup-bwlp/inc/menuentry.inc.php new file mode 100644 index 00000000..9736b7bb --- /dev/null +++ b/modules-available/serversetup-bwlp/inc/menuentry.inc.php @@ -0,0 +1,170 @@ +<?php + +class MenuEntry +{ + /** + * @var int id of entry, used for pw + */ + private $menuentryid; + /** + * @var false|string key code as expected by iPXE + */ + private $hotkey; + /** + * @var string + */ + private $title; + /** + * @var bool + */ + private $hidden; + /** + * @var bool + */ + private $gap; + /** + * @var int + */ + private $sortval; + /** + * @var BootEntry + */ + private $bootEntry = null; + + private $md5pass = null; + + /** + * MenuEntry constructor. + * + * @param array $row row from database + */ + public function __construct($row) + { + if (is_array($row)) { + foreach ($row as $key => $value) { + if (property_exists($this, $key)) { + $this->{$key} = $value; + } + } + $this->hotkey = self::getKeyCode($row['hotkey']); + if (!empty($row['bootentry'])) { + $this->bootEntry = BootEntry::fromJson($row['bootentry']); + } + $this->gap = (array_key_exists('entryid', $row) && $row['entryid'] === null); + } + settype($this->hidden, 'bool'); + settype($this->gap, 'bool'); + settype($this->sortval, 'int'); + settype($this->menuentryid, 'int'); + } + + public function getMenuItemScript($lblPrefix, $requestedDefaultId) + { + $str = 'item '; + if ($this->gap) { + $str .= '--gap '; + } else { + if ($this->hidden) { + if ($this->hotkey === false) + return ''; // Hidden entries without hotkey are illegal + $str .= '--hidden '; + } + if ($this->hotkey !== false) { + $str .= '--key ' . $this->hotkey . ' '; + } + if ($this->menuentryid == $requestedDefaultId) { + $str .= '--default '; + } + $str .= "{$lblPrefix}_{$this->menuentryid} "; + } + $str .= $this->title; + return $str . " || prompt Could not create menu item for {$lblPrefix}_{$this->menuentryid}\n"; + } + + public function getBootEntryScript($lblPrefix, $failLabel) + { + if ($this->bootEntry === null) + return ''; + $str = ":{$lblPrefix}_{$this->menuentryid}\n"; + if (!empty($this->md5pass)) { + $str .= "set slx_hash {$this->md5pass} || goto $failLabel\n" + . "set slx_salt {$this->menuentryid} || goto $failLabel\n" + . "set slx_pw_ok {$lblPrefix}_ok || goto $failLabel\n" + . "set slx_pw_fail slx_menu || goto $failLabel\n" + . "goto slx_pass_check || goto $failLabel\n" + . ":{$lblPrefix}_ok\n"; + } + return $str . $this->bootEntry->toScript($failLabel); + } + + /* + * + */ + + private static function getKeyArray() + { + static $data = false; + if ($data === false) { + $data = [ + 'F5' => 0x107e, + 'F6' => 0x127e, + 'F7' => 0x137e, + 'F8' => 0x147e, + 'F9' => 0x157e, + 'F10' => 0x167e, + 'F11' => 0x187e, + 'F12' => 0x197e, + ]; + for ($i = 1; $i <= 26; ++$i) { + $letter = chr(0x40 + $i); + $data['SHIFT_' . $letter] = 0x40 + $i; + if ($letter !== 'C') { + $data['CTRL_' . $letter] = $i; + } + $data[$letter] = 0x60 + $i; + } + for ($i = 0; $i <= 9; ++$i) { + $data[chr(0x30 + $i)] = 0x30 + $i; + } + asort($data, SORT_NUMERIC); + } + return $data; + } + + /** + * Get all the known/supported keys, usable for menu items. + * + * @return string[] list of known key names + */ + public static function getKeyList() + { + return array_keys(self::getKeyArray()); + } + + /** + * Get the key code ipxe expects for the given named + * key. Returns false if the key name is unknown. + * + * @param string $keyName + * @return false|string Key code as hex string, or false if not found + */ + public static function getKeyCode($keyName) + { + $data = self::getKeyArray(); + if (isset($data[$keyName])) + return '0x' . dechex($data[$keyName]); + return false; + } + + /** + * @param string $keyName desired key name + * @return string $keyName if it's known, empty string otherwise + */ + public static function filterKeyName($keyName) + { + if (isset($data[$keyName])) + return $keyName; + return ''; + } + +} |