feature/generador-instaladores-linux-windows

This commit is contained in:
2026-07-30 07:34:17 -06:00
parent cafe3f1b87
commit c3f1d70e23
34 changed files with 3498 additions and 252 deletions

View File

@@ -28,9 +28,53 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
action="store_true",
help="Fuerza el modo sin interfaz (Qt offscreen) para servidores sin display",
)
parser.add_argument(
"--version",
action="store_true",
help="Imprime la versión, plataforma y arquitectura, y termina",
)
return parser.parse_args(argv)
def _attach_windows_console() -> None:
"""
El .exe se compila con console=False (app de ventana), así que sin consola propia
stdout va al vacío. Cuando se invoca desde una terminal, se engancha a la consola
del proceso padre para que --version sea legible. En Linux no aplica.
"""
if sys.platform != "win32":
return
try:
import ctypes
attach_parent_process = -1
if not ctypes.windll.kernel32.AttachConsole(attach_parent_process):
return # sin consola del padre (doble clic): no hay dónde escribir
sys.stdout = open("CONOUT$", "w", encoding="utf-8", buffering=1)
sys.stderr = open("CONOUT$", "w", encoding="utf-8", buffering=1)
except (OSError, AttributeError):
# Sin consola disponible; el instalador remoto verifica por config/.version.
pass
def _print_version() -> int:
"""
Imprime la versión sin arrancar Qt ni el bootstrap: --version es una consulta.
El instalador remoto del PANEL prefiere leer config/.version (que el bootstrap
escribe), porque en Windows este stdout depende de haber consola del padre.
"""
from app import __version__
from app.constants import APP_ARCH, APP_PLATFORM
_attach_windows_console()
try:
sys.stdout.write(f"CloudRestoreAS {__version__} ({APP_PLATFORM}/{APP_ARCH})\n")
sys.stdout.flush()
except OSError:
pass
return 0
def _ensure_qt_platform(headless: bool = False) -> str:
"""
Selecciona el plugin de plataforma Qt en Linux. En un servidor headless (sin
@@ -175,6 +219,10 @@ def _run() -> int:
def main():
"""Punto de entrada: ejecuta _run() y hace visible cualquier fallo de arranque."""
# --version se atiende antes del bootstrap y de importar Qt/pyodbc: es una consulta
# barata que el instalador remoto usa para verificar el binario recién desplegado.
if "--version" in sys.argv[1:]:
sys.exit(_print_version())
try:
sys.exit(_run())
except SystemExit: