summaryrefslogtreecommitdiffstats
path: root/modules-available
diff options
context:
space:
mode:
authorSimon Rettberg2020-08-28 18:52:57 +0200
committerSimon Rettberg2020-08-28 18:52:57 +0200
commitf72e4528dc0d4f8e34d9552bd833c4d9e9893647 (patch)
treea0f110f1bf1370fb01d1e74bfc8a767df643207d /modules-available
parent[serversetup-bwlp-ipxe] Fix UTF-8 fix, fix gaps not being displayed (diff)
downloadslx-admin-f72e4528dc0d4f8e34d9552bd833c4d9e9893647.tar.gz
slx-admin-f72e4528dc0d4f8e34d9552bd833c4d9e9893647.tar.xz
slx-admin-f72e4528dc0d4f8e34d9552bd833c4d9e9893647.zip
[minilinux] Show which menu(entries) and locations use a version
Diffstat (limited to 'modules-available')
-rw-r--r--modules-available/minilinux/inc/minilinux.inc.php83
-rw-r--r--modules-available/minilinux/lang/de/template-tags.json4
-rw-r--r--modules-available/minilinux/lang/en/template-tags.json4
-rw-r--r--modules-available/minilinux/page.inc.php12
-rw-r--r--modules-available/minilinux/templates/versionlist.html29
5 files changed, 128 insertions, 4 deletions
diff --git a/modules-available/minilinux/inc/minilinux.inc.php b/modules-available/minilinux/inc/minilinux.inc.php
index f68a6af1..93420702 100644
--- a/modules-available/minilinux/inc/minilinux.inc.php
+++ b/modules-available/minilinux/inc/minilinux.inc.php
@@ -456,4 +456,87 @@ class MiniLinux
return empty($errors);
}
+ /**
+ * Determine by which menus/locations each MiniLinux version is being used.
+ */
+ public static function getBootMenuUsage()
+ {
+ if (!Module::isAvailable('serversetup') || !class_exists('BootEntryHook'))
+ return [];
+ $builder = new LinuxBootEntryHook();
+ $res = Database::simpleQuery("SELECT be.entryid, be.data,
+ GROUP_CONCAT(DISTINCT me.menuid) AS menus,
+ GROUP_CONCAT(DISTINCT ml.locationid) AS locations
+ FROM serversetup_bootentry be
+ LEFT JOIN serversetup_menuentry me USING (entryid)
+ LEFT JOIN serversetup_menu_location ml USING (menuid)
+ WHERE module = 'minilinux'
+ GROUP BY be.data");
+ $return = [];
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ $data = json_decode($row['data'], true);
+ if (!isset($data['id']))
+ continue;
+ $id = self::resolveEntryId($data['id']);
+ if ($id === false)
+ continue;
+ $new = [
+ 'entryids' => [$row['entryid']],
+ 'menus' => explode(',', $row['menus']),
+ 'locations' => explode(',', $row['locations']),
+ ];
+ if (isset($return[$id])) {
+ $return[$id] = array_merge_recursive($return[$id], $new);
+ } else {
+ $return[$id] = $new;
+ }
+ }
+ // Flatten and arrayfy the list of menu ids
+ $ids = ArrayUtil::flattenByKey($return, 'menus');
+ $ids = array_reduce($ids, function ($carry, $item) {
+ return $carry + $item;
+ }, []);
+ // Build id => title map for menus
+ $res = Database::simpleQuery("SELECT menuid, title FROM serversetup_menu m
+ WHERE menuid IN (:menuid)", ['menuid' => $ids]);
+ $menus = [];
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ $menus[$row['menuid']] = $row['title'];
+ }
+ // Build output array
+ foreach ($return as &$item) {
+ $item['locations'] = array_map(function ($i) {
+ return ['locationid' => $i, 'locationname' => Location::getName($i)];
+ }, array_unique(array_filter($item['locations'], 'is_numeric')));
+ $item['menus'] = array_map(function ($i) use ($menus) {
+ return ['menuid' => $i, 'menuname' => $menus[$i]];
+ }, array_unique(array_filter($item['menus'], 'is_numeric')));
+ $item['locationCount'] = count($item['locations']);
+ $item['menuCount'] = count($item['menus']);
+ $item['entryCount'] = count($item['entryids']);
+ }
+ return $return;
+ }
+
+ /**
+ * Take a configured versionid from a bootentry (serversetup module) and translate
+ * it, in case it's "default" or just a branch name.
+ */
+ private static function resolveEntryId($id)
+ {
+ if ($id === 'default') { // Special case
+ $id = Property::get(MiniLinux::PROPERTY_DEFAULT_BOOT_EFFECTIVE);
+ }
+ if (substr_count($id, '/') < 2) {
+ // Maybe this is a branchid, which means latest from according branch (installed only)
+ $res = Database::queryFirst('SELECT versionid FROM minilinux_version WHERE branchid = :id AND installed = 1
+ ORDER BY dateline DESC LIMIT 1',
+ ['id' => $id]);
+ if ($res !== false) {
+ $id = $res['versionid'];
+ }
+ }
+ return $id;
+ }
+
} \ No newline at end of file
diff --git a/modules-available/minilinux/lang/de/template-tags.json b/modules-available/minilinux/lang/de/template-tags.json
index 81d589cc..3be2bea1 100644
--- a/modules-available/minilinux/lang/de/template-tags.json
+++ b/modules-available/minilinux/lang/de/template-tags.json
@@ -9,7 +9,10 @@
"lang_isGlobalDefault": "Ist globaler Standard",
"lang_key": "GPG-Key",
"lang_lastUpdate": "Zuletzt \u00fcberpr\u00fcft",
+ "lang_locations": "R\u00e4ume \/ Orte",
"lang_maybeMissingStage4": "Stage 4 m\u00f6glicherweise nicht verf\u00fcgbar",
+ "lang_menuEntries": "Men\u00fceintr\u00e4ge",
+ "lang_menus": "Men\u00fcs",
"lang_minilinuxHeading": "Netboot Linux verwalten",
"lang_orphanedVersion": "Verwaist",
"lang_orphanedVersionToolTip": "Diese Version wird vom Update-Server nicht mehr angeboten",
@@ -21,6 +24,7 @@
"lang_title": "Titel",
"lang_updateSourcesButton": "Nach neuen Updates suchen",
"lang_url": "URL",
+ "lang_usedBy": "Verwendet",
"lang_verify": "Integrit\u00e4t \u00fcberpr\u00fcfen",
"lang_verifyToolTip": "Dateiintegrit\u00e4t anhand von Pr\u00fcfsummen verifizieren",
"lang_version": "Version"
diff --git a/modules-available/minilinux/lang/en/template-tags.json b/modules-available/minilinux/lang/en/template-tags.json
index c2171820..5b3c77e4 100644
--- a/modules-available/minilinux/lang/en/template-tags.json
+++ b/modules-available/minilinux/lang/en/template-tags.json
@@ -9,7 +9,10 @@
"lang_isGlobalDefault": "Global default",
"lang_key": "GPG key",
"lang_lastUpdate": "Last updated",
+ "lang_locations": "Rooms \/ Locations",
"lang_maybeMissingStage4": "Stage 4 might be missing",
+ "lang_menuEntries": "Menu entries",
+ "lang_menus": "Menus",
"lang_minilinuxHeading": "Manage netboot base system",
"lang_orphanedVersion": "Orphaned",
"lang_orphanedVersionToolTip": "This version is not offered by the update server any more",
@@ -21,6 +24,7 @@
"lang_title": "Title",
"lang_updateSourcesButton": "Check for new updates",
"lang_url": "URL",
+ "lang_usedBy": "Used",
"lang_verify": "Check file integrity",
"lang_verifyToolTip": "Check all files against known checksums",
"lang_version": "Version"
diff --git a/modules-available/minilinux/page.inc.php b/modules-available/minilinux/page.inc.php
index 6e7fe8e2..03ec121e 100644
--- a/modules-available/minilinux/page.inc.php
+++ b/modules-available/minilinux/page.inc.php
@@ -41,11 +41,12 @@ class Page_MiniLinux extends Page
// List branches and versions
$branches = Database::queryAll('SELECT sourceid, branchid, title, description FROM minilinux_branch ORDER BY title ASC');
$versions = MiniLinux::queryAllVersionsByBranch();
- // Group by branch for detailed listing
+ $usage = MiniLinux::getBootMenuUsage();
+ // Group by branch for detailed listing, add usage info
foreach ($branches as &$branch) {
$branch['bid'] = 'div-' . str_replace('/', '-', $branch['branchid']);
if (isset($versions[$branch['branchid']])) {
- $branch['versionlist'] = $this->renderVersionList($versions[$branch['branchid']]);
+ $branch['versionlist'] = $this->renderVersionList($versions[$branch['branchid']], $usage);
}
}
unset($branch);
@@ -83,10 +84,10 @@ class Page_MiniLinux extends Page
}
}
- private function renderVersionList($versions)
+ private function renderVersionList($versions, $usage)
{
$def = Property::get(MiniLinux::PROPERTY_DEFAULT_BOOT);
- $eff = Property::get(MiniLinux::PROPERTY_DEFAULT_BOOT_EFFECTIVE);
+ //$eff = Property::get(MiniLinux::PROPERTY_DEFAULT_BOOT_EFFECTIVE);
foreach ($versions as &$version) {
$version['dateline_s'] = Util::prettyTime($version['dateline']);
$version['orphan'] = ($version['orphan'] > 0 && !$version['installed']) || ($version['orphan'] > 1);
@@ -100,6 +101,9 @@ class Page_MiniLinux extends Page
$version['default_class'] = 'bg-danger';
}
}
+ if (isset($usage[$version['versionid']])) {
+ $version['usage'] = $usage[$version['versionid']];
+ }
}
return Render::parse('versionlist', ['versions' => array_values($versions)]);
}
diff --git a/modules-available/minilinux/templates/versionlist.html b/modules-available/minilinux/templates/versionlist.html
index 2dbca085..d3a380ce 100644
--- a/modules-available/minilinux/templates/versionlist.html
+++ b/modules-available/minilinux/templates/versionlist.html
@@ -3,6 +3,7 @@
<th class="slx-smallcol">{{lang_version}}</th>
<th class="slx-smallcol">{{lang_releaseDate}}</th>
<th>{{lang_title}}</th>
+ <th class="slx-smallcol">{{lang_usedBy}}</th>
<th class="slx-smallcol"></th>
<th class="slx-smallcol" style="width:100px">{{lang_default}}</th>
<th class="slx-smallcol" style="width:150px">{{lang_download}}</th>
@@ -18,6 +19,34 @@
<td class="text-nowrap">{{dateline_s}}</td>
<td>{{title}}</td>
<td class="text-nowrap">
+ {{#usage.entryids.0}}
+ <div class="dropdown">
+ <button class="btn btn-default btn-xs dropdown-toggle" type="button" data-toggle="dropdown">
+ {{usage.entryCount}} / {{usage.menuCount}} / {{usage.locationCount}}
+ <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu">
+ <li role="separator" class="dropdown-header">{{lang_menuEntries}}</li>
+ {{#usage.entryids}}
+ <li><a href="?do=serversetup&amp;show=editbootentry&amp;id={{.}}">{{.}}</a></li>
+ {{/usage.entryids}}
+ {{#usage.menus.0}}
+ <li role="separator" class="dropdown-header">{{lang_menus}}</li>
+ {{/usage.menus.0}}
+ {{#usage.menus}}
+ <li><a href="?do=serversetup&amp;show=editmenu&amp;id={{menuid}}">{{menuname}}</a></li>
+ {{/usage.menus}}
+ {{#usage.locations.0}}
+ <li role="separator" class="dropdown-header">{{lang_locations}}</li>
+ {{/usage.locations.0}}
+ {{#usage.locations}}
+ <li class="disabled"><a href="#">{{locationname}}</a></li>
+ {{/usage.locations}}
+ </ul>
+ </div>
+ {{/usage.entryids.0}}
+ </td>
+ <td class="text-nowrap">
{{#orphan}}
<span class="label label-danger" title="{{lang_orphanedVersionToolTip}}">{{lang_orphanedVersion}}</span>
{{/orphan}}