Commit Graph

39 Commits

Author SHA1 Message Date
3bfe491bef fix(cras-verify): validar que el servicio pueda LEER su configuración, y loguear los 401
Dos huecos de diagnóstico que hacían pasar por sano lo que no lo estaba.

1. El check `config` usaba `test -f`, que comprueba existencia y no lectura, así
   que salía verde exactamente en el caso roto: una instalación con sudo deja
   config/.env en 0600 de root mientras el unit corre como una cuenta común, que
   no puede leerlo. El agente no arranca y la pantalla decía "Configuración
   presente: ok".

   Ahora se comprueba lectura y, además, el dueño frente al User= del unit —
   porque la sonda entra con la cuenta SSH, que no siempre es la del servicio, y
   un `test -r` desde la sesión no responde por el agente. El check se renombra a
   "Configuración legible por el servicio", que es lo que de verdad mide, y falla
   nombrando a los dos usuarios para que el remedio sea obvio.

   El cálculo del bit de lectura octal sale a una función pura probada: 0600 no
   deja leer a nadie más que al dueño, se mira el bit 4 y no el valor (620 y 611
   no son lectura), se ignora el dígito de setuid, y un modo ilegible NO se
   interpreta como permisivo — asumir lectura cuando stat devuelve '-' sería el
   error caro.

   La lectura de propiedades del unit se extrae a un helper compartido con el
   instalador. Ya hubo una divergencia por copiar esta lógica: la resolución de
   elevación existía duplicada y las dos pantallas acabaron diciendo cosas
   distintas del mismo servidor.

2. Ningún rechazo de token de servicio dejaba rastro: los seis endpoints solo
   logueaban el 500 de "token no configurado". Con el token rotado, todos los
   agentes quedan mudos —dejan de reportar versión, resolver rutas y registrar
   resultados— y desde el panel se ve igual que un agente apagado; además el
   trace_id que se le devuelve al agente no existía del lado servidor, así que
   era imposible correlacionar.

   Se agrega un helper que loguea el rechazo con trace_id, ruta e instancia, y
   distingue "sin header Authorization" de "token no coincide", que son un agente
   sin configurar y un token rotado: dos problemas con remedios distintos. El
   token NUNCA se registra, ni un fragmento suyo — es el mismo valor en todos los
   agentes, así que un prefijo en los logs ya acota el espacio de búsqueda. Hay
   prueba de eso.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 07:26:34 -06:00
eda355471d feat(cras-install): actualizar sin privilegios cuando no hay root ni sudo -n
En entornos donde no se usa root, ninguna de las dos vías que había servía: la
elevación abortaba con 409 y `user-service` exige mover la instalación al home,
que en un servidor con el agente ya instalado en /opt pide un paso privilegiado
para retirar el unit viejo.

Se agrega una tercera vía para ACTUALIZACIONES: dejar el unit como está y solo
reemplazar el binario, que es lo único que una actualización necesita. Corre
`install.sh --update-in-place` sin prefijo de elevación.

Tres precondiciones, comprobadas por SSH ANTES de subir 270 MB, cada una con su
propio motivo de rechazo porque cada una tiene un remedio distinto:

- El directorio de instalación debe ser escribible por la cuenta SSH. Es el único
  permiso que hace falta: `install` desvincula el destino antes de crearlo, así
  que un binario en ejecución no es obstáculo (eso es cosa de `cp`).
- El unit debe correr con ese mismo usuario. Si quedó con User=root —alguien
  instaló desde un `sudo -i`— la cuenta no puede señalizar el proceso. Un User
  vacío se trata como root, que es lo que hace systemd.
- El unit debe tener Restart=always, que es quien vuelve a levantarlo. Sin eso,
  señalizarlo lo dejaría muerto.

Y se rechaza si hay una restauración en curso, aquí y otra vez en el destino.

Dos correcciones de robustez en la verificación posterior:

- El sello config/.version se sondea en vez de leerse una vez. En esta vía se
  omite el bootstrap y el sello lo escribe el proceso al reiniciarse, así que
  durante unos segundos sigue teniendo la versión ANTERIOR: la lectura única
  convertía una actualización correcta en "reporta 1.0.0, se esperaba 1.1.1".
- `systemctl is-active` puede devolver 'activating' justo tras el reinicio, así
  que la evidencia que manda es el proceso vivo con el binario nuevo.

El código 75 (EX_TEMPFAIL) de install.sh se traduce a un 409 con el motivo real
—"está restaurando, reintenta"— en vez del 502 genérico que hacía pensar que la
instalación se había roto.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 07:26:34 -06:00
205566e1ee fix(versiones-cras): validar que la URL sembrada sea alcanzable y permitir instalar limpio
Dos bloqueos que impedían avanzar con la instalación en Linux.

