La sonda que decide si el instalador del artefacto soporta -UpdateInPlace usaba
[regex]::IsMatch, que es una llamada estatica y por tanto de lo primero que
bloquea Constrained Language Mode — el mismo motivo por el que fallo antes
(Get-Command …).Parameters en ese servidor y no en desarrollo. Habria degradado a
'desconocido' en vez de responder: no rompe, pero tampoco sirve. Pasa a
Select-String, un cmdlet puro sin resolucion de tipos.
`-ErrorAction Stop` NO es opcional, y esto lo destapo probar la ruta de FALLO con
PowerShell real, no las pruebas unitarias: Select-String emite un error NO
TERMINANTE cuando no puede leer el archivo, asi que sin el, el catch no se
dispara, -Quiet devuelve falso y un fallo de lectura se reporta como 'no' —
exactamente el defecto que esta funcion existe para eliminar.
Verificado contra PowerShell real los cuatro casos: instalador nuevo -> si,
instalador del zip 1.1.2 publicado -> no, archivo inexistente -> desconocido,
fallo de lectura -> desconocido.
Se anade probeWindowsLanguageMode y se registra SIEMPRE en el paso
precondiciones, con un aviso aparte cuando no es FullLanguage. Es el dato que
faltaba para dejar de diagnosticar a ciegas: install.ps1 todavia usa cinco
construcciones .NET que en modo restringido no funcionarian, y sin verlo en la
bitacora cada fallo raro en Windows empieza con una ronda de suposiciones.
La prueba nueva prohibe cualquier `[Tipo]::` en el script de la sonda. Se ha
caido dos veces en lo mismo; que lo impida una prueba y no la memoria.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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>
El run de Windows terminaba en verde sobre un servidor que seguia con la version
anterior. La verificacion no podia detectarlo:
- El sello config\.version ausente se toleraba SIEMPRE. Los agentes anteriores a
1.1.1 no lo escribian, asi que al actualizar uno de esos `deployed` llegaba
vacio y no se comprobaba ninguna version — justo la combinacion que importa.
Ahora, en una ACTUALIZACION, un sello ausente es un fallo: el binario nuevo lo
escribe en ensure_runtime_layout(), asi que su ausencia significa que lo que
corre no es el que se instalo. La tolerancia se queda solo en instalacion nueva.
- `Get-Process -Name` responde "hay un proceso con ese nombre", no "corre el
binario que instale". Se compara la RUTA del ejecutable; si no es legible no se
concluye que sea ajeno, porque un proceso de SYSTEM no la expone sin elevacion.
- Se interroga la tarea programada a fondo: su accion dice DONDE arranca el
agente de verdad y se asienta en la bitacora (el dato que habria explicado esto
en diez segundos), y cuando el agente no reporta su ruta —nada anterior a 1.1.1
lo hace— se usa la de la tarea en vez del default.
Y dos correcciones de lo anterior:
- needsElevation exigia admin en cuanto la tarea EXISTIA, bloqueando de entrada
toda actualizacion sobre un servidor ya instalado. Ahora depende de que la
tarea corra como SYSTEM, que es lo que de verdad obliga a elevar; y el token
filtrado por UAC deja de rechazarse por adelantado: se intenta y se reporta lo
que responda el servidor.
- -UpdateInPlace se pasaba siempre, pero solo existe desde 1.1.3 y install.ps1
usa [CmdletBinding()], asi que con un artefacto anterior fallaba con
NamedParameterNotFound sin ejecutar una linea. Se le pregunta a PowerShell por
el param() del propio artefacto en vez de mantener una tabla de versiones.
Verificar comparte las dos sondas nuevas para que no pueda contradecir al
instalador, y gana un chequeo de "el arranque apunta a la instalacion".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Reviewed-on: #24
Co-authored-by: hreyes <hreyes@aduanasoft.com.mx>
Co-committed-by: hreyes <hreyes@aduanasoft.com.mx>
Nuevo parametro anexo24c_cambio_sistema por nodo, editable desde el modal
de Gestion de Bases de Datos (checkbox "Presento aviso de cambio de sistema
(Anexo 24C)"). Solo cuando esta marcado Y el cliente esta inactivo, el login
de SCAII Web muestra la leyenda del SAT; el campo de fecha se habilita solo
si el checkbox esta activo.
- controldesk-pg.ts: anexo24c_cambio_sistema en ROW_DATABASE_NODE, insert y update.
- +page.server.ts: parseo del campo en createDatabase / updateDatabase.
- +page.svelte: checkbox en el modal + fecha condicionada al checkbox.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reviewed-on: #18
Co-authored-by: Galindo97 <agalindo@aduanasoft.com.mx>
Co-committed-by: Galindo97 <agalindo@aduanasoft.com.mx>
- Updated the alert handling logic to include a 'notFound' flag for databases that are not found on the server, allowing for clearer UI representation.
- Enriched alert data with client contact information by integrating the `lookupAlertClientData` function, ensuring alerts display relevant client details.
- Improved the display of alert dates in the UI to reflect the new 'notFound' status, enhancing user experience and clarity.
This update improves the accuracy and usability of the dashboard alerts.
Reviewed-on: #16
Co-authored-by: AlexeerCT <acazares@aduanasoft.com.mx>
Co-committed-by: AlexeerCT <acazares@aduanasoft.com.mx>
- Added new environment variables for deduplication and SQL Server password encryption.
- Updated docker-compose files to include SECRET_KEY and ENCRYPTION_KEY for compatibility with a24c.
- Enhanced the navigation structure to reflect changes in admin-only views and report access.
- Introduced new functions for handling SQL Server connections and database management, including parsing server addresses and listing user databases.
This update improves security and functionality related to database management and user access control.
Reviewed-on: #15
Co-authored-by: AlexeerCT <acazares@aduanasoft.com.mx>
Co-committed-by: AlexeerCT <acazares@aduanasoft.com.mx>
integraciones de panel de respaldos fallidos, asignacion masiva de restaurador, trackeo de baks para nuevo sistema de cloudrestore
Reviewed-on: #13
Co-authored-by: hreyes <hreyes@aduanasoft.com.mx>
Co-committed-by: hreyes <hreyes@aduanasoft.com.mx>
- Introduced new functions to download Excel reports for clients and users.
- Added UI elements for administrative users to trigger report downloads.
- Implemented error handling for report generation failures.
- Enhanced the existing portal user listing with node data for better reporting.
This update improves the reporting capabilities within the application, allowing for easier access to client and user data.
Reviewed-on: #12
Co-authored-by: AlexeerCT <acazares@aduanasoft.com.mx>
Co-committed-by: AlexeerCT <acazares@aduanasoft.com.mx>
La carga inicial del dashboard (/+page.server.ts) tardaba ~30s porque
loadSqlDashboardFromNodes recorría los nodos en serie y hacía 3 round-trips
secuenciales por nodo (métricas, alerta, historial) → N×3 viajes encadenados
a SQL Server remoto.
Cambios:
- Las 3 consultas por nodo ahora corren con Promise.all.
- Los nodos se procesan con concurrencia acotada (8) vía mapWithConcurrency;
la agregación se mantiene secuencial para conservar orden y evitar carreras.
- getMssqlPoolMaster cachea la *promesa* del pool y reserva el slot de forma
síncrona antes de cualquier await, evitando pools duplicados al paralelizar.
- En +page.server.ts: métricas SQL Server y catálogo PostgreSQL se cargan en
paralelo (Promise.allSettled); las 6 consultas de catálogo en Promise.all.
- Se elimina la consulta listDatabaseNodes() duplicada (se reusa la ya cargada).
- Hidratación de alertas y filtro de permisos paralelizados.
- Se quita un console.log de depuración por fila (estándar: sin logs sueltos).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reviewed-on: #11
Co-authored-by: AlexeerCT <acazares@aduanasoft.com.mx>
Co-committed-by: AlexeerCT <acazares@aduanasoft.com.mx>
togglePermission confiaba solo en res.ok de un fetch sin use:enhance, así que
ocultaba el fail(500) del action y pintaba "Con Acceso" en falso aunque el
INSERT tronara (42P10 por falta de UNIQUE en a24c).
- togglePermission: manda x-sveltekit-action, deserializa el ActionResult,
valida type === 'success', relee del servidor y muestra error si falla
- GET de permisos: cache-control no-store para evitar lecturas viejas
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reviewed-on: #10
Co-authored-by: AlexeerCT <acazares@aduanasoft.com.mx>
Co-committed-by: AlexeerCT <acazares@aduanasoft.com.mx>
- Updated the certificate and private key files with new content.
- Added additional Bash commands for OpenSSL operations to settings.local.json for enhanced functionality.
- Introduced a default database server address for improved user experience when creating database entries.
- Added a function to handle unique user violation messages for better error reporting.
- Updated form validation to require fewer fields, streamlining user input.
- Enhanced error handling in fetch requests to provide clearer feedback on server responses.
- Refactored database-related form handling to ensure consistent use of the default server address.
- Enhanced the backup server route to support streaming of large backup files using Node.js streams.
- Improved error handling for file access and added appropriate HTTP responses for missing parameters and inaccessible files.
- Updated response headers to include content length and type for better client handling.
- Added checks to ensure only regular files are processed in both the main and backup server routes.
- Improved error handling for invalid file parameters and inaccessible backup files, returning appropriate HTTP responses.
- Introduced fixed viewport height for tables to improve scrolling behavior.
- Added new state variables for managing visible rows in various tables.
- Implemented functions to dynamically fill scrollable areas until overflow.
- Updated effects to adjust visible rows based on active view, enhancing user experience.
- Refactored pagination logic to utilize visible row count instead of page numbers.
- Updated .env.example to consolidate SQL Server credentials under PANEL_MSSQL_* variables.
- Removed deprecated docker-compose.postgres.yml file.
- Adjusted docker-compose.yml to utilize new SQL Server credential structure.
- Enhanced README.md with Docker build and push instructions.
- Refined database schema in schema.sql to align with new user and permission structures.
- Updated init-database.js to reflect changes in user and session table names.
- Modified user management functions in users.ts to accommodate new database schema.
- Streamlined API routes to utilize PostgreSQL for user and database management.
- Improved error handling and logging in various server routes.
- Agregada configuración de servidor HTTPS con Express (server.js)
- Integración de PostgreSQL en docker-compose.yml con servicio dedicado
- Actualizado Dockerfile para optimizar build en Alpine Linux
- Configurado vite.config.ts con soporte HTTPS para desarrollo
- Agregados certificados SSL para HTTPS
- Actualizado svelte.config.js con configuración CSRF
- Ajustadas métricas de restauración en +page.server.ts para usar last_restore_date
- Agregado script npm start en package.json
- Instalado express como dependencia de producción
- Increased all sidebar navigation icons from text-sm to text-xl for better visibility
- Moved user information and logout button from header to sidebar footer
- Added user avatar with name and email in expanded sidebar state
- Collapsed sidebar shows avatar icon and logout icon button stacked vertically
- Simplified header by removing user badge and logout button
- Added version info (v1.0.0) in sidebar footer
- Improved responsive design for both collapsed and expanded states