fix(tarpit): resolve topology container name in watcher before PID lookup

This commit is contained in:
2026-04-29 21:14:21 -04:00
parent 917f7e8e54
commit a322d88b3c

View File

@@ -19,6 +19,7 @@ import socket
from datetime import datetime, timezone
from typing import Any, Optional
from decnet.decky_io.resolve import resolve_decky_container
from decnet.logging import get_logger
from decnet.network import get_container_pid
from decnet.web.db.repository import BaseRepository
@@ -144,10 +145,26 @@ async def _tick(
current: set[tuple[str, str, int]] = set()
for rule in rules:
decky_name: str = rule["decky_name"]
db_key: str = rule["decky_name"]
ports: list[int] = rule["ports"]
# Topology deckies are stored as "t:{topology_id}:{decky_name}".
# Resolve the real container name before asking Docker for its PID.
if db_key.startswith("t:"):
_, topology_id, decky_name = db_key.split(":", 2)
try:
container = await resolve_decky_container(
repo, decky_name, topology_id=topology_id,
)
except LookupError as exc:
log.debug("tarpit watcher: %s", exc)
continue
else:
decky_name = db_key
container = db_key
try:
pid = await asyncio.to_thread(get_container_pid, decky_name)
pid = await asyncio.to_thread(get_container_pid, container)
except LookupError as exc:
log.debug("tarpit watcher: %s", exc)
continue