Refactor bot and integrate services
This commit is contained in:
81
handlers/docker.py
Normal file
81
handlers/docker.py
Normal file
@@ -0,0 +1,81 @@
|
||||
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
|
||||
from services.runner import run_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 run_cmd(
|
||||
[
|
||||
"sudo", "docker", "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)
|
||||
Reference in New Issue
Block a user