diff options
Diffstat (limited to 'modules-available/minilinux/inc/minilinux.inc.php')
-rw-r--r-- | modules-available/minilinux/inc/minilinux.inc.php | 83 |
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 |