From f72e4528dc0d4f8e34d9552bd833c4d9e9893647 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 28 Aug 2020 18:52:57 +0200 Subject: [minilinux] Show which menu(entries) and locations use a version --- modules-available/minilinux/inc/minilinux.inc.php | 83 ++++++++++++++++++++++ .../minilinux/lang/de/template-tags.json | 4 ++ .../minilinux/lang/en/template-tags.json | 4 ++ modules-available/minilinux/page.inc.php | 12 ++-- .../minilinux/templates/versionlist.html | 29 ++++++++ 5 files changed, 128 insertions(+), 4 deletions(-) (limited to 'modules-available') 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 @@ {{lang_version}} {{lang_releaseDate}} {{lang_title}} + {{lang_usedBy}} {{lang_default}} {{lang_download}} @@ -17,6 +18,34 @@ {{dateline_s}} {{title}} + + {{#usage.entryids.0}} + + {{/usage.entryids.0}} + {{#orphan}} {{lang_orphanedVersion}} -- cgit v1.2.3-55-g7522