""" 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)}")