Files
mc_domain_proxy/api/routes/status.py
claude-bot d10dae5cb9 feat: implement MC domain filter proxy, API, dashboard
- proxy: asyncio TCP proxy with handshake parser, domain whitelist,
  transparent backend tunneling, SQLite logging, mtime hot reload
- api: FastAPI routes for config/domains/logs/status + restart trigger
- frontend: React + Vite NPM-style dashboard (dashboard/domains/logs/settings)
- nginx: reverse proxy for /api -> api:8000 and / -> frontend:3000
- docker-compose: full stack with shared data volume
- replace spec mc-domain-filter.md with README.md
2026-05-20 16:39:18 +09:00

60 lines
1.8 KiB
Python

"""프록시 상태 및 통계."""
from __future__ import annotations
import sqlite3
import time
from fastapi import APIRouter
from config_io import LOG_DB, load_config, save_config
router = APIRouter()
@router.get("/status")
def status() -> dict:
cfg = load_config()
total = allowed = blocked = errored = 0
last_ts: float | None = None
if LOG_DB.exists():
con = sqlite3.connect(LOG_DB)
try:
total = con.execute("SELECT COUNT(*) FROM connections").fetchone()[0]
allowed = con.execute(
"SELECT COUNT(*) FROM connections WHERE action='allowed'"
).fetchone()[0]
blocked = con.execute(
"SELECT COUNT(*) FROM connections WHERE action='blocked'"
).fetchone()[0]
errored = con.execute(
"SELECT COUNT(*) FROM connections WHERE action='error'"
).fetchone()[0]
row = con.execute(
"SELECT ts FROM connections ORDER BY id DESC LIMIT 1"
).fetchone()
last_ts = row[0] if row else None
finally:
con.close()
return {
"proxy_enabled": cfg.get("proxy", {}).get("enabled", True),
"listen_port": cfg.get("proxy", {}).get("listen_port"),
"backend": cfg.get("backend"),
"domain_count": len(cfg.get("allowed_domains", [])),
"stats": {
"total": total,
"allowed": allowed,
"blocked": blocked,
"error": errored,
"last_event_ts": last_ts,
},
"server_time": time.time(),
}
@router.post("/proxy/restart")
def restart_proxy() -> dict:
"""config 파일 mtime 을 갱신해서 프록시 watcher 가 재로드하게 한다."""
cfg = load_config()
save_config(cfg)
return {"ok": True, "note": "config touched; proxy will reload"}