From 9471de0388c747b9fe3512315d00c38e4afb1e50 Mon Sep 17 00:00:00 2001 From: Mike Degatano Date: Tue, 18 Feb 2025 21:43:51 +0000 Subject: [PATCH] Add current_start_only param --- supervisor/api/__init__.py | 10 ++++++++-- supervisor/api/const.py | 2 ++ supervisor/api/host.py | 19 ++++++++++++++++--- supervisor/docker/interface.py | 5 +++++ supervisor/host/const.py | 1 + 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/supervisor/api/__init__.py b/supervisor/api/__init__.py index f71e028f9..f13a3c9b5 100644 --- a/supervisor/api/__init__.py +++ b/supervisor/api/__init__.py @@ -16,7 +16,7 @@ from .audio import APIAudio from .auth import APIAuth from .backups import APIBackups from .cli import APICli -from .const import CONTENT_TYPE_TEXT +from .const import CONTENT_TYPE_TEXT, QUERY_CURRENT_START_ONLY from .discovery import APIDiscovery from .dns import APICoreDNS from .docker import APIDocker @@ -525,7 +525,13 @@ class RestAPI(CoreSysAttributes): @api_process_raw(CONTENT_TYPE_TEXT, error_type=CONTENT_TYPE_TEXT) async def get_addon_logs(request, *args, **kwargs): addon = api_addons.get_addon_for_request(request) - kwargs["identifier"] = f"addon_{addon.slug}" + if ( + QUERY_CURRENT_START_ONLY in request.query + and await addon.instance.is_running() + ): + kwargs["container_id_full"] = addon.instance.id + else: + kwargs["identifier"] = f"addon_{addon.slug}" return await self._api_host.advanced_logs(request, *args, **kwargs) self.webapp.add_routes( diff --git a/supervisor/api/const.py b/supervisor/api/const.py index aa89b0a20..7f68eac1f 100644 --- a/supervisor/api/const.py +++ b/supervisor/api/const.py @@ -75,6 +75,8 @@ ATTR_USER_PATH = "user_path" ATTR_VENDOR = "vendor" ATTR_VIRTUALIZATION = "virtualization" +QUERY_CURRENT_START_ONLY = "current_start_only" + class BootSlot(StrEnum): """Boot slots used by HAOS.""" diff --git a/supervisor/api/host.py b/supervisor/api/host.py index 7d2cc6650..80676edbc 100644 --- a/supervisor/api/host.py +++ b/supervisor/api/host.py @@ -31,6 +31,7 @@ from ..coresys import CoreSysAttributes from ..exceptions import APIDBMigrationInProgress, APIError, HostLogError from ..host.const import ( PARAM_BOOT_ID, + PARAM_CONTAINER_ID_FULL, PARAM_FOLLOW, PARAM_SYSLOG_IDENTIFIER, LogFormat, @@ -191,7 +192,11 @@ class APIHost(CoreSysAttributes): return possible_offset async def advanced_logs_handler( - self, request: web.Request, identifier: str | None = None, follow: bool = False + self, + request: web.Request, + identifier: str | None = None, + follow: bool = False, + container_id_full: str | None = None, ) -> web.StreamResponse: """Return systemd-journald logs.""" log_formatter = LogFormatter.PLAIN @@ -211,6 +216,8 @@ class APIHost(CoreSysAttributes): ) if follow: params[PARAM_FOLLOW] = "" + if container_id_full: + params[PARAM_CONTAINER_ID_FULL] = container_id_full if ACCEPT in request.headers and request.headers[ACCEPT] not in [ CONTENT_TYPE_TEXT, @@ -273,7 +280,13 @@ class APIHost(CoreSysAttributes): @api_process_raw(CONTENT_TYPE_TEXT, error_type=CONTENT_TYPE_TEXT) async def advanced_logs( - self, request: web.Request, identifier: str | None = None, follow: bool = False + self, + request: web.Request, + identifier: str | None = None, + follow: bool = False, + container_id_full: str | None = None, ) -> web.StreamResponse: """Return systemd-journald logs. Wrapped as standard API handler.""" - return await self.advanced_logs_handler(request, identifier, follow) + return await self.advanced_logs_handler( + request, identifier, follow, container_id_full + ) diff --git a/supervisor/docker/interface.py b/supervisor/docker/interface.py index 44446d53f..7fda58cbb 100644 --- a/supervisor/docker/interface.py +++ b/supervisor/docker/interface.py @@ -176,6 +176,11 @@ class DockerInterface(JobGroup): """Healthcheck of instance if it has one.""" return self.meta_config.get("Healthcheck") + @property + def id(self) -> str: + """Return id of container (if running) or image (if not).""" + return self._meta["Id"] + def _get_credentials(self, image: str) -> dict: """Return a dictionay with credentials for docker login.""" registry = None diff --git a/supervisor/host/const.py b/supervisor/host/const.py index 9c3a9dc4a..5601ba844 100644 --- a/supervisor/host/const.py +++ b/supervisor/host/const.py @@ -5,6 +5,7 @@ from enum import StrEnum PARAM_BOOT_ID = "_BOOT_ID" PARAM_FOLLOW = "follow" PARAM_SYSLOG_IDENTIFIER = "SYSLOG_IDENTIFIER" +PARAM_CONTAINER_ID_FULL = "CONTAINER_ID_FULL" class InterfaceMethod(StrEnum):