Fix docker discovery with sudo fallback
This commit is contained in:
@@ -2,7 +2,7 @@ import json
|
|||||||
from aiogram import F
|
from aiogram import F
|
||||||
from aiogram.types import CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton
|
from aiogram.types import CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton
|
||||||
from app import dp, ADMIN_ID
|
from app import dp, ADMIN_ID
|
||||||
from services.runner import run_cmd
|
from services.docker import docker_cmd
|
||||||
from state import DOCKER_MAP
|
from state import DOCKER_MAP
|
||||||
from handlers.backup import cmd_backup_status
|
from handlers.backup import cmd_backup_status
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ async def docker_callback(cb: CallbackQuery):
|
|||||||
|
|
||||||
if action == "restart":
|
if action == "restart":
|
||||||
await cb.answer("Restarting…")
|
await cb.answer("Restarting…")
|
||||||
rc, out = await run_cmd(["sudo", "docker", "restart", real])
|
rc, out = await docker_cmd(["restart", real])
|
||||||
|
|
||||||
await cb.message.answer(
|
await cb.message.answer(
|
||||||
f"🔄 **{alias} restarted**\n```{out}```",
|
f"🔄 **{alias} restarted**\n```{out}```",
|
||||||
@@ -26,9 +26,7 @@ async def docker_callback(cb: CallbackQuery):
|
|||||||
|
|
||||||
elif action == "logs":
|
elif action == "logs":
|
||||||
await cb.answer("Loading logs…")
|
await cb.answer("Loading logs…")
|
||||||
rc, out = await run_cmd(
|
rc, out = await docker_cmd(["logs", "--tail", "80", real])
|
||||||
["sudo", "docker", "logs", "--tail", "80", real]
|
|
||||||
)
|
|
||||||
|
|
||||||
await cb.message.answer(
|
await cb.message.answer(
|
||||||
f"📜 **Logs: {alias}**\n```{out}```",
|
f"📜 **Logs: {alias}**\n```{out}```",
|
||||||
|
|||||||
@@ -3,8 +3,7 @@ from aiogram.types import Message
|
|||||||
from app import dp
|
from app import dp
|
||||||
from auth import is_admin_msg
|
from auth import is_admin_msg
|
||||||
from keyboards import docker_kb, docker_inline_kb
|
from keyboards import docker_kb, docker_inline_kb
|
||||||
from services.docker import container_uptime
|
from services.docker import container_uptime, docker_cmd
|
||||||
from services.runner import run_cmd
|
|
||||||
from state import DOCKER_MAP
|
from state import DOCKER_MAP
|
||||||
|
|
||||||
|
|
||||||
@@ -21,12 +20,8 @@ async def cmd_docker_status(msg: Message):
|
|||||||
lines = ["🐳 Docker containers\n"]
|
lines = ["🐳 Docker containers\n"]
|
||||||
|
|
||||||
for alias, real in DOCKER_MAP.items():
|
for alias, real in DOCKER_MAP.items():
|
||||||
rc, raw = await run_cmd(
|
rc, raw = await docker_cmd(
|
||||||
[
|
["inspect", "-f", "{{.State.Status}}|{{.State.StartedAt}}", real],
|
||||||
"sudo", "docker", "inspect",
|
|
||||||
"-f", "{{.State.Status}}|{{.State.StartedAt}}",
|
|
||||||
real
|
|
||||||
],
|
|
||||||
timeout=10,
|
timeout=10,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -33,10 +33,7 @@ async def build_docker_map(cfg) -> Dict[str, str]:
|
|||||||
|
|
||||||
# 1. autodiscovery
|
# 1. autodiscovery
|
||||||
if docker_cfg.get("autodiscovery"):
|
if docker_cfg.get("autodiscovery"):
|
||||||
rc, raw = await run_cmd(
|
rc, raw = await docker_cmd(["ps", "--format", "{{.Names}}"], timeout=20)
|
||||||
["sudo", "docker", "ps", "--format", "{{.Names}}"],
|
|
||||||
timeout=20
|
|
||||||
)
|
|
||||||
if rc == 0:
|
if rc == 0:
|
||||||
names = raw.splitlines()
|
names = raw.splitlines()
|
||||||
patterns = docker_cfg.get("match", [])
|
patterns = docker_cfg.get("match", [])
|
||||||
@@ -61,10 +58,7 @@ async def discover_containers(cfg) -> Dict[str, str]:
|
|||||||
|
|
||||||
# --- autodiscovery ---
|
# --- autodiscovery ---
|
||||||
if docker_cfg.get("autodiscovery"):
|
if docker_cfg.get("autodiscovery"):
|
||||||
rc, raw = await run_cmd(
|
rc, raw = await docker_cmd(["ps", "--format", "{{.Names}}"], timeout=20)
|
||||||
["sudo", "docker", "ps", "--format", "{{.Names}}"],
|
|
||||||
timeout=20
|
|
||||||
)
|
|
||||||
|
|
||||||
if rc == 0:
|
if rc == 0:
|
||||||
found = raw.splitlines()
|
found = raw.splitlines()
|
||||||
@@ -76,11 +70,10 @@ async def discover_containers(cfg) -> Dict[str, str]:
|
|||||||
# label-based discovery
|
# label-based discovery
|
||||||
if label:
|
if label:
|
||||||
key, val = label.split("=", 1)
|
key, val = label.split("=", 1)
|
||||||
rc2, lbl = await run_cmd([
|
rc2, lbl = await docker_cmd(
|
||||||
"sudo", "docker", "inspect",
|
["inspect", "-f", f"{{{{ index .Config.Labels \"{key}\" }}}}", name],
|
||||||
"-f", f"{{{{ index .Config.Labels \"{key}\" }}}}",
|
timeout=10
|
||||||
name
|
)
|
||||||
])
|
|
||||||
if rc2 == 0 and lbl.strip() == val:
|
if rc2 == 0 and lbl.strip() == val:
|
||||||
result[name] = name
|
result[name] = name
|
||||||
continue
|
continue
|
||||||
@@ -97,12 +90,19 @@ async def discover_containers(cfg) -> Dict[str, str]:
|
|||||||
return result
|
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):
|
async def docker_watchdog(container_map, notify, bot, chat_id):
|
||||||
last = {}
|
last = {}
|
||||||
while True:
|
while True:
|
||||||
for alias, real in container_map.items():
|
for alias, real in container_map.items():
|
||||||
rc, state = await run_cmd(
|
rc, state = await docker_cmd(
|
||||||
["docker", "inspect", "-f", "{{.State.Status}}", real],
|
["inspect", "-f", "{{.State.Status}}", real],
|
||||||
timeout=10
|
timeout=10
|
||||||
)
|
)
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
|
|||||||
Reference in New Issue
Block a user