ligbox-ops-platform/deploy/vm112-wizard/deploy-mail-bundle-vm112.py
Ligbox Spec Hub 884321c43b Spec 043/035: FOSS ligbox-mail-business + mail-bundle VM112
Cria produto FOSS (product_id=3), endpoint mail-bundle no wizard VM112 com
contrato documentado, e runbook de deploy para fechar o ciclo de activação.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-01 16:54:40 +00:00

62 lines
2.1 KiB
Python

#!/usr/bin/env python3
"""Deploy mail-bundle endpoint na VM112 — executar NO host (Spec 035/043).
Uso (a partir do clone ligbox-ops-platform na VM112 ou CT130 com scp):
REPO=/opt/ligbox-spec-hub/repos/ligbox-ops-platform
python3 $REPO/deploy/vm112-wizard/deploy-mail-bundle-vm112.py
systemctl restart ligbox-wizard
"""
from __future__ import annotations
import ast
import shutil
import sys
from pathlib import Path
REPO = Path(sys.argv[1] if len(sys.argv) > 1 else "/opt/ligbox-spec-hub/repos/ligbox-ops-platform")
WIZARD = Path("/opt/ligbox-wizard")
SRC_SVC = REPO / "projects/wizard/backend/app/services/mail_bundle.py"
SRC_ROUTER = REPO / "projects/wizard/backend/app/routers/internal_provision.py"
DST_SVC = WIZARD / "backend/app/services/mail_bundle.py"
DST_ROUTER = WIZARD / "backend/app/routers/internal_provision.py"
MAIN = WIZARD / "backend/app/main.py"
if not WIZARD.is_dir():
print("ERRO: /opt/ligbox-wizard não encontrado — executar na VM112")
sys.exit(1)
if not SRC_SVC.is_file():
print(f"ERRO: fonte não encontrada: {SRC_SVC}")
sys.exit(1)
shutil.copy2(SRC_SVC, DST_SVC)
shutil.copy2(SRC_ROUTER, DST_ROUTER)
print("copied mail_bundle.py + internal_provision.py")
text = MAIN.read_text(encoding="utf-8")
if "internal_provision" not in text:
old = " telemetry,\n)"
new = " telemetry,\n internal_provision,\n)"
if old in text:
text = text.replace(old, new)
else:
text = text.replace(
"from app.routers import",
"from app.routers import internal_provision,",
1,
)
if "internal_provision.router" not in text:
anchor = 'app.include_router(onboarding.router, prefix="/api")'
if anchor in text:
text = text.replace(
anchor,
anchor + '\napp.include_router(internal_provision.router, prefix="/api")',
)
else:
text = text.rstrip() + '\napp.include_router(internal_provision.router, prefix="/api")\n'
MAIN.write_text(text, encoding="utf-8")
ast.parse(text)
print("main.py patched")
print("OK — reiniciar: systemctl restart ligbox-wizard")