- 37개 파일 IP → zioinfo.co.kr 치환 (소스/매뉴얼/설정/하네스) - Manager DrConsole/NetworkConsole/CsapConsole 빌드 + /var/www/manager/ 배포 - 테스트: Manager HTTP 200, ITSM 신규 API 7개 전체 200 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
import subprocess
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
from core.auth import verify_token, require_admin
|
|
|
|
router = APIRouter()
|
|
|
|
ALLOWED_SVCS = {
|
|
"nginx", "zioinfo", "zioinfo-deploy", "guardia", "guardia-manager",
|
|
"gitea", "jenkins", "postgresql", "ollama",
|
|
}
|
|
|
|
@router.get("/resources")
|
|
async def resources(_=Depends(verify_token)):
|
|
try:
|
|
import psutil
|
|
cpu = psutil.cpu_percent(interval=0.2)
|
|
mem = psutil.virtual_memory()
|
|
disk = psutil.disk_usage("/")
|
|
return {
|
|
"cpu_percent": round(cpu, 1),
|
|
"memory": {"total_gb": round(mem.total/1e9,1), "used_gb": round(mem.used/1e9,1), "percent": mem.percent},
|
|
"disk": {"total_gb": round(disk.total/1e9,1),"used_gb": round(disk.used/1e9,1), "percent": disk.percent},
|
|
}
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
@router.get("/services")
|
|
async def services(_=Depends(verify_token)):
|
|
result: dict[str, str] = {}
|
|
for svc in ALLOWED_SVCS:
|
|
p = subprocess.run(["systemctl", "is-active", svc], capture_output=True, text=True)
|
|
result[svc] = p.stdout.strip()
|
|
return result
|
|
|
|
@router.post("/services/{name}/restart")
|
|
async def restart(name: str, admin=Depends(require_admin)):
|
|
if name not in ALLOWED_SVCS:
|
|
raise HTTPException(status_code=400, detail="허용되지 않은 서비스")
|
|
p = subprocess.run(["systemctl", "restart", name], capture_output=True, text=True)
|
|
if p.returncode != 0:
|
|
raise HTTPException(status_code=500, detail=p.stderr[:300])
|
|
return {"message": f"{name} 재시작 완료"}
|