From 441bafa116004224c762c6cf1d43b8d7795b6d8d Mon Sep 17 00:00:00 2001 From: benya Date: Sat, 7 Feb 2026 22:20:42 +0300 Subject: [PATCH] Fix docker discovery with sudo fallback --- handlers/callbacks.py | 8 +++----- handlers/docker.py | 11 +++-------- services/docker.py | 30 +++++++++++++++--------------- 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/handlers/callbacks.py b/handlers/callbacks.py index af100d2..f6b571e 100644 --- a/handlers/callbacks.py +++ b/handlers/callbacks.py @@ -2,7 +2,7 @@ import json from aiogram import F from aiogram.types import CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton from app import dp, ADMIN_ID -from services.runner import run_cmd +from services.docker import docker_cmd from state import DOCKER_MAP from handlers.backup import cmd_backup_status @@ -17,7 +17,7 @@ async def docker_callback(cb: CallbackQuery): if action == "restart": await cb.answer("Restarting…") - rc, out = await run_cmd(["sudo", "docker", "restart", real]) + rc, out = await docker_cmd(["restart", real]) await cb.message.answer( f"🔄 **{alias} restarted**\n```{out}```", @@ -26,9 +26,7 @@ async def docker_callback(cb: CallbackQuery): elif action == "logs": await cb.answer("Loading logs…") - rc, out = await run_cmd( - ["sudo", "docker", "logs", "--tail", "80", real] - ) + rc, out = await docker_cmd(["logs", "--tail", "80", real]) await cb.message.answer( f"📜 **Logs: {alias}**\n```{out}```", diff --git a/handlers/docker.py b/handlers/docker.py index 117b22a..ececcf1 100644 --- a/handlers/docker.py +++ b/handlers/docker.py @@ -3,8 +3,7 @@ from aiogram.types import Message from app import dp from auth import is_admin_msg from keyboards import docker_kb, docker_inline_kb -from services.docker import container_uptime -from services.runner import run_cmd +from services.docker import container_uptime, docker_cmd from state import DOCKER_MAP @@ -21,12 +20,8 @@ async def cmd_docker_status(msg: Message): lines = ["🐳 Docker containers\n"] for alias, real in DOCKER_MAP.items(): - rc, raw = await run_cmd( - [ - "sudo", "docker", "inspect", - "-f", "{{.State.Status}}|{{.State.StartedAt}}", - real - ], + rc, raw = await docker_cmd( + ["inspect", "-f", "{{.State.Status}}|{{.State.StartedAt}}", real], timeout=10, ) diff --git a/services/docker.py b/services/docker.py index 7ed9c4e..74a106c 100644 --- a/services/docker.py +++ b/services/docker.py @@ -33,10 +33,7 @@ async def build_docker_map(cfg) -> Dict[str, str]: # 1. autodiscovery if docker_cfg.get("autodiscovery"): - rc, raw = await run_cmd( - ["sudo", "docker", "ps", "--format", "{{.Names}}"], - timeout=20 - ) + rc, raw = await docker_cmd(["ps", "--format", "{{.Names}}"], timeout=20) if rc == 0: names = raw.splitlines() patterns = docker_cfg.get("match", []) @@ -61,10 +58,7 @@ async def discover_containers(cfg) -> Dict[str, str]: # --- autodiscovery --- if docker_cfg.get("autodiscovery"): - rc, raw = await run_cmd( - ["sudo", "docker", "ps", "--format", "{{.Names}}"], - timeout=20 - ) + rc, raw = await docker_cmd(["ps", "--format", "{{.Names}}"], timeout=20) if rc == 0: found = raw.splitlines() @@ -76,11 +70,10 @@ async def discover_containers(cfg) -> Dict[str, str]: # label-based discovery if label: key, val = label.split("=", 1) - rc2, lbl = await run_cmd([ - "sudo", "docker", "inspect", - "-f", f"{{{{ index .Config.Labels \"{key}\" }}}}", - name - ]) + rc2, lbl = await docker_cmd( + ["inspect", "-f", f"{{{{ index .Config.Labels \"{key}\" }}}}", name], + timeout=10 + ) if rc2 == 0 and lbl.strip() == val: result[name] = name continue @@ -97,12 +90,19 @@ async def discover_containers(cfg) -> Dict[str, str]: return result +async def docker_cmd(args: list[str], timeout: int = 20): + rc, out = await run_cmd(["docker"] + args, timeout=timeout) + if rc == 0: + return rc, out + return await run_cmd(["sudo", "docker"] + args, timeout=timeout) + + async def docker_watchdog(container_map, notify, bot, chat_id): last = {} while True: for alias, real in container_map.items(): - rc, state = await run_cmd( - ["docker", "inspect", "-f", "{{.State.Status}}", real], + rc, state = await docker_cmd( + ["inspect", "-f", "{{.State.Status}}", real], timeout=10 ) if rc != 0: