from aiogram import F 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, docker_cmd from state import DOCKER_MAP async def cmd_docker_status(msg: Message): try: if not DOCKER_MAP: await msg.answer( "⚠️ DOCKER_MAP пуст.\n" "Контейнеры не обнаружены.", reply_markup=docker_kb, ) return lines = ["🐳 Docker containers\n"] for alias, real in DOCKER_MAP.items(): rc, raw = await docker_cmd( ["inspect", "-f", "{{.State.Status}}|{{.State.StartedAt}}", real], timeout=10, ) if rc != 0: lines.append(f"🔴 {alias}: inspect error") continue raw = raw.strip() if "|" not in raw: lines.append(f"🟡 {alias}: invalid inspect output") continue status, started = raw.split("|", 1) up = container_uptime(started) icon = "🟢" if status == "running" else "🔴" lines.append(f"{icon} {alias}: {status} ({up})") await msg.answer("\n".join(lines), reply_markup=docker_kb) except Exception as e: # ⬅️ КРИТИЧЕСКИ ВАЖНО await msg.answer( "❌ Docker status crashed:\n" f"```{type(e).__name__}: {e}```", reply_markup=docker_kb, parse_mode="Markdown", ) @dp.message(F.text == "🔄 Restart") async def dr(msg: Message): if is_admin_msg(msg): await msg.answer( "🔄 Выберите контейнер для рестарта:", reply_markup=docker_inline_kb("restart") ) @dp.message(F.text == "📜 Logs") async def dl(msg: Message): if is_admin_msg(msg): await msg.answer( "📜 Выберите контейнер для логов:", reply_markup=docker_inline_kb("logs") ) @dp.message(F.text == "🐳 Status") async def ds(msg: Message): if is_admin_msg(msg): await cmd_docker_status(msg)