import os import shutil import psutil import platform import time import httpx from fastapi import APIRouter, Query from config import TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, VOLUME_ROOT router = APIRouter() @router.post("/notify") async def send_notification(body: dict): """Send a Telegram notification. Body: {"message": "text"}""" msg = body.get("message", "") if not msg or not TELEGRAM_BOT_TOKEN or not TELEGRAM_CHAT_ID: return {"ok": False, "error": "missing message or Telegram config"} proxy_url = os.environ.get("TELEGRAM_PROXY") async with httpx.AsyncClient(proxy=proxy_url) as client: r = await client.post( f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage", data={"chat_id": TELEGRAM_CHAT_ID, "text": msg, "parse_mode": "Markdown"}, ) return {"ok": r.status_code == 200} @router.get("/stats") def system_stats(): disk = shutil.disk_usage("/volume1") mem = psutil.virtual_memory() cpu_pct = psutil.cpu_percent(interval=0.5) load_1, load_5, load_15 = psutil.getloadavg() uptime_s = time.time() - psutil.boot_time() days = int(uptime_s // 86400) hours = int((uptime_s % 86400) // 3600) return { "cpu_percent": cpu_pct, "cpu_count": psutil.cpu_count(), "load_avg": [round(load_1, 2), round(load_5, 2), round(load_15, 2)], "memory": { "total": mem.total, "used": mem.used, "percent": mem.percent, }, "disk": { "total": disk.total, "used": disk.used, "free": disk.free, "percent": round(disk.used / disk.total * 100, 1), }, "uptime": f"{days}d {hours}h", "platform": platform.platform(), } @router.get("/audit-log") def audit_log(lines: int = Query(100, le=500)): log_path = os.path.join(VOLUME_ROOT, "docker/nas-dashboard/audit.log") if not os.path.exists(log_path): return {"lines": []} with open(log_path, "rb") as f: f.seek(0, 2) size = f.tell() buf = min(size, lines * 200) f.seek(max(0, size - buf)) data = f.read().decode(errors="replace").splitlines() return {"lines": data[-lines:]}