fix (containers): gebruik PODMAN_SYSTEMD_UNIT label als ground truth voor Managed By
De oude logica miste .kube quadlets volledig: het zocht alleen naar .container bestanden op naam en gebruikte een fragiele pod-naam heuristiek als fallback. Containers gestart via mediaserver.kube en bookstack.kube werden daardoor als 'podman' geclassificeerd terwijl ze systemd-beheerd zijn. PODMAN_SYSTEMD_UNIT label wordt door Podman/systemd automatisch gezet op elke container gestart via een quadlet (.container, .kube, .pod). Dit is de enige betrouwbare bron. Verwijderd: _unit_is_active(), unit_active_cache, _map_pod_to_unit import. Behouden: find_defined_containers() voor section C (offline containers) en action routing (start/stop/restart via systemd unit). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,6 @@ from fastapi.responses import StreamingResponse
|
||||
from pydantic import BaseModel, Field
|
||||
from common import (
|
||||
_helper_call,
|
||||
_map_pod_to_unit,
|
||||
_podman_action_post,
|
||||
_podman_get_json,
|
||||
_podman_get_text,
|
||||
@@ -412,21 +411,8 @@ def init_containers_router(
|
||||
dashboard = []
|
||||
defined = find_defined_containers()
|
||||
|
||||
# Cache zodat we niet voor elke container opnieuw systemctl doen
|
||||
unit_active_cache = {}
|
||||
|
||||
stats_by_name = _STATS_CACHE_BY_NAME
|
||||
|
||||
def _unit_is_active(unit):
|
||||
if not unit:
|
||||
return False
|
||||
if unit in unit_active_cache:
|
||||
return unit_active_cache[unit]
|
||||
code, out = systemctl_func(["systemctl", "--user", "is-active", unit])
|
||||
ok = (code == 0) or ((out or "").strip() == "active")
|
||||
unit_active_cache[unit] = ok
|
||||
return ok
|
||||
|
||||
# A) echte containers (runtime)
|
||||
real = _podman_get_json(session, f"{podman_api_base}/libpod/containers/json?all=true")
|
||||
for c in real:
|
||||
@@ -448,23 +434,19 @@ def init_containers_router(
|
||||
c["_dashboard_mem_usage"] = st.get("mem_usage")
|
||||
c["_dashboard_mem_perc"] = st.get("mem_perc")
|
||||
|
||||
# 1) Managed: systemd als er een .container definitie bestaat
|
||||
if rname in defined:
|
||||
# Classificatie: PODMAN_SYSTEMD_UNIT label is ground truth
|
||||
labels = c.get("Labels") or {}
|
||||
podman_unit = labels.get("PODMAN_SYSTEMD_UNIT") or ""
|
||||
if podman_unit:
|
||||
c["_dashboard_source"] = "systemd"
|
||||
c["_dashboard_unit"] = f"{rname}.service"
|
||||
c["_dashboard_def_path"] = defined[rname]
|
||||
else:
|
||||
# 2) Extra: zit container in een pod die via systemd (kube/quadlet) draait?
|
||||
podname = (c.get("PodName") or "").strip()
|
||||
pod_unit = _map_pod_to_unit(podname) if podname else None
|
||||
|
||||
if pod_unit and _unit_is_active(pod_unit):
|
||||
c["_dashboard_source"] = "systemd"
|
||||
c["_dashboard_unit"] = pod_unit
|
||||
# geen _dashboard_def_path, want dit is geen .container definitie
|
||||
c["_dashboard_unit"] = podman_unit
|
||||
else:
|
||||
c["_dashboard_source"] = "podman"
|
||||
|
||||
# Definitiepad: onafhankelijk van classificatie
|
||||
if rname in defined:
|
||||
c["_dashboard_def_path"] = defined[rname]
|
||||
|
||||
dashboard.append(c)
|
||||
|
||||
# B) Dedup set: ook genormaliseerd (voorkomt /name vs name doublures)
|
||||
|
||||
Reference in New Issue
Block a user