El panel rechazaba actualizar con 1.1.4 diciendo que su install.ps1 no declara
-UpdateInPlace. Era falso: el zip trae UpdateInPlace 8 veces y Sync-AgentTaskPath
3. El bloqueo lo causaba la sonda.
const supportsInPlace = supportsProbe.stdout.trim() === 'si';
Cualquier fallo —una excepcion, un codigo de salida distinto de cero, stdout
vacio— colapsaba a false. Mientras eso solo elegia entre -UpdateInPlace y
-Service, un falso negativo degradaba la instalacion; al convertirlo en un 409
duro paso a ser un candado permanente sobre un artefacto correcto.
Por que fallaba en ese servidor y no en la maquina donde se probo no se sabe con
certeza. El candidato mas probable es Constrained Language Mode (AppLocker/WDAC
son habituales en servidores endurecidos): restringe el acceso a propiedades de
objetos .NET como .Parameters mientras `& install.ps1` sigue funcionando, que es
justo lo que se observaba. Pero el arreglo no es adivinarlo:
- probeInstallerUpdateSupport lee el TEXTO del script y busca la declaracion
`[switch]$UpdateInPlace` con [regex]::IsMatch. No compila nada, no toca
reflexion y ninguna politica lo bloquea. Anclado a la declaracion y no a una
mencion suelta, para que un comentario no de un falso positivo.
- Tres estados en vez de dos. Solo un "no" CONFIRMADO bloquea; "desconocido"
sigue adelante con el comportamiento anterior y deja asentado POR QUE no se
pudo determinar. Un fallo de diagnostico no puede impedir el trabajo.
- El estado se decide tambien con el codigo de salida y stderr, no solo con
stdout: un execRemote que falla deja stdout vacio y eso se leia como respuesta.
Auditado el mismo patron en las otras sondas de Windows, porque dos gobiernan
fallos duros: probeWindowsAgentProcess (502 "no esta corriendo"),
probeWindowsElevation (409 por privilegios) y probeWindowsTask leian "el comando
no respondio" como "la respuesta es no". Ahora todas distinguen los dos casos.
Verificado con PowerShell real, y esta vez tambien las rutas de FALLO —que es lo
que falto la vez pasada y por lo que esto llego a produccion—: instalador nuevo
-> si, instalador del zip 1.1.2 publicado -> no, archivo inexistente ->
desconocido, y fallo de lectura -> desconocido.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Panel de Gestión de Bases de Datos (SvelteKit Migration)
Este proyecto es una migración moderna del panel de control legacy TransmitirAS, reconstruido utilizando SvelteKit 2.0 y Svelte 5 (Runes).
Características
- Tech Stack: SvelteKit, TypeScript, Node.js (MSSQL), Bootstrap 5.
- Server-Side Rendering (SSR): Todos los datos se cargan en el servidor para una carga inicial rápida y SEO/Performance óptimo.
- Base de Datos: Conexión a múltiples instancias SQL Server (Local, Remota, Azure).
- Diseño: Interfaz "Glassmorphism" portada fielmente del original.
Requisitos Previos
- Node.js: v18 o superior.
- SQL Server: Acceso a las instancias de base de datos definidas en
.env.
docker build \
-t dev.aduanasoft.com:8443/databases_a24c/frontend:latest \
-f ./Dockerfile \
./
Subirlas a harbor
docker login dev.aduanasoft.com:8443
docker push dev.aduanasoft.com:8443/databases_a24c/frontend:latest
Configuración
-
Instalar dependencias:
npm install -
Variables de Entorno: El archivo
.envya ha sido configurado con las credenciales migradas. Asegúrese de que la máquina donde se ejecuta esto tenga acceso de red a las IPs:- 192.168.1.200 (Primaria)
- 104.192.7.202 (Secundaria)
- aduanasoft.database.windows.net (Azure)
-
Ejecutar en Desarrollo:
npm run devAbrir http://localhost:5173 en el navegador.
-
Construir para Producción:
npm run build npm run preview
Estructura del Proyecto
src/lib/server/db.ts: Lógica de conexión a base de datos (Pools).src/routes/+page.server.ts: Controlador principal. Realiza todas las consultas SQL y lectura de archivos antes de renderizar.src/routes/+page.svelte: Vista principal. Gestiona la navegación por pestañas y tablas.src/lib/components/: Componentes reutilizables (Navbar,Sidebar).src/app.css: Estilos globales y tema Glass.
Integración CloudRestoreAS
- Endpoints servicio-a-servicio bajo
/api/restore/(tokenCLOUDRESTORE_API_TOKENen.env). - Servidores de Restauración (
/servidores-restauracion): admin de Alfa/Omega/Gamma y carpeta de entrada reportada por CloudRestoreAS (solo lectura). - Contrato y prueba local: ver
INTEGRACION_PANEL.mden el repo CloudRecoveryAS (mismo token enCLOUDRESTORE_API_TOKENy en la config PANEL de CloudRestoreAS).
Versiones CRAS (/versiones-cras) — instalación y actualización remota
Distribución de los binarios del agente. Los artefactos se publican en el registro de
paquetes genéricos de Gitea desde el build local del repo CloudRecoveryAS
(build-all.sh --publish); el panel los descubre leyendo esa API y los despliega por SSH.
build local (WSL) → Gitea: ADUANASOFT/generic/cloudrestoreas/<version>
↓ (el panel lee la API y guarda metadatos + sha256)
a24c.cras_releases → caché en CRAS_RELEASES_DIR
↓ (SFTP + exec)
servidor de restauración
Flujo de operación:
- Sincronizar con Gitea — registra las versiones publicadas en
a24c.cras_releases. Nunca activa nada por su cuenta: publicar no debe equivaler a desplegar. - Activar — marca la versión que se instalará, una por plataforma+arquitectura (índice único parcial en la BD, para que Windows y Linux tengan cada una la suya).
- Precargar (opcional) — descarga y verifica el artefacto antes de instalar, para separar el tiempo de descarga del de instalación.
- Instalar / Actualizar por servidor — sube el paquete por SFTP, verifica el sha256 en
el destino, corre el instalador que viene dentro del paquete y siembra
config/.envcon la URL, el token y la instancia: el servidor queda operativo sin configuración manual.
Detalles que importan:
- Los binarios no se guardan en Postgres (pesan ~270 MB); la BD solo tiene metadatos.
- El servidor destino no descarga nada de internet: el binario es autocontenido.
- El token del panel viaja al destino en un archivo
0600por SFTP, nunca como argumento de un comando (sería visible enpsy en el historial del servidor). - Se exige root o
sudo -nen Linux (y cuenta administradora en Windows), validado antes de transferir el artefacto. No se le pasa la contraseña asudo. - El progreso se persiste paso a paso en
a24c.cras_install_runs.steps; la UI lo consulta por polling en/versiones-cras/install-runs. - No hay subida de archivos por el navegador a propósito: la fuente de verdad es Gitea.
Variables nuevas en .env: GITEA_BASE_URL, GITEA_OWNER, GITEA_TOKEN
(scope read:package), CRAS_PACKAGE_NAME, CRAS_RELEASES_DIR,
CRAS_CACHE_KEEP_VERSIONS, PANEL_PUBLIC_URL. Ver .env.example.
Esquema: migración e2f3a4b5c6d7 en el repo a24c (autoritativa), replicada en
database/schema.sql y en el fallback ensureCrasSchema() de cras-releases.ts.
Notas de Migración
- DataTables: Se inicializan en el cliente dentro de
onMountpara mantener la compatibilidad con las tablas interactivas originales. - Sistema de Archivos: La lectura de backups busca en
BACKUP_PATHen el servidor donde corre Node.js (independiente de la carpeta que vigila CloudRestoreAS).