- Добавлена колонка 'Тип' во все таблицы истории сборок - Для push операций отображается registry вместо платформ - Сохранение пользователя при создании push лога - Исправлена ошибка с logger в push_docker_image endpoint - Улучшено отображение истории сборок с визуальными индикаторами
114 lines
3.9 KiB
Python
114 lines
3.9 KiB
Python
"""
|
|
API endpoints для управления Ansible Vault
|
|
Автор: Сергей Антропов
|
|
Сайт: https://devops.org.ru
|
|
"""
|
|
|
|
from fastapi import APIRouter, Request, HTTPException, Form
|
|
from fastapi.responses import HTMLResponse, JSONResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
from pathlib import Path
|
|
from typing import List, Dict
|
|
from app.core.config import settings
|
|
|
|
router = APIRouter()
|
|
templates_path = Path(__file__).parent.parent.parent.parent / "templates"
|
|
templates = Jinja2Templates(directory=str(templates_path))
|
|
|
|
|
|
@router.get("/vault", response_class=HTMLResponse)
|
|
async def vault_page(request: Request):
|
|
"""Страница управления Ansible Vault"""
|
|
vault_dir = settings.PROJECT_ROOT / "vault"
|
|
vault_files = []
|
|
|
|
if vault_dir.exists():
|
|
# Ищем все .yml и .yaml файлы
|
|
for pattern in ["*.yml", "*.yaml"]:
|
|
for vault_file in vault_dir.glob(pattern):
|
|
if vault_file.is_file():
|
|
try:
|
|
vault_files.append({
|
|
"name": vault_file.name,
|
|
"path": str(vault_file.relative_to(settings.PROJECT_ROOT)),
|
|
"size": vault_file.stat().st_size
|
|
})
|
|
except Exception:
|
|
pass
|
|
|
|
return templates.TemplateResponse(
|
|
"pages/vault/index.html",
|
|
{
|
|
"request": request,
|
|
"vault_files": vault_files,
|
|
"vault_dir": str(vault_dir.relative_to(settings.PROJECT_ROOT)) if vault_dir.exists() else None
|
|
}
|
|
)
|
|
|
|
|
|
@router.get("/api/v1/vault/files")
|
|
async def get_vault_files():
|
|
"""API endpoint для получения списка Vault файлов"""
|
|
vault_dir = settings.PROJECT_ROOT / "vault"
|
|
vault_files = []
|
|
|
|
if vault_dir.exists():
|
|
for vault_file in vault_dir.glob("*.yml"):
|
|
vault_files.append({
|
|
"name": vault_file.name,
|
|
"path": str(vault_file),
|
|
"size": vault_file.stat().st_size
|
|
})
|
|
|
|
return {"files": vault_files}
|
|
|
|
|
|
@router.post("/api/v1/vault/encrypt")
|
|
async def encrypt_string(request: Request):
|
|
"""API endpoint для шифрования строки через Vault"""
|
|
from fastapi import Body
|
|
from app.services.vault_service import VaultService
|
|
|
|
data = await request.json()
|
|
content = data.get("content", "")
|
|
|
|
if not content:
|
|
from fastapi import HTTPException
|
|
raise HTTPException(status_code=400, detail="Содержимое не указано")
|
|
|
|
try:
|
|
vault_service = VaultService()
|
|
result = vault_service.encrypt_string(content)
|
|
return result
|
|
except ValueError as e:
|
|
from fastapi import HTTPException
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
except Exception as e:
|
|
from fastapi import HTTPException
|
|
raise HTTPException(status_code=500, detail=f"Ошибка шифрования: {str(e)}")
|
|
|
|
|
|
@router.post("/api/v1/vault/decrypt")
|
|
async def decrypt_string(request: Request):
|
|
"""API endpoint для расшифровки строки из Vault"""
|
|
from fastapi import Body
|
|
from app.services.vault_service import VaultService
|
|
|
|
data = await request.json()
|
|
content = data.get("content", "")
|
|
|
|
if not content:
|
|
from fastapi import HTTPException
|
|
raise HTTPException(status_code=400, detail="Содержимое не указано")
|
|
|
|
try:
|
|
vault_service = VaultService()
|
|
result = vault_service.decrypt_string(content)
|
|
return result
|
|
except ValueError as e:
|
|
from fastapi import HTTPException
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
except Exception as e:
|
|
from fastapi import HTTPException
|
|
raise HTTPException(status_code=500, detail=f"Ошибка расшифровки: {str(e)}")
|