La PR #25 aplasto esta rama hasta c7f5bf5 en 7613842, con otro hash, asi que git
vio dos historias para el mismo contenido y marco conflicto en cras-install.ts y
cras-install.test.ts.
Comprobado antes de resolver: la version de development de los cinco archivos que
toco la PR es IDENTICA byte a byte a la de c7f5bf5, o sea que se mezclo sin
cambios de revision. Esta rama tiene encima 67c6bab, que anade el rechazo de
artefactos anteriores a los arreglos, asi que resolver a su favor no pierde nada.
Verificado despues del merge: 350 pruebas, typecheck limpio, y siguen presentes
checkWindowsArtifactUpdateSupport, la lectura del crash log en el perfil de SYSTEM
y el registro del cambio de cuenta de la tarea.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
El 1.1.3 publicado en Gitea se construyo antes de los arreglos, y el panel lo
desplego igual. Ese instalador detiene la tarea y mata los procesos, corre el
bootstrap acotado a 20s —insuficiente para desempacar un onefile de ~250 MB con
el antivirus escaneando, asi que muere antes de escribir config\.version—,
re-registra la tarea como SYSTEM y la arranca sin comprobar que volviera. Y el
binario del mismo paquete lleva el runner.py que ignora --headless en Windows,
asi que como SYSTEM en la sesion 0 Qt no puede crear su plataforma y el agente
muere. El servidor se quedo sin agente viejo y sin agente nuevo.
La sonda que lo detecta ya existia, pero solo lo asentaba como paso informativo y
seguia adelante — y seguir adelante es lo que rompe el servidor. Ahora
checkWindowsArtifactUpdateSupport lanza 409 al ACTUALIZAR, nombrando la version y
la consecuencia; en instalacion limpia solo avisa, porque ahi no hay agente que
perder. Es una funcion aparte y no una comprobacion enterrada en installWindows:
es una politica con consecuencias, merece nombre y prueba propia.
Ademas, dos cosas para que el proximo fallo se explique solo:
- El crash log se busca en las CINCO ubicaciones posibles, no solo junto al
ejecutable. runner.py tiene tres candidatos y los dos ultimos, para un proceso
que corre como SYSTEM, caen bajo C:\Windows\System32\config\systemprofile —
precisamente donde estaba la evidencia de este fallo, y por eso el error salio
sin crash log. El mensaje dice ademas de cual se leyo.
- Se sondea la cuenta de la tarea despues de instalar y se asienta el cambio. El
salto Administrator -> SYSTEM es lo que rompio este servidor y ocurria en
silencio.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La PR #24 aplasto el commit 9a4124d de esta rama en a895044, con otro hash, asi
que git vio dos historias para el mismo contenido y marco conflicto en
cras-install.ts, cras-verify.ts y cras-install.test.ts.
Comprobado antes de resolver: la version de development de los tres archivos es
IDENTICA byte a byte a la de 9a4124d, o sea que la PR se mezclo sin cambios de
revision. Los dos commits posteriores de esta rama (3572aa9 y 9b05361) son
refinamientos encima de ese mismo contenido, asi que resolver a favor de esta
rama no pierde nada.
Verificado despues del merge: 346 pruebas, typecheck limpio, y siguen presentes
alignWindowsTask, restartWindowsAgent, readWindowsCrashLog y la comparacion de
rutas compartida entre el instalador y Verificar.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La pregunta "son la misma ruta?" estaba resuelta tres veces con tres criterios:
normalizeWindowsPath recortaba comillas multiples, probeWindowsAgentProcess una
sola, y cras-verify ninguna. Coincidian en los casos reales, pero este modulo ya
lleva escrito lo que cuesta esa duplicacion — probeLinuxElevation e inspectLinux
tuvieron copias paralelas y las dos pantallas acabaron diciendo cosas distintas
del mismo servidor. Ahora es sameWindowsPath() + windowsAgentExe(), usadas en los
tres sitios.
Lo que NO se hace, y queda documentado en el codigo: comparar por prefijo.
C:\Aduanasoft\CloudRestoreAS es prefijo de cadena de
C:\Aduanasoft\CloudRestoreAS-win, y esa combinacion existe en produccion.
Pruebas del par peligroso en las dos direcciones. Comprobado que MUERDEN:
sustituyendo la igualdad por startsWith, falla la comparacion a nivel de carpeta.
Las de rutas completas de .exe no fallan, y eso tambien es informacion — son
estructuralmente inmunes porque el caracter que difiere llega antes del final, asi
que el riesgo vive solo en la comparacion de directorios.
Y el formulario dice a que carpeta va a instalar. Antes la ruta solo aparecia
dentro del aviso de "instalar limpio", que se pinta unicamente si el panel ya
conoce la version instalada: en un servidor con ruta personalizada y version
desconocida el operador no la veia hasta que el run fallaba. Se distingue "ruta
registrada" de "por omision" — no si la capturo el agente o una persona, porque
ambas viven en la misma columna y el panel no puede saberlo.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La actualizacion ya fallaba ruidosamente en vez de mentir, pero el arreglo no
podia llegar al servidor: el install.ps1 que se ejecuta viaja DENTRO del zip, y
el artefacto 1.1.3 se construyo antes de que el instalador aprendiera a
realinear la tarea. Verificado sobre el zip: trae -UpdateInPlace y cero
Sync-AgentTaskPath. Un instalador ya publicado no se arregla hacia atras.
- alignWindowsTask realinea la accion de la tarea por SSH tras instalar el
binario, conservando disparador, principal, ajustes y argumentos, y asienta la
ruta ANTERIOR y la nueva para que el cambio sea reversible si la ruta declarada
estuviera mal. Si no se puede corregir, aborta con 409 nombrando ambas: seguir
significaria arrancar a sabiendas el binario viejo. Funciona con cualquier
artefacto ya distribuido.
- restartWindowsAgent rearranca y espera a que corra el binario del prefijo, no
cualquier proceso con ese nombre. Vive en cras-install y no en
cras-agent-control porque este es el modulo de abajo; al reves habria un ciclo.
Y el diagnostico deja de ser una tarea para el operador. El error de sello
ausente decia "revisa a que binario apunta el arranque automatico" cuando el
panel YA lo sabe, y la bitacora del run donde si estaba no la encontraba nadie
("no se donde verlo"). Ahora se sondea tarea y proceso ANTES de evaluar el sello
y el mensaje nombra a que apunta la tarea, desde donde corre el proceso, y la
cola de CloudRestoreAS-crash.log — que runner.py escribe precisamente para esto
y que nunca se leia. El banner de error apunta al run por numero.
startOnWindows deja de esperar por nombre y usa la misma sonda de ruta, para que
Verificar no pueda contradecir al instalador.
PowerShell generado validado con PowerShell real: los seis scripts parsean, y el
de realineacion ejercitado contra una tarea simulada reapunta la accion Exec,
conserva los argumentos y respeta las acciones que no son Exec.
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>
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>
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