1. La validación de PANEL_PUBLIC_URL solo comparaba que coincidiera con ORIGIN,
   y eso deja pasar el peor caso: que AMBAS valgan localhost, que es justo lo
   que produce el compose de desarrollo. Ahí no avisaba nada y la instalación
   sembraba loopback en el config/.env del destino, donde localhost es el propio
   destino y el agente acabaría hablando consigo mismo.

   Ahora se valida lo que de verdad importa —que la URL sea alcanzable desde
   otra máquina— y solo después el desajuste con ORIGIN. El mensaje también
   dejaba un consejo peligroso: "comenta PANEL_PUBLIC_URL para que tome ORIGIN"
   solo vale si ORIGIN sirve para sembrar; con ORIGIN en localhost, seguirlo
   empeora las cosas. Ese consejo ahora es condicional.

   De paso se corrige el docstring, que afirmaba que un ORIGIN equivocado se
   habría manifestado por la protección CSRF de adapter-node. No es cierto:
   svelte.config.js tiene csrf.checkOrigin en false, así que el Origin de los
   POST nunca se valida y ese razonamiento llevaba a conclusiones falsas.

2. El formulario fuerza mode='update' en cuanto el servidor tiene versión
   instalada, y una actualización exige que en la ruta destino ya viva algo.
   Eso hacía imposible mover una instalación a otra carpeta —por ejemplo al
   home, para instalar sin privilegios—: abortaba con "no hay una instalación".

   Se agrega una confirmación explícita siguiendo el molde de platformAck: el
   ack lleva la RUTA confirmada y no un booleano, así que una casilla marcada
   deja de valer si después se cambia el destino, y el servidor revalida en vez
   de confiar en la UI. La casilla advierte además que el agente anterior sigue
   corriendo: los dos reportarían con el mismo instance_key y se pisarían la
   carpeta de entrada registrada, que es por donde el panel enruta los
   respaldos.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 07:26:34 -06:00
