summaryrefslogtreecommitdiffstats
path: root/modules-available/serversetup-bwlp/page.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/page.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/page.inc.php')
-rw-r--r--modules-available/serversetup-bwlp/page.inc.php829
1 files changed, 0 insertions, 829 deletions
diff --git a/modules-available/serversetup-bwlp/page.inc.php b/modules-available/serversetup-bwlp/page.inc.php
deleted file mode 100644
index bb69fecf..00000000
--- a/modules-available/serversetup-bwlp/page.inc.php
+++ /dev/null
@@ -1,829 +0,0 @@
-<?php
-
-class Page_ServerSetup extends Page
-{
-
- private $addrListTask;
- private $compileTask = null;
- private $currentAddress;
- private $currentMenu;
- private $hasIpSet = false;
-
- private function getCompileTask()
- {
- if ($this->compileTask !== null)
- return $this->compileTask;
- $this->compileTask = Property::get('ipxe-task-id');
- if ($this->compileTask !== false) {
- $this->compileTask = Taskmanager::status($this->compileTask);
- if (!Taskmanager::isTask($this->compileTask) || Taskmanager::isFinished($this->compileTask)) {
- $this->compileTask = false;
- }
- }
- return $this->compileTask;
- }
-
- protected function doPreprocess()
- {
- User::load();
-
- if (!User::isLoggedIn()) {
- Message::addError('main.no-permission');
- Util::redirect('?do=Main');
- }
-
- if (Request::any('action') === 'getimage') {
- User::assertPermission("download");
- $this->handleGetImage();
- }
-
- $this->currentMenu = Property::getBootMenu();
-
- $action = Request::post('action');
-
- if ($action === false) {
- $this->currentAddress = Property::getServerIp();
- $this->getLocalAddresses();
- }
-
- if ($action === 'compile') {
- User::assertPermission("edit.address");
- if ($this->getCompileTask() === false) {
- Trigger::ipxe();
- }
- Util::redirect('?do=serversetup');
- }
-
- if ($action === 'ip') {
- User::assertPermission("edit.address");
- // New address is to be set
- $this->getLocalAddresses();
- $this->updateLocalAddress();
- }
-
- if ($action === 'savebootentry') {
- User::assertPermission('ipxe.bootentry.edit');
- $this->saveBootEntry();
- }
-
- if ($action === 'deleteBootentry') {
- User::assertPermission('ipxe.bootentry.edit');
- $this->deleteBootEntry();
- }
-
- if ($action === 'savemenu') {
- User::assertPermission('ipxe.menu.edit');
- $this->saveMenu();
- }
-
- if ($action === 'savelocation') {
- // Permcheck in function
- $this->saveLocationMenu();
- Util::redirect('?do=locations');
- }
-
- if ($action === 'savelocalboot') {
- User::assertPermission('ipxe.localboot.edit');
- $this->saveLocalboot();
- }
-
- if ($action === 'deleteMenu') {
- // Permcheck in function
- $this->deleteMenu();
- }
-
- if ($action === 'setDefaultMenu') {
- User::assertPermission('ipxe.menu.edit', 0);
- $this->setDefaultMenu();
- }
-
- if (Request::isPost()) {
- Util::redirect('?do=serversetup');
- }
-
- User::assertPermission('access-page');
-
- if (User::hasPermission('ipxe.*')) {
- Dashboard::addSubmenu('?do=serversetup&show=menu', Dictionary::translate('submenu_menu', true));
- Dashboard::addSubmenu('?do=serversetup&show=bootentry', Dictionary::translate('submenu_bootentry', true));
- }
- if (User::hasPermission('edit.address')) {
- Dashboard::addSubmenu('?do=serversetup&show=address', Dictionary::translate('submenu_address', true));
- }
- if (User::hasPermission('download')) {
- Dashboard::addSubmenu('?do=serversetup&show=download', Dictionary::translate('submenu_download', true));
- }
- if (User::hasPermission('ipxe.localboot.*')) {
- Dashboard::addSubmenu('?do=serversetup&show=localboot', Dictionary::translate('submenu_localboot', true));
- }
- if (Request::get('show') === false) {
- $subs = Dashboard::getSubmenus();
- if (empty($subs)) {
- User::assertPermission('download');
- } else {
- Util::redirect($subs[0]['url']);
- }
- }
- }
-
- protected function doRender()
- {
- Render::addTemplate("heading");
-
- $task = $this->getCompileTask();
- if ($task !== false) {
- $files = [];
- if ($task['data'] && $task['data']['files']) {
- foreach ($task['data']['files'] as $k => $v) {
- $files[] = ['name' => $k, 'namehyphen' => str_replace(['/', '.'], '-', $k)];
- }
- }
- Render::addTemplate('ipxe_update', array('taskid' => $task['id'], 'files' => $files));
- }
-
- switch (Request::get('show')) {
- case 'editbootentry':
- User::assertPermission('ipxe.bootentry.edit');
- $this->showEditBootEntry();
- break;
- case 'editmenu':
- User::assertPermission('ipxe.menu.view');
- $this->showEditMenu();
- break;
- case 'download':
- User::assertPermission('download');
- $this->showDownload();
- break;
- case 'menu':
- User::assertPermission('ipxe.menu.view');
- $this->showMenuList();
- break;
- case 'bootentry':
- User::assertPermission('ipxe.bootentry.view');
- $this->showBootentryList();
- break;
- case 'address':
- User::assertPermission('edit.address');
- $this->showEditAddress();
- break;
- case 'assignlocation':
- // Permcheck in function
- $this->showEditLocation();
- break;
- case 'localboot':
- User::assertPermission('ipxe.localboot.*');
- $this->showLocalbootConfig();
- break;
- default:
- Util::redirect('?do=serversetup');
- break;
- }
- }
-
- private function showDownload()
- {
- $list = glob('/srv/openslx/www/boot/download/*', GLOB_NOSORT);
- usort($list, function ($a, $b) {
- return strcmp(substr($a, -4), substr($b, -4)) * 100 + strcmp($a, $b);
- });
- $files = [];
- $strings = [
- 'efi' => [Dictionary::translate('dl-efi', true) => 50],
- 'pcbios' => [Dictionary::translate('dl-pcbios', true) => 51],
- 'usb' => [Dictionary::translate('dl-usb', true) => 80],
- 'hd' => [Dictionary::translate('dl-hd', true) => 81],
- 'lkrn' => [Dictionary::translate('dl-lkrn', true) => 82],
- 'i386' => [Dictionary::translate('dl-i386', true) => 10],
- 'x86_64' => [Dictionary::translate('dl-x86_64', true) => 11],
- 'ecm' => [Dictionary::translate('dl-usbnic', true) => 60],
- 'ncm' => [Dictionary::translate('dl-usbnic', true) => 61],
- 'ipxe' => [Dictionary::translate('dl-pcinic', true) => 62],
- 'snp' => [Dictionary::translate('dl-snp', true) => 63],
- ];
- foreach ($list as $file) {
- if ($file{0} === '.')
- continue;
- if (is_file($file)) {
- $base = basename($file);
- $features = [];
- foreach (preg_split('/[\-\.\/]+/', $base, -1, PREG_SPLIT_NO_EMPTY) as $p) {
- if (array_key_exists($p, $strings)) {
- $features += $strings[$p];
- }
- }
- asort($features);
- $files[] = [
- 'name' => $base,
- 'size' => Util::readableFileSize(filesize($file)),
- 'modified' => Util::prettyTime(filemtime($file)),
- 'class' => substr($base, -4) === '.usb' ? 'slx-bold' : '',
- 'features' => implode(', ', array_keys($features)),
- ];
- }
- }
- Render::addTemplate('download', ['files' => $files]);
- }
-
- private function makeSelectArray($list, $default)
- {
- $ret = [];
- foreach (array_keys($list) as $k) {
- $ret[] = [
- 'key' => $k,
- 'selected' => ($k === $default ? 'selected' : ''),
- ];
- }
- return $ret;
- }
-
- private function showLocalbootConfig()
- {
- // Default setting
- $default = Property::get(Localboot::PROPERTY_KEY, 'AUTO');
- if (!array_key_exists($default, Localboot::BOOT_METHODS)) {
- $default = 'AUTO';
- }
- $optionList = $this->makeSelectArray(Localboot::BOOT_METHODS, $default);
- // Exceptions
- $cutoff = strtotime('-90 days');
- $models = [];
- $res = Database::simpleQuery('SELECT m.systemmodel, cnt, sl.bootmethod FROM (
- SELECT m2.systemmodel, Count(*) AS cnt FROM machine m2
- WHERE m2.lastseen > :cutoff
- GROUP BY systemmodel
- ) m
- LEFT JOIN serversetup_localboot sl USING (systemmodel)
- ORDER BY systemmodel', ['cutoff' => $cutoff]);
- while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
- $row['options'] = $this->makeSelectArray(Localboot::BOOT_METHODS, $row['bootmethod']);
- $models[] = $row;
- }
- // Output
- $data = [
- 'default' => $default,
- 'options' => $optionList,
- 'exceptions' => $models,
- ];
- Render::addTemplate('localboot', $data);
- }
-
- private function showBootentryList()
- {
- $allowEdit = User::hasPermission('ipxe.bootentry.edit');
-
- $res = Database::simpleQuery("SELECT be.entryid, be.hotkey, be.title, be.builtin, Count(*) AS refs FROM serversetup_bootentry be
- INNER JOIN serversetup_menuentry sm USING (entryid)
- GROUP BY be.entryid
- ORDER BY be.title ASC");
- $bootentryTable = [];
- while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
- $bootentryTable[] = $row;
- }
-
- Render::addTemplate('bootentry-list', array(
- 'bootentryTable' => $bootentryTable,
- 'allowEdit' => $allowEdit,
- ));
- }
-
- private function showMenuList()
- {
- $allowedEdit = User::getAllowedLocations('ipxe.menu.edit');
-
- // TODO Permission::addGlobalTags($perms, null, ['edit.menu', 'edit.address', 'download']);
-
- $res = Database::simpleQuery("SELECT m.menuid, m.title, m.isdefault, GROUP_CONCAT(l.locationid) AS locations,
- GROUP_CONCAT(ll.locationname SEPARATOR ', ') AS locnames
- FROM serversetup_menu m
- LEFT JOIN serversetup_menu_location l USING (menuid)
- LEFT JOIN location ll USING (locationid)
- GROUP BY menuid
- ORDER BY title");
- $menuTable = [];
- while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
- if (empty($row['locations'])) {
- $locations = [];
- $row['allowEdit'] = in_array(0, $allowedEdit);
- } else {
- $locations = explode(',', $row['locations']);
- $row['allowEdit'] = empty(array_diff($locations, $allowedEdit));
- }
- $row['locationCount'] = empty($locations) ? '' : count($locations);
- $menuTable[] = $row;
- }
-
- Render::addTemplate('menu-list', array(
- 'menuTable' => $menuTable,
- 'showSetDefault' => User::hasPermission('ipxe.menu.edit', 0)
- ));
- }
-
- private function hasMenuPermission($menuid, $permission)
- {
- $allowedEditLocations = User::getAllowedLocations($permission);
- $allowEdit = in_array(0, $allowedEditLocations);
- if (!$allowEdit) {
- // Get locations
- $locations = Database::queryColumnArray('SELECT locationid FROM serversetup_menu_location
- WHERE menuid = :menuid', compact('menuid'));
- if (!empty($locations)) {
- $allowEdit = count(array_diff($locations, $allowedEditLocations)) === 0;
- }
- }
- return $allowEdit;
- }
-
- private function showEditMenu()
- {
- $id = Request::get('id', false, 'int');
- // if = edit, else = add new
- if ($id !== 0) {
- $menu = Database::queryFirst("SELECT menuid, timeoutms, title, defaultentryid, isdefault
- FROM serversetup_menu WHERE menuid = :id", compact('id'));
- } else {
- $menu = [];
- $menu['menuid'] = 0;
- $menu['timeoutms'] = 0;
- $menu['title'] = '';
- $menu['defaultentryid'] = null;
- $menu['isdefault'] = false;
- }
-
- if ($menu === false) {
- Message::addError('invalid-menu-id', $id);
- Util::redirect('?do=serversetup&show=menu');
- }
- $highlight = Request::get('highlight', false, 'string');
- if ($id !== 0 && !$this->hasMenuPermission($id, 'ipxe.menu.edit')) {
- $menu['readonly'] = 'readonly';
- $menu['disabled'] = 'disabled';
- $menu['plainpass'] = '';
- }
- if (!User::hasPermission('ipxe.menu.edit', 0)) {
- $menu['globalMenuWarning'] = true;
- }
-
- $menu['timeout'] = round($menu['timeoutms'] / 1000);
- $menu['entries'] = [];
- $res = Database::simpleQuery("SELECT menuentryid, entryid, hotkey, title, hidden, sortval, plainpass FROM
- serversetup_menuentry WHERE menuid = :id ORDER BY sortval ASC", compact('id'));
- while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
- if ($row['entryid'] == $highlight) {
- $row['highlight'] = 'active';
- }
- $menu['entries'][] = $row;
- }
- $menu['keys'] = array_map(function ($item) { return ['key' => $item]; }, MenuEntry::getKeyList());
- $menu['entrylist'] = Database::queryAll("SELECT entryid, title, hotkey, data FROM serversetup_bootentry ORDER BY title ASC");
- foreach ($menu['entrylist'] as &$bootentry) {
- //$bootentry['json'] = $bootentry['data'];
- $bootentry['data'] = json_decode($bootentry['data'], true);
- if (array_key_exists('arch', $bootentry['data'])) {
- $bootentry['data']['PCBIOS'] = array('executable' => $bootentry['data']['executable']['PCBIOS'],
- 'initRd' => $bootentry['data']['initRd']['PCBIOS'],
- 'commandLine' => $bootentry['data']['commandLine']['PCBIOS']);
- $bootentry['data']['EFI'] = array('executable' => $bootentry['data']['executable']['EFI'],
- 'initRd' => $bootentry['data']['initRd']['EFI'],
- 'commandLine' => $bootentry['data']['commandLine']['EFI']);
-
- if ($bootentry['data']['arch'] === 'PCBIOS') {
- $bootentry['data']['arch'] = Dictionary::translateFile('template-tags','lang_biosOnly', true);
- unset($bootentry['data']['EFI']);
- } else if ($bootentry['data']['arch'] === 'EFI') {
- $bootentry['data']['arch'] = Dictionary::translateFile('template-tags','lang_efiOnly', true);
- unset($bootentry['data']['PCBIOS']);
- } else {
- $bootentry['data']['arch'] = Dictionary::translateFile('template-tags','lang_archBoth', true);
- }
-
- } elseif (!array_key_exists('script', $bootentry['data'])) {
- $bootentry['data']['arch'] = Dictionary::translateFile('template-tags','lang_archAgnostic', true);
- $bootentry['data']['archAgnostic'] = array('executable' => $bootentry['data']['executable'],
- 'initRd' => $bootentry['data']['initRd'],
- 'commandLine' => $bootentry['data']['commandLine']);
- }
- }
- foreach ($menu['entries'] as &$entry) {
- $entry['isdefault'] = ($entry['menuentryid'] == $menu['defaultentryid']);
- // TODO: plainpass only when permissions
- }
-
- Permission::addGlobalTags($menu['perms'], 0, ['ipxe.menu.edit']);
- Render::addTemplate('menu-edit', $menu);
- }
-
- private function showEditBootEntry()
- {
- $params = [];
- $id = Request::get('id', false, 'string');
- if ($id === false) {
- $params['exec_checked'] = 'checked';
- $params['entryid'] = 'u-' . dechex(mt_rand(0x1000, 0xffff)) . '-' . dechex(time());
- $params['entries'] = [
- ['mode' => 'PCBIOS'],
- ['mode' => 'EFI'],
- ];
- } else {
- // Query existing entry
- $row = Database::queryFirst('SELECT entryid, title, builtin, data FROM serversetup_bootentry
- WHERE entryid = :id LIMIT 1', ['id' => $id]);
- if ($row === false) {
- Message::addError('invalid-boot-entry', $id);
- Util::redirect('?do=serversetup');
- }
- $entry = BootEntry::fromJson($row['data']);
- if ($entry === null) {
- Message::addError('unknown-bootentry-type', $id);
- Util::redirect('?do=serversetup');
- }
- $entry->addFormFields($params);
- $params['title'] = $row['title'];
- $params['entryid'] = $row['entryid'];
- $params['builtin'] = $row['builtin'];
- $params['menus'] = Database::queryAll('SELECT m.menuid, m.title FROM serversetup_menu m
- INNER JOIN serversetup_menuentry me ON (me.menuid = m.menuid)
- WHERE me.entryid = :entryid', ['entryid' => $row['entryid']]);
- }
-
- Render::addTemplate('ipxe-new-boot-entry', $params);
- }
-
- private function showEditAddress()
- {
- Render::addTemplate('ipaddress', array(
- 'ips' => $this->addrListTask['data']['addresses'],
- 'chooseHintClass' => $this->hasIpSet ? '' : 'alert alert-danger',
- 'disabled' => ($this->getCompileTask() === false) ? '' : 'disabled',
- ));
- }
-
- // -----------------------------------------------------------------------------------------------
-
- private function getLocalAddresses()
- {
- $this->addrListTask = Taskmanager::submit('LocalAddressesList', array());
-
- if ($this->addrListTask === false) {
- $this->addrListTask['data']['addresses'] = false;
- return false;
- }
-
- if (!Taskmanager::isFinished($this->addrListTask)) { // TODO: Async if just displaying
- $this->addrListTask = Taskmanager::waitComplete($this->addrListTask['id'], 4000);
- }
-
- if (Taskmanager::isFailed($this->addrListTask) || !isset($this->addrListTask['data']['addresses'])) {
- $this->addrListTask['data']['addresses'] = false;
- return false;
- }
-
- $sortIp = array();
- foreach (array_keys($this->addrListTask['data']['addresses']) as $key) {
- $item = & $this->addrListTask['data']['addresses'][$key];
- if (!isset($item['ip']) || !preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $item['ip']) || substr($item['ip'], 0, 4) === '127.') {
- unset($this->addrListTask['data']['addresses'][$key]);
- continue;
- }
- if ($this->currentAddress === $item['ip']) {
- $item['default'] = true;
- $this->hasIpSet = true;
- }
- $sortIp[] = $item['ip'];
- }
- unset($item);
- array_multisort($sortIp, SORT_STRING, $this->addrListTask['data']['addresses']);
- return true;
- }
-
- private function deleteBootEntry() {
- $id = Request::post('deleteid', false, 'string');
- if ($id === false) {
- Message::addError('main.parameter-missing', 'deleteid');
- return;
- }
- Database::exec("DELETE FROM serversetup_bootentry WHERE entryid = :entryid", array("entryid" => $id));
- // TODO: Redirect to &show=bootentry
- Message::addSuccess('bootentry-deleted');
- }
-
- private function setDefaultMenu()
- {
- $id = Request::post('menuid', false, 'int');
- if ($id === false) {
- Message::addError('main.parameter-missing', 'menuid');
- return;
- }
- Database::exec('UPDATE serversetup_menu SET isdefault = (menuid = :menuid)', ['menuid' => $id]);
- Message::addSuccess('menu-set-default');
- }
-
- private function deleteMenu()
- {
- $id = Request::post('deleteid', false, 'int');
- if ($id === false) {
- Message::addError('main.parameter-missing', 'deleteid');
- return;
- }
- if (!$this->hasMenuPermission($id, 'ipxe.menu.edit')) {
- Message::addError('locations.no-permission-location', $id);
- return;
- }
- Database::exec("DELETE FROM serversetup_menu WHERE menuid = :menuid", array("menuid" => $id));
- Message::addSuccess('menu-deleted');
- }
-
- private function saveMenu()
- {
- $id = Request::post('menuid', false, 'int');
- if ($id === false) {
- Message::addError('main.parameter-missing', 'menuid');
- return;
- }
-
- $insertParams = [
- 'title' => IPxe::sanitizeIpxeString(Request::post('title', '', 'string')),
- 'timeoutms' => abs(Request::post('timeout', 0, 'int') * 1000),
- ];
- if ($id === 0) {
- Database::exec("INSERT INTO serversetup_menu (title, timeoutms, isdefault) VALUES (:title, :timeoutms, 0)", $insertParams);
- $menu['menuid'] = $id = Database::lastInsertId();
- } else {
- $menu = Database::queryFirst("SELECT m.menuid
- FROM serversetup_menu m
- WHERE menuid = :id", compact('id'));
- if ($menu === false) {
- Message::addError('no-such-menu', $id);
- return;
- }
- $insertParams['menuid'] = $id;
- Database::exec('UPDATE serversetup_menu SET title = :title, timeoutms = :timeoutms
- WHERE menuid = :menuid', $insertParams);
- }
-
- $keepIds = [];
- $entries = Request::post('entry', false, 'array');
- $wantedDefaultEntryId = Request::post('defaultentry', null, 'string');
- $defaultEntryId = null;
-
- if ($entries) {
- foreach ($entries as $key => $entry) {
- if (!isset($entry['sortval'])) {
- error_log(print_r($entry, true));
- continue;
- }
- // Fallback defaults
- $entry += [
- 'entryid' => null,
- 'title' => '',
- 'hidden' => 0,
- 'plainpass' => '',
- ];
- $params = [
- 'title' => IPxe::sanitizeIpxeString($entry['title']),
- 'sortval' => (int)$entry['sortval'],
- 'menuid' => $menu['menuid'],
- ];
- if (empty($entry['entryid'])) {
- // Spacer
- $params += [
- 'entryid' => null,
- 'hotkey' => '',
- 'hidden' => 0, // Doesn't make any sense
- 'plainpass' => '', // Doesn't make any sense
- ];
- } else {
- $params += [
- 'entryid' => $entry['entryid'], // TODO validate?
- 'hotkey' => MenuEntry::filterKeyName($entry['hotkey']),
- 'hidden' => (int)$entry['hidden'], // TODO (needs hotkey to make sense)
- 'plainpass' => $entry['plainpass'],
- ];
- }
- if (is_numeric($key)) {
- if ((string)$key === $wantedDefaultEntryId) { // Check now that we have generated our key
- $defaultEntryId = $key;
- }
- $keepIds[] = $key;
- $params['menuentryid'] = $key;
- $params['md5pass'] = IPxe::makeMd5Pass($entry['plainpass'], $key);
- $ret = Database::exec('UPDATE serversetup_menuentry
- SET entryid = :entryid, hotkey = :hotkey, title = :title, hidden = :hidden, sortval = :sortval,
- plainpass = :plainpass, md5pass = :md5pass
- WHERE menuid = :menuid AND menuentryid = :menuentryid', $params, true);
- } else {
- $ret = Database::exec("INSERT INTO serversetup_menuentry
- (menuid, entryid, hotkey, title, hidden, sortval, plainpass, md5pass)
- VALUES (:menuid, :entryid, :hotkey, :title, :hidden, :sortval, :plainpass, '')", $params, true);
- if ($ret) {
- $newKey = Database::lastInsertId();
- if ((string)$key === $wantedDefaultEntryId) { // Check now that we have generated our key
- $defaultEntryId = $newKey;
- }
- $keepIds[] = (int)$newKey;
- if (!empty($entry['plainpass'])) {
- Database::exec('UPDATE serversetup_menuentry SET md5pass = :md5pass WHERE menuentryid = :id', [
- 'md5pass' => IPxe::makeMd5Pass($entry['plainpass'], $newKey),
- 'id' => $newKey,
- ]);
- }
- }
- }
-
- if ($ret === false) {
- Message::addWarning('error-saving-entry', $entry['title'], Database::lastError());
- }
- }
- Database::exec('DELETE FROM serversetup_menuentry WHERE menuid = :menuid AND menuentryid NOT IN (:keep)',
- ['menuid' => $menu['menuid'], 'keep' => $keepIds]);
- // Set default entry
- Database::exec('UPDATE serversetup_menu SET defaultentryid = :default WHERE menuid = :menuid',
- ['menuid' => $menu['menuid'], 'default' => $defaultEntryId]);
- } else {
- Database::exec('DELETE FROM serversetup_menuentry WHERE menuid = :menuid', ['menuid' => $menu['menuid']]);
- Database::exec('UPDATE serversetup_menu SET defaultentryid = NULL WHERE menuid = :menuid', ['menuid' => $menu['menuid']]);
- }
-
- Message::addSuccess('menu-saved');
- }
-
- private function updateLocalAddress()
- {
- $newAddress = Request::post('ip', 'none', 'string');
- $valid = false;
- foreach ($this->addrListTask['data']['addresses'] as $item) {
- if ($item['ip'] !== $newAddress)
- continue;
- $valid = true;
- break;
- }
- if ($valid) {
- Property::setServerIp($newAddress);
- Util::redirect('?do=ServerSetup');
- } else {
- Message::addError('invalid-ip', $newAddress);
- }
- Util::redirect();
- }
-
- private function handleGetImage()
- {
- $file = "/opt/openslx/ipxe/openslx-bootstick.raw";
- if (!is_readable($file)) {
- Message::addError('image-not-found');
- return;
- }
- Header('Content-Type: application/octet-stream');
- Header('Content-Disposition: attachment; filename="openslx-bootstick-' . Property::getServerIp() . '-raw.img"');
- readfile($file);
- exit;
- }
-
- private function saveBootEntry()
- {
- $oldEntryId = Request::post('entryid', false, 'string');
- $newId = Request::post('newid', false, 'string');
- if (!preg_match('/^[a-z0-9\-_]{1,16}$/', $newId)) {
- Message::addError('main.parameter-empty', 'newid');
- return;
- }
- $data = Request::post('entry', false);
- if (!is_array($data)) {
- Message::addError('missing-bootentry-data');
- return;
- }
- $type = Request::post('type', false, 'string');
- if ($type === 'exec') {
- $entry = BootEntry::newStandardBootEntry($data);
- } elseif ($type === 'script') {
- $entry = BootEntry::newCustomBootEntry($data);
- } else {
- Message::addError('unknown-bootentry-type', $type);
- return;
- }
- if ($entry === null) {
- Message::addError('main.empty-field');
- Util::redirect('?do=serversetup&show=bootentry');
- }
- $params = [
- 'entryid' => $newId,
- 'title' => Request::post('title', '', 'string'),
- 'data' => json_encode($entry->toArray()),
- ];
- // New or update?
- if (empty($oldEntryId)) {
- // New entry
- Database::exec('INSERT INTO serversetup_bootentry (entryid, title, builtin, data)
- VALUES (:entryid, :title, 0, :data)', $params);
- Message::addSuccess('boot-entry-created', $newId);
- } else {
- // Edit existing entry
- $params['oldid'] = $oldEntryId;
- Database::exec('UPDATE serversetup_bootentry SET entryid = :entryid, title = :title, data = :data
- WHERE entryid = :oldid', $params);
- Message::addSuccess('boot-entry-updated', $newId);
- }
- Util::redirect('?do=serversetup&show=bootentry');
- }
-
- private function showEditLocation()
- {
- $locationId = Request::get('locationid', false, 'int');
- $loc = Location::get($locationId);
- if ($loc === false) {
- Message::addError('locations.invalid-location-id', $locationId);
- return;
- }
- User::assertPermission('ipxe.menu.assign', $locationId);
- // List of menu entries
- $res = Database::simpleQuery('SELECT menuentryid, title FROM serversetup_menuentry');
- $menuEntries = $res->fetchAll(PDO::FETCH_KEY_PAIR);
- // List of menus
- $data = [
- 'locationid' => $locationId,
- 'locationName' => $loc['locationname'],
- ];
- $res = Database::simpleQuery('SELECT m.menuid, m.title, ml.locationid, ml.defaultentryid, GROUP_CONCAT(me.menuentryid) AS entries FROM serversetup_menu m
- LEFT JOIN serversetup_menu_location ml ON (m.menuid = ml.menuid AND ml.locationid = :locationid)
- INNER JOIN serversetup_menuentry me ON (m.menuid = me.menuid AND me.entryid IS NOT NULL)
- GROUP BY menuid
- ORDER BY m.title ASC', ['locationid' => $locationId]);
- $menus = [];
- $hasDefault = false;
- while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
- $eids = explode(',', $row['entries']);
- $row['entries'] = [];
- foreach ($eids as $eid) {
- $row['entries'][] = [
- 'id' => $eid,
- 'title' => $menuEntries[$eid],
- 'selected' => ($eid == $row['defaultentryid'] ? 'selected' : ''),
- ];
- }
- if ($row['locationid'] !== null) {
- $hasDefault = true;
- $row['menu_selected'] = 'checked';
- }
- $menus[] = $row;
- }
- if (!$hasDefault) {
- $data['default_selected'] = 'checked';
- }
- $data['list'] = $menus;
- Render::addTemplate('menu-assign-location', $data);
- }
-
- private function saveLocationMenu()
- {
- $locationId = Request::post('locationid', false, 'int');
- $loc = Location::get($locationId);
- if ($loc === false) {
- Message::addError('locations.invalid-location-id', $locationId);
- return;
- }
- User::assertPermission('ipxe.menu.assign', $locationId);
- $menuId = Request::post('menuid', false, 'int');
- if ($menuId === 0) {
- Database::exec('DELETE FROM serversetup_menu_location WHERE locationid = :locationid',
- ['locationid' => $locationId]);
- Message::addSuccess('location-use-default', $loc['locationname']);
- return;
- }
- $defaultEntryId = Request::post('defaultentryid-' . $menuId, 0, 'int');
- if ($defaultEntryId === 0) {
- $defaultEntryId = null;
- }
- Database::exec('INSERT INTO serversetup_menu_location (menuid, locationid, defaultentryid)
- VALUES (:menuid, :locationid, :defaultentryid)
- ON DUPLICATE KEY UPDATE menuid = :menuid, defaultentryid = :defaultentryid', [
- 'menuid' => $menuId,
- 'locationid' => $locationId,
- 'defaultentryid' => $defaultEntryId
- ]);
- Message::addSuccess('location-menu-assigned', $loc['locationname']);
- }
-
- private function saveLocalboot()
- {
- $default = Request::post('default', 'AUTO', 'string');
- if (!array_key_exists($default, Localboot::BOOT_METHODS)) {
- Message::addError('localboot-invalid-method', $default);
- return;
- }
- Property::set(Localboot::PROPERTY_KEY, $default);
- $overrides = Request::post('override', [], 'array');
- Database::exec('TRUNCATE TABLE serversetup_localboot');
- foreach ($overrides as $model => $mode) {
- if (empty($mode)) // No override
- continue;
- if (!array_key_exists($mode, Localboot::BOOT_METHODS)) {
- Message::addWarning('localboot-invalid-method', $mode);
- continue;
- }
- Database::exec('INSERT INTO serversetup_localboot (systemmodel, bootmethod)
- VALUES (:model, :mode)', compact('model', 'mode'));
- }
- Message::addSuccess('localboot-saved');
- Util::redirect('?do=serversetup&show=localboot');
- }
-
-}