From 1cad73e87c8af9800ee658bcf56610c837a612f2 Mon Sep 17 00:00:00 2001 From: Whispering Wind <151555003+ReturnFI@users.noreply.github.com> Date: Sat, 22 Feb 2025 00:21:38 +0330 Subject: [PATCH] Update Backup API --- .../routers/api/v1/config/hysteria.py | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/core/scripts/webpanel/routers/api/v1/config/hysteria.py b/core/scripts/webpanel/routers/api/v1/config/hysteria.py index ff9531d..2474419 100644 --- a/core/scripts/webpanel/routers/api/v1/config/hysteria.py +++ b/core/scripts/webpanel/routers/api/v1/config/hysteria.py @@ -1,7 +1,9 @@ from fastapi import APIRouter, HTTPException from ..schema.config.hysteria import ConfigFile, GetPortResponse, GetSniResponse from ..schema.response import DetailResponse +from fastapi.responses import FileResponse # from ..schema.config.hysteria import InstallInputBody +import os import cli_api router = APIRouter() @@ -147,22 +149,37 @@ async def set_sni_api(sni: str): raise HTTPException(status_code=400, detail=f'Error: {str(e)}') -@router.get('/backup', response_model=DetailResponse, summary='Backup Hysteria2 configuration') +@router.get('/backup', response_class=FileResponse, summary='Backup Hysteria2 configuration') async def backup(): """ - Backups the Hysteria2 configuration. - - Returns: - A DetailResponse with a message indicating the Hysteria2 configuration backup was successful. - - Raises: - HTTPException: if an error occurs while backing up the Hysteria2 configuration. + Backups the Hysteria2 configuration and sends the backup ZIP file. """ try: cli_api.backup_hysteria2() - return DetailResponse(detail='Hysteria2 configuration backed up successfully.') + backup_dir = "/opt/hysbackup/" + + if not os.path.isdir(backup_dir): + raise HTTPException(status_code=500, detail="Backup directory does not exist.") + + files = [f for f in os.listdir(backup_dir) if f.endswith('.zip')] + files.sort(key=lambda x: os.path.getctime(os.path.join(backup_dir, x)), reverse=True) + latest_backup_file = files[0] if files else None + + if latest_backup_file: + backup_file_path = os.path.join(backup_dir, latest_backup_file) + + if not backup_file_path.startswith(backup_dir): + raise HTTPException(status_code=400, detail="Invalid backup file path.") + + if not os.path.exists(backup_file_path): + raise HTTPException(status_code=404, detail="Backup file not found.") + + return FileResponse(path=backup_file_path, filename=os.path.basename(backup_file_path), media_type="application/zip") + else: + raise HTTPException(status_code=500, detail="No backup file found after backup process.") + except Exception as e: - raise HTTPException(status_code=400, detail=f'Error: {str(e)}') + raise HTTPException(status_code=500, detail=f'Error: {str(e)}') @router.get('/enable-obfs', response_model=DetailResponse, summary='Enable Hysteria2 obfs')