脚本一键化
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException, Header, Cookie
|
||||
from fastapi.responses import JSONResponse
|
||||
from fastapi import APIRouter, Depends, HTTPException, Header, Cookie, Request
|
||||
from fastapi.responses import JSONResponse, PlainTextResponse
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy import select, func
|
||||
from sqlalchemy.orm import selectinload
|
||||
@@ -652,6 +652,47 @@ async def admin_download_script(
|
||||
)
|
||||
|
||||
|
||||
@router.get("/script/setup")
|
||||
async def admin_setup_script(
|
||||
request: Request,
|
||||
domain: str,
|
||||
server_name: str,
|
||||
os: str = "linux",
|
||||
authorization: str = Header(None),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
_: bool = Depends(require_auth),
|
||||
):
|
||||
"""生成一键安装脚本(纯文本下载)"""
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
template_dir = Path(__file__).parent.parent / "templates_cert"
|
||||
jinja_env = Environment(loader=FileSystemLoader(str(template_dir)))
|
||||
|
||||
settings = get_settings()
|
||||
base_url = str(request.base_url).rstrip("/")
|
||||
ext = "ps1" if os == "windows" else "sh"
|
||||
download_url = f"{base_url}/admin/api/script/download?domain={domain}&server_name={server_name}&os={os}"
|
||||
|
||||
# 提取 admin token 用于嵌入脚本
|
||||
admin_token = ""
|
||||
if authorization and authorization.startswith("Bearer "):
|
||||
admin_token = authorization[7:]
|
||||
|
||||
template_name = "setup-cert.ps1.j2" if os == "windows" else "setup-cert.sh.j2"
|
||||
tpl = jinja_env.get_template(template_name)
|
||||
script = tpl.render(
|
||||
domain=domain,
|
||||
server_name=server_name,
|
||||
download_url=download_url,
|
||||
admin_token=admin_token,
|
||||
)
|
||||
filename = f"setup-{domain.replace('*', '_')}.{ext}"
|
||||
return PlainTextResponse(
|
||||
script,
|
||||
headers={"Content-Disposition": f'attachment; filename="{filename}"'},
|
||||
)
|
||||
|
||||
|
||||
# ──────────────── 证书信息 ────────────────
|
||||
|
||||
@router.get("/cert-info/{domain_id}")
|
||||
|
||||
Reference in New Issue
Block a user