diff --git a/src/cockpit/packages.py b/src/cockpit/packages.py index 0d648db3fe1..f43053ea25f 100644 --- a/src/cockpit/packages.py +++ b/src/cockpit/packages.py @@ -20,6 +20,7 @@ import functools import gzip import io +import itertools import json import logging import mimetypes @@ -490,8 +491,13 @@ def load(self) -> None: def show(self): for name in sorted(self.packages): package = self.packages[name] - menuitems = '' - print(f'{name:20} {menuitems:40} {package.path}') + menuitems = [] + for entry in itertools.chain( + package.manifest.get('menu', {}).values(), + package.manifest.get('tools', {}).values()): + with contextlib.suppress(KeyError): + menuitems.append(entry['label']) + print(f'{name:20} {", ".join(menuitems):40} {package.path}') def get_bridge_configs(self) -> Sequence[BridgeConfig]: def yield_configs(): diff --git a/test/verify/check-connection b/test/verify/check-connection index 58f7a009b23..25d84139806 100755 --- a/test/verify/check-connection +++ b/test/verify/check-connection @@ -1204,7 +1204,8 @@ UnixPath=/run/cockpit/session packages = m.execute("cockpit-bridge --packages") self.assertRegex(packages, r"(^|\n)base1\s+.*/usr/share/cockpit/base1") - self.assertRegex(packages, r"(^|\n)system\s+.*/usr/share/cockpit/systemd") + # also includes menu and tools entries + self.assertRegex(packages, r"(^|\n)system\s.*Services.*Terminal.*\s/usr/share/cockpit/systemd") if self.is_pybridge(): bridges = json.loads(m.execute("cockpit-bridge --bridges").strip())