summaryrefslogtreecommitdiffstats
path: root/modules-available/minilinux/inc/minilinux.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'modules-available/minilinux/inc/minilinux.inc.php')
-rw-r--r--modules-available/minilinux/inc/minilinux.inc.php83
1 files changed, 83 insertions, 0 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