summaryrefslogtreecommitdiffstats
path: root/modules-available
diff options
context:
space:
mode:
authorSimon Rettberg2019-01-18 16:37:17 +0100
committerSimon Rettberg2019-01-18 16:37:17 +0100
commit63aa220d849dca2384773bf755358557a1d711c5 (patch)
treedda64ebb4c70bac3dae4d8e101d6570a2d6aa3c3 /modules-available
parent[inc/Trigger] PHP 5.6 compat (diff)
downloadslx-admin-63aa220d849dca2384773bf755358557a1d711c5.tar.gz
slx-admin-63aa220d849dca2384773bf755358557a1d711c5.tar.xz
slx-admin-63aa220d849dca2384773bf755358557a1d711c5.zip
[serversetup-bwlp] Make localboot method configurable
Diffstat (limited to 'modules-available')
-rw-r--r--modules-available/serversetup-bwlp/api.inc.php23
-rw-r--r--modules-available/serversetup-bwlp/inc/localboot.inc.php17
-rw-r--r--modules-available/serversetup-bwlp/lang/de/messages.json2
-rw-r--r--modules-available/serversetup-bwlp/lang/de/module.json1
-rw-r--r--modules-available/serversetup-bwlp/lang/de/template-tags.json6
-rw-r--r--modules-available/serversetup-bwlp/page.inc.php78
-rw-r--r--modules-available/serversetup-bwlp/templates/localboot.html59
7 files changed, 169 insertions, 17 deletions
diff --git a/modules-available/serversetup-bwlp/api.inc.php b/modules-available/serversetup-bwlp/api.inc.php
index 4ed316a7..d089584e 100644
--- a/modules-available/serversetup-bwlp/api.inc.php
+++ b/modules-available/serversetup-bwlp/api.inc.php
@@ -13,10 +13,9 @@ $product = Request::any('product', false, 'string');
$slxExtensions = Request::any('slx-extensions', false, 'int');
if ($platform === false || ($uuid === false && $product === false) || $slxExtensions === false) {
- error_log(print_r($_SERVER, true));
- sleep(1);
+ // Redirect to self with added parameters
$url = parse_url($_SERVER['REQUEST_URI']);
- if (isset($_SERVER['SCRIPT_URI']) && preg_match('#(\w+://[^/]+)#', $_SERVER['SCRIPT_URI'], $out)) {
+ if (isset($_SERVER['SCRIPT_URI']) && preg_match('#^(\w+://[^/]+)#', $_SERVER['SCRIPT_URI'], $out)) {
$urlbase = $out[1];
} elseif (isset($_SERVER['REQUEST_SCHEME']) && isset($_SERVER['SERVER_NAME'])) {
$urlbase = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'];
@@ -62,11 +61,7 @@ HERE;
}
$platform = strtoupper($platform);
-$BOOT_METHODS = [
- 'EXIT' => 'exit 1',
- 'COMBOOT' => 'chain /tftp/chain.c32 hd0',
- 'SANBOOT' => 'sanboot --no-describe',
-];
+$BOOT_METHODS = Localboot::BOOT_METHODS;
$ip = $_SERVER['REMOTE_ADDR'];
if (substr($ip, 0, 7) === '::ffff:') {
@@ -111,15 +106,9 @@ if ($model !== false) {
}
}
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';
- }
+ $localboot = Property::get('serversetup.localboot', 'AUTO');
+ if (!isset($BOOT_METHODS[$localboot])) {
+ $localboot = 'AUTO';
}
}
if (isset($BOOT_METHODS[$localboot])) {
diff --git a/modules-available/serversetup-bwlp/inc/localboot.inc.php b/modules-available/serversetup-bwlp/inc/localboot.inc.php
new file mode 100644
index 00000000..a91d0547
--- /dev/null
+++ b/modules-available/serversetup-bwlp/inc/localboot.inc.php
@@ -0,0 +1,17 @@
+<?php
+
+class Localboot
+{
+
+ const PROPERTY_KEY = 'serversetup.localboot';
+
+ const BOOT_METHODS = [
+ 'AUTO' => 'iseq EFI ${platform} && exit 1 || sanboot --no-describe',
+ 'EXIT' => 'exit 1',
+ 'COMBOOT' => 'chain /tftp/chain.c32 hd0',
+ 'SANBOOT' => 'sanboot --no-describe',
+ ];
+
+
+
+} \ No newline at end of file
diff --git a/modules-available/serversetup-bwlp/lang/de/messages.json b/modules-available/serversetup-bwlp/lang/de/messages.json
index 2bcaa391..de48ef0b 100644
--- a/modules-available/serversetup-bwlp/lang/de/messages.json
+++ b/modules-available/serversetup-bwlp/lang/de/messages.json
@@ -7,6 +7,8 @@
"invalid-boot-entry": "Ung\u00fcltiger Booteintrag: {{0}}",
"invalid-ip": "Kein Interface ist auf die Adresse {{0}} konfiguriert",
"invalid-menu-id": "Ung\u00fcltige Men\u00fc-ID: {{0}}",
+ "localboot-invalid-method": "Ung\u00fcltige localboot-Methode: {{0}}",
+ "localboot-saved": "Einstellungen gespeichert",
"location-menu-assigned": "{{0}} wurde ein Men\u00fc zugewiesen",
"location-use-default": "{{0}} verwendet jetzt das Standardmen\u00fc",
"menu-deleted": "Men\u00fc gel\u00f6scht",
diff --git a/modules-available/serversetup-bwlp/lang/de/module.json b/modules-available/serversetup-bwlp/lang/de/module.json
index e4c1ff4e..31d563f0 100644
--- a/modules-available/serversetup-bwlp/lang/de/module.json
+++ b/modules-available/serversetup-bwlp/lang/de/module.json
@@ -14,5 +14,6 @@
"submenu_address": "Server-Adresse",
"submenu_bootentry": "Booteintr\u00e4ge verwalten",
"submenu_download": "Downloads",
+ "submenu_localboot": "HDD-Boot",
"submenu_menu": "Men\u00fcs verwalten"
} \ No newline at end of file
diff --git a/modules-available/serversetup-bwlp/lang/de/template-tags.json b/modules-available/serversetup-bwlp/lang/de/template-tags.json
index 9d64ebd9..2b68b3fb 100644
--- a/modules-available/serversetup-bwlp/lang/de/template-tags.json
+++ b/modules-available/serversetup-bwlp/lang/de/template-tags.json
@@ -19,6 +19,7 @@
"lang_bootentryTitle": "Booteintrag",
"lang_chooseIP": "Bitte w\u00e4hlen Sie die IP-Adresse, \u00fcber die der Server von den Clients zum Booten angesprochen werden soll.",
"lang_commandLine": "Command line",
+ "lang_count": "Anzahl",
"lang_customEntry": "Eigener Eintrag",
"lang_downloadBootImage": "Boot-Image herunterladen",
"lang_downloadRufus": "Rufus herunterladen",
@@ -41,6 +42,10 @@
"lang_initRd": "Zu ladendes initramfs",
"lang_isDefault": "Standard",
"lang_listOfMenus": "Men\u00fcliste",
+ "lang_localBootDefault": "Standardm\u00e4\u00dfig verwendete Methode, um von Festplatte zu booten",
+ "lang_localBootExceptions": "Ausnahmen, pro Rechnermodell definierbar",
+ "lang_localBootHead": "Boot von Festplatte",
+ "lang_localBootIntro": "Aus dem iPXE Bootmen\u00fc kann auf verschiedene Arten ein Boot von der prim\u00e4ren Festplatte ausgel\u00f6st werden. In den allermeisten F\u00e4llen ist die Einstellung \"AUTO\" ausreichend, bei bestimmten Rechnermodellen kann es allerdings erforderlich sein, eine der alternativen Methoden zu erzwingen. Falls Sie einem solchen Modell begegnen, k\u00f6nnen Sie im unteren Teil dieser Seite eine solche Ausnahme festlegen. In einigen F\u00e4llen l\u00e4sst sich das Problem auch durch ein BIOS-Update auf den entsprechenden Ger\u00e4ten beheben.",
"lang_localHDD": "Lokale HDD",
"lang_locationCount": "Anzahl Orte",
"lang_masterPassword": "Master-Passwort",
@@ -60,6 +65,7 @@
"lang_newBootEntryHead": "Neuer Booteintrag",
"lang_newMenu": "Neues Men\u00fc",
"lang_none": "(keine)",
+ "lang_override": "\u00dcberschreiben",
"lang_pxeBuilt": "PXE-Binary gebaut",
"lang_recompileHint": "iPXE-Binaries jetzt neu kompilieren. Normalerweise wird dieser Vorgang bei \u00c4nderungen automatisch ausgef\u00fchrt. Sollten Bootprobleme auftreten, k\u00f6nnen Sie hier den Vorgang manuell ansto\u00dfen.",
"lang_scriptContent": "Script",
diff --git a/modules-available/serversetup-bwlp/page.inc.php b/modules-available/serversetup-bwlp/page.inc.php
index a71e56ef..7766050b 100644
--- a/modules-available/serversetup-bwlp/page.inc.php
+++ b/modules-available/serversetup-bwlp/page.inc.php
@@ -88,6 +88,11 @@ class Page_ServerSetup extends Page
Util::redirect('?do=locations');
}
+ if ($action === 'savelocalboot') {
+ User::assertPermission('ipxe.localboot.edit');
+ $this->saveLocalboot();
+ }
+
if ($action === 'deleteMenu') {
// Permcheck in function
$this->deleteMenu();
@@ -114,6 +119,9 @@ class Page_ServerSetup extends Page
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)) {
@@ -168,6 +176,10 @@ class Page_ServerSetup extends Page
// Permcheck in function
$this->showEditLocation();
break;
+ case 'localboot':
+ User::assertPermission('ipxe.localboot.*');
+ $this->showLocalbootConfig();
+ break;
default:
Util::redirect('?do=serversetup');
break;
@@ -218,6 +230,49 @@ class Page_ServerSetup extends Page
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('serversetup.localboot', false);
+ 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');
@@ -734,4 +789,27 @@ class Page_ServerSetup extends Page
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;
+ }
+ $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');
+ }
+
}
diff --git a/modules-available/serversetup-bwlp/templates/localboot.html b/modules-available/serversetup-bwlp/templates/localboot.html
new file mode 100644
index 00000000..7000be37
--- /dev/null
+++ b/modules-available/serversetup-bwlp/templates/localboot.html
@@ -0,0 +1,59 @@
+<h2>{{lang_localBootHead}}</h2>
+
+<p>{{lang_localBootIntro}}</p>
+
+<form method="post" action="?do=serversetup">
+
+ <input type="hidden" name="token" value="{{token}}">
+ <input type="hidden" name="action" value="savelocalboot">
+
+ <br>
+ <div class="form-group">
+ <label for="default-selector">
+ {{lang_localBootDefault}}
+ </label>
+ <select id="default-selector" class="form-control" name="default">
+ {{#options}}
+ <option {{selected}}>{{key}}</option>
+ {{/options}}
+ </select>
+ </div>
+
+ <br>
+ <h3>
+ {{lang_localBootExceptions}}
+ </h3>
+ <table class="table">
+ <tr>
+ <th>{{lang_name}}</th>
+ <th class="slx-smallcol">{{lang_count}}</th>
+ <th class="slx-smallcol">{{lang_override}}</th>
+ </tr>
+ {{#exceptions}}
+ <tr>
+ <td>{{systemmodel}}</td>
+ <td class="text-right">{{cnt}}</td>
+ <td>
+ <select class="form-control" name="override[{{systemmodel}}]">
+ <option value="" {{^bootmethod}}selected{{/bootmethod}}>{{lang_none}}</option>
+ {{#options}}
+ <option {{selected}}>{{key}}</option>
+ {{/options}}
+ </select>
+ </td>
+ </tr>
+ {{/exceptions}}
+ </table>
+
+ <div class="text-right">
+ <button class="btn btn-warning" type="reset">
+ <span class="glyphicon glyphicon-refresh"></span>
+ {{lang_reset}}
+ </button>
+ <button class="btn btn-primary" type="submit">
+ <span class="glyphicon glyphicon-floppy-disk"></span>
+ {{lang_save}}
+ </button>
+ </div>
+
+</form>