96 lines
3.4 KiB
Python
96 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
LogBoard+ - Контейнеры API
|
|
Автор: Сергей Антропов
|
|
Сайт: https://devops.org.ru
|
|
"""
|
|
|
|
from typing import List, Optional
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query, Body
|
|
from fastapi.responses import JSONResponse
|
|
|
|
from app.core.auth import get_current_user
|
|
from app.core.docker import (
|
|
load_excluded_containers,
|
|
save_excluded_containers,
|
|
get_all_projects,
|
|
list_containers,
|
|
DEFAULT_PROJECT,
|
|
DEFAULT_PROJECTS
|
|
)
|
|
|
|
router = APIRouter()
|
|
|
|
@router.get("/excluded")
|
|
def api_get_excluded_containers(current_user: str = Depends(get_current_user)):
|
|
"""Получить список исключенных контейнеров"""
|
|
return JSONResponse(
|
|
content={"excluded_containers": load_excluded_containers()},
|
|
headers={
|
|
"Cache-Control": "no-cache, no-store, must-revalidate",
|
|
"Pragma": "no-cache",
|
|
"Expires": "0"
|
|
}
|
|
)
|
|
|
|
@router.post("/excluded")
|
|
def api_update_excluded_containers(
|
|
containers: List[str] = Body(...),
|
|
current_user: str = Depends(get_current_user)
|
|
):
|
|
"""Обновить список исключенных контейнеров"""
|
|
success = save_excluded_containers(containers)
|
|
if success:
|
|
return JSONResponse(
|
|
content={"status": "success", "message": "Список исключенных контейнеров обновлен"},
|
|
headers={
|
|
"Cache-Control": "no-cache, no-store, must-revalidate",
|
|
"Pragma": "no-cache",
|
|
"Expires": "0"
|
|
}
|
|
)
|
|
else:
|
|
raise HTTPException(
|
|
status_code=500,
|
|
detail="Ошибка сохранения списка исключенных контейнеров. Попробуйте еще раз или обратитесь к администратору."
|
|
)
|
|
|
|
@router.get("/projects")
|
|
def api_projects(current_user: str = Depends(get_current_user)):
|
|
"""Получить список всех проектов Docker Compose"""
|
|
return JSONResponse(
|
|
content=get_all_projects(),
|
|
headers={
|
|
"Cache-Control": "no-cache, no-store, must-revalidate",
|
|
"Pragma": "no-cache",
|
|
"Expires": "0"
|
|
}
|
|
)
|
|
|
|
@router.get("/services")
|
|
def api_services(
|
|
projects: Optional[str] = Query(None),
|
|
include_stopped: bool = Query(False),
|
|
current_user: str = Depends(get_current_user)
|
|
):
|
|
"""Получить список контейнеров с поддержкой множественных проектов"""
|
|
project_list = None
|
|
if projects:
|
|
project_list = [p.strip() for p in projects.split(",") if p.strip()]
|
|
elif DEFAULT_PROJECTS and DEFAULT_PROJECTS.strip():
|
|
project_list = [p.strip() for p in DEFAULT_PROJECTS.split(",") if p.strip()]
|
|
elif DEFAULT_PROJECT and DEFAULT_PROJECT.strip():
|
|
project_list = [DEFAULT_PROJECT]
|
|
# Если ни одна переменная не указана или пустая, показываем все контейнеры (project_list остается None)
|
|
|
|
return JSONResponse(
|
|
content=list_containers(projects=project_list, include_stopped=include_stopped),
|
|
headers={
|
|
"Cache-Control": "no-cache, no-store, must-revalidate",
|
|
"Pragma": "no-cache",
|
|
"Expires": "0"
|
|
}
|
|
)
|