84a4c5e7e0 feature/cras-instalacion-sin-privilegios (#20)
Reviewed-on: #20
Co-authored-by: hreyes <hreyes@aduanasoft.com.mx>
Co-committed-by: hreyes <hreyes@aduanasoft.com.mx>
2026-07-30 20:30:04 +00:00
14b611c581 feature/interfaz-binarios (#19)
Some checks failed
Aduanasoft/PANEL_BASES_ANEXO24/pipeline/head There was a failure building this commit
Reviewed-on: #19
Co-authored-by: hreyes <hreyes@aduanasoft.com.mx>
Co-committed-by: hreyes <hreyes@aduanasoft.com.mx>
2026-07-30 13:52:45 +00:00
a9a1dcb9ae feat(database): leyenda de aviso SAT solo si el cliente cambio de sistema (T2026-06-111) (#18)
Some checks failed
Aduanasoft/PANEL_BASES_ANEXO24/pipeline/head There was a failure building this commit
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>
2026-07-17 14:14:32 +00:00
26eed5726c feat(alerts): enhance alert handling and client data enrichment in dashboard (#16)
Some checks failed
Aduanasoft/PANEL_BASES_ANEXO24/pipeline/head There was a failure building this commit
- 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>
2026-07-13 15:27:14 +00:00
79035002e1 feat(database): add Anexo 24C notification date handling in database operations
Some checks failed
Aduanasoft/PANEL_BASES_ANEXO24/pipeline/head There was a failure building this commit
2026-07-09 12:23:41 -05:00
7f9d502cb1 feat(env): update environment configuration and add SQL Server password handling (#15)
Some checks failed
Aduanasoft/PANEL_BASES_ANEXO24/pipeline/head There was a failure building this commit
- 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>
2026-07-06 17:00:49 +00:00
a1e7dddda0 feature/mejora-del-side-bar (#14)
Some checks failed
Aduanasoft/PANEL_BASES_ANEXO24/pipeline/head There was a failure building this commit
mejora de sidebar y correcciones en interfaces y propagacion de contrasena sql

Reviewed-on: #14
Co-authored-by: hreyes <hreyes@aduanasoft.com.mx>
Co-committed-by: hreyes <hreyes@aduanasoft.com.mx>
2026-07-02 21:00:34 +00:00
1b198953d4 feature/asignacion-masiva-restauradores (#13)
Some checks failed
Aduanasoft/PANEL_BASES_ANEXO24/pipeline/head There was a failure building this commit
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>
2026-07-02 14:57:45 +00:00
cb4324979b feat(reportes): add functionality for downloading client and user reports (#12)
Some checks failed
Aduanasoft/PANEL_BASES_ANEXO24/pipeline/head There was a failure building this commit
- 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>
2026-06-18 17:30:22 +00:00
b8e47f7654 perf(dashboard): paraleliza la carga de métricas SQL Server por nodo (#11)
Some checks failed
Aduanasoft/PANEL_BASES_ANEXO24/pipeline/head There was a failure building this commit
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>
2026-06-09 16:25:51 +00:00
632cba163a fix: muestra fallo real al ligar permisos y reconfirma persistencia (#10)
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>
2026-06-09 15:45:07 +00:00
b8be307892 feature/integracion-cloudrestore-targets (#9)
integraciones para cloud recovery

Reviewed-on: #9
Co-authored-by: hreyes <hreyes@aduanasoft.com.mx>
Co-committed-by: hreyes <hreyes@aduanasoft.com.mx>
2026-06-09 14:58:48 +00:00
3e5557c034 feature/jenkins-integration (#8)
integracion de jenkins

Reviewed-on: #8
Co-authored-by: hreyes <hreyes@aduanasoft.com.mx>
Co-committed-by: hreyes <hreyes@aduanasoft.com.mx>
2026-06-09 14:57:11 +00:00
4642086e8c Merge pull request 'feature/boton-avisos' (#7) from fix/T2026-04-023-respaldo-cliente-no-identificado into development
Reviewed-on: #7
2026-05-29 14:47:54 +00:00
9d32bc13ae feature/boton-avisos 2026-05-28 12:29:11 -06:00
ac38fd442c Update certificate and private key files; add new Bash commands to settings.local.json
- Updated the certificate and private key files with new content.
- Added additional Bash commands for OpenSSL operations to settings.local.json for enhanced functionality.
2026-05-27 16:52:37 -05:00
4785491ac7 Merge pull request 'fix/T2026-04-023-respaldo-cliente-no-identificado' (#6) from fix/T2026-04-023-respaldo-cliente-no-identificado into development
Reviewed-on: #6
2026-05-27 21:51:49 +00:00
baa826e36b fix/T2026-04-023-respaldo-cliente-no-identificado
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 15:29:45 -06:00
35b8c7a32e Merge pull request 'fix/download' (#5) from fix/download into development
Reviewed-on: #5
2026-05-07 14:10:09 +00:00
1317206b73 Refactor user and database handling in server and Svelte components
- 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.
2026-04-21 14:06:04 -05:00
50bbf7bdcc Implement streaming file download for backup route
- 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.
2026-04-15 17:54:28 -05:00
c3e50a2727 Enhance file handling in server routes
- 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.
2026-04-15 17:16:40 -05:00
7888edc64e Merge pull request 'feature/migation-postgres' (#4) from feature/migation-postgres into development
Reviewed-on: #4
2026-04-15 00:00:30 +00:00
747e82910e Enhance scroll functionality and pagination in main Svelte component
- 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.
2026-04-14 18:49:27 -05:00
0bf9c9e68d Refactor database configuration and user management
- 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.
2026-04-14 14:16:11 -05:00
97b67afb25 Ultimos cambios en el proyecto local 2026-04-07 07:36:18 -06:00
298e5ebe36 Merge pull request 'feat: add functionality to suggest next NodoSubNodo based on existing entries' (#3) from feature/sig-consecutivo into development
Reviewed-on: #3
2026-03-04 15:43:07 +00:00
d181e71c01 feat: add functionality to suggest next NodoSubNodo based on existing entries 2026-03-04 09:42:24 -06:00
4fe6058ccf Merge pull request 'feat: update user form to use numeric ClienteAutoridad and improve node selection' (#2) from refactor/users into development
Reviewed-on: #2
2026-03-04 15:33:12 +00:00
0da6e5d6f9 feat: update user form to use numeric ClienteAutoridad and improve node selection 2026-03-04 09:32:13 -06:00
8d74983f5f Merge pull request 'feat: add user management functionality with CRUD operations in database management section' (#1) from feature/generate-usuarios into development
Reviewed-on: #1
2026-03-04 14:54:05 +00:00
78cefa83ff feat: add user management functionality with CRUD operations in database management section 2026-03-04 08:50:14 -06:00
03e3793dd3 feat: Configuración completa de Docker con PostgreSQL, HTTPS y servidor de producción
- 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
2026-03-04 08:19:38 -06:00
5fa97105c9 feat: improved sidebar UI with larger icons and user info in footer
- 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
2026-02-19 12:08:56 -06:00
7e7773578d Initial project commit: Docker + SvelteKit source 2026-02-09 10:32:51 -07:00
fafb3d70fe first commit 2026-02-09 10:32:13 -07:00