112 lines
11 KiB
Markdown
112 lines
11 KiB
Markdown
# Changelog: Novedades y Mejoras de la Sesión
|
|
|
|
Este documento detalla todos los cambios y nuevas características de sincronización y administración implementadas en esta sesión de desarrollo para **OnEver Drive**.
|
|
|
|
---
|
|
|
|
## 🔄 1. Sincronización Bidireccional de Trabajos (Jobs)
|
|
|
|
Se ha implementado una sincronización bidireccional en tiempo real entre el **Panel de Control Web** y los clientes de Windows:
|
|
- **Local ➔ Servidor**: Cuando el usuario añade una carpeta local en la app PyQt6 del agente, esta se registra automáticamente en el servidor (a través del endpoint `POST /api/jobs/agent/register`) y obtiene un ID de base de datos (`JOB-XXX`).
|
|
- **Servidor ➔ Local**: Si un administrador añade un trabajo en el panel web, el Agente descarga la configuración y la agrega a su archivo `config.json` para iniciar su monitoreo.
|
|
- **Edición Remota**: Si se cambian filtros, rutas o nombres en el panel web, el Agente sobrescribe sus propiedades locales en el siguiente ciclo de escaneo (10 segundos).
|
|
- **Eliminación Sincronizada**: Al presionar **Eliminar Carpeta** en el Agente de Windows, se realiza una llamada `DELETE /api/jobs/agent/{id}` que destruye el trabajo tanto localmente como en el servidor. Si el trabajo se elimina en la web, el agente lo borra de su lista local.
|
|
|
|
---
|
|
|
|
## 📅 2. Planificación tipo Proxmox Backup Server (PBS)
|
|
|
|
Se ha sustituido la frecuencia numérica en minutos por una planificación basada en cadenas de texto estándar (`hourly`, `daily`, `weekly`, `monthly`):
|
|
- **Menú de Planificación**: La interfaz del cliente PyQt6 cuenta ahora con un `QComboBox` para elegir entre estas cuatro periodicidades.
|
|
- **Lógica de Ejecución (`is_job_due`)**: El servicio del agente (`agent/service.py`) compara la fecha del último backup exitoso guardada en la base de datos contra el tiempo transcurrido de la regla seleccionada:
|
|
- `hourly`: Mínimo 1 hora.
|
|
- `daily`: Mínimo 24 horas.
|
|
- `weekly`: Mínimo 7 días.
|
|
- `monthly`: Mínimo 30 días.
|
|
- **Sincronización Manual**: Al presionar *"▶ Iniciar Sincronización Manual Ahora"*, el Agente corre inmediatamente los respaldos ignorando el bloqueo de tiempo de las planificaciones.
|
|
|
|
---
|
|
|
|
## 🔑 3. Re-vinculación de Agente y Regeneración de Token
|
|
|
|
Anteriormente, si un cliente perdía su archivo de configuración `config.json` (por formateo o reinstalación), el administrador debía eliminar el cliente en la web y crearlo de nuevo (perdiendo su historial de backups).
|
|
- **Código de Re-vinculación**: Se añadió la columna `client_id` (migración de base de datos en `registration_codes`) para asociar códigos de registro temporales a un cliente existente.
|
|
- **Nueva Acción "Re-vincular"**: Se agregó la opción en la tabla de clientes del frontend web. Al hacer clic, genera un código temporal de 24 horas y muestra el comando PowerShell/CLI de vinculación.
|
|
- **Actualización de Credenciales**: Al usar el código de re-vinculación en el agente, el backend asocia el nuevo par `device_id` / `device_token` al cliente correspondiente sin alterar su identificador (`CLIENT-XXXX`) ni su almacenamiento histórico.
|
|
|
|
---
|
|
|
|
## 🐞 4. Corrección de Bugs Críticos
|
|
|
|
- **TypeError en el Tray Icon**: Se resolvió un error de casteo en PyQt6 (`TypeError: unable to convert a C++ 'QSystemTrayIcon::ActivationReason'`) al reabrir el panel del agente desde el área de notificaciones de Windows.
|
|
- **Colisiones en Cliente ID**: Se corrigió el algoritmo de generación del código de cliente (`CLIENT-XXXX`). En lugar de usar un recuento dinámico de la tabla (que colisionaba si se borraban clientes intermedios), ahora se calcula usando el ID máximo de la base de datos más uno (`max(id) + 1`).
|
|
- **Historial en Caliente**: Ahora el backend actualiza de forma automática el estado (`SUCCESS` / `FAILED`) y la fecha (`last_run_at`) de los trabajos en la base de datos al finalizar exitosamente la subida de todos sus bloques.
|
|
|
|
---
|
|
|
|
## 📅 5. Planificación Calendarizada Avanzada (Cron y Calendario Proxmox) — Fase 3
|
|
|
|
Se ha ampliado el evaluador de tiempos de ejecución (`is_job_due` en el Agente de Windows) para soportar planificaciones complejas:
|
|
- **Expresiones Cron**: Admite la sintaxis estándar de 5 campos (minuto, hora, día de mes, mes, día de semana) para disparos programados de forma precisa (ej. `0 2 * * *`).
|
|
- **Cadenas de Calendario de Proxmox (PBS)**: Permite programar rangos específicos de días y horas (ej. `mon..fri 22:00` o `sat,sun 18:00`).
|
|
- **Simulación Histórica**: El agente evalúa si ocurrió algún disparo agendado en el intervalo comprendido entre la última ejecución registrada y la hora actual del sistema, eliminando riesgos de omisión.
|
|
|
|
---
|
|
|
|
## 📊 6. Historial de Ejecuciones, Métricas y Telemetría (Job Runs) — Fase 4
|
|
|
|
Se ha estructurado un motor de auditoría centralizado para las corridas de backup:
|
|
- **Base de Datos**: Creación de la tabla `job_runs` para registrar marcas temporales y métricas de cada corrida (archivos escaneados, copiados, omitidos, cantidad de errores, bytes transferidos y resumen de errores).
|
|
- **Notificaciones del Agente**: El daemon notifica el inicio de la corrida (`POST /api/jobs/{id}/runs/start`) obteniendo un identificador de corrida, y reporta su estado y métricas al culminar (`POST /api/jobs/{id}/runs/{run_id}/complete`).
|
|
- **Panel Web**: Incorporación de un botón interactivo de historial (icono de reloj) que despliega un modal detallando las corridas previas, duración y su rendimiento de transferencia.
|
|
|
|
---
|
|
|
|
## 📁 7. Copia Local Duplicada y Copia Robusta — Fase 5 (Fusión con Karen's Replicator)
|
|
|
|
Implementación del almacenamiento redundante local o de red:
|
|
- **Destino Adicional**: Permite configurar una ruta física local o recurso de red UNC (`\\Servidor\Recurso`) para duplicar el backup en caliente.
|
|
- **Réplica Exacta**: Si se activa la eliminación de huérfanos, el agente remueve archivos y subcarpetas vacías del destino local si estos ya no existen en el origen.
|
|
- **Copia Robusta (Estilo Karen's Replicator v3.5.0)**: Para evitar corromper archivos locales ante caídas del sistema o cortes de energía, los archivos se escriben primero con una extensión temporal `.tmp` y se renombran a su nombre final solo cuando la copia de `shutil` se completa exitosamente.
|
|
- **Interfaz PyQt**: Agregado el campo de "Copia Local Adicional" con un explorador nativo de directorios de Windows para facilitar la configuración del cliente.
|
|
|
|
---
|
|
|
|
## 🛠️ 8. Corrección de Autenticación y Dependencias
|
|
|
|
- **Corrupción de Módulo `jwt`**: Se resolvió una colisión de dependencias en Python donde instalar el paquete genérico `jwt` en lugar de `PyJWT` rompía el método `jwt.encode`. Se forzó la reinstalación limpia de `pyjwt` en el entorno virtual.
|
|
- **Reset de Admin por Defecto**: Añadida lógica de restablecimiento forzado de contraseña en el inicio del backend (`main.py`) para asegurar que el usuario administrador (`admin@oneverdrive.local`) y su contraseña (`Admin1234!`) se impongan y validen automáticamente en entornos de desarrollo/pruebas.
|
|
|
|
---
|
|
|
|
## 📂 9. Explorador Local del Servidor y Conectores de Red UNC (NAS)
|
|
|
|
Se han añadido controles y APIs de red para flexibilizar la ubicación del almacenamiento centralizado:
|
|
- **Explorador Interactivo**: En la configuración global del panel web, se añadió el botón **Explorar** al almacenamiento local. Permite navegar interactivamente por las carpetas del servidor y seleccionar el directorio ideal sin escribirlo manualmente. En Windows, expone al inicio las letras de unidad disponibles (`C:\`, `D:\`, etc.).
|
|
- **Montaje UNC en Caliente**: Implementación de `connect_network_share` en [`settings_service.py`](file:///c:/Workspace/onever_drive/backend/app/services/settings_service.py) que realiza llamadas controladas al comando `net use` de Windows con credenciales de red. El backend valida el recurso y monta la unidad de almacenamiento central antes de guardar la configuración de destino.
|
|
- **Botón "Probar Conexión"**: Permite testear en caliente permisos de lectura y escritura en la unidad compartida.
|
|
|
|
---
|
|
|
|
## ⚡ 10. Motor Programable de Scripts del Servidor (Automatización Externa)
|
|
|
|
Se ha creado un motor asíncrono y planificador en el servidor para disparar backups en plataformas web externas:
|
|
- **Base de Datos y Modelos**: Creación de las tablas `script_jobs` y `script_job_runs` para persistir tareas automatizadas e historiales completos.
|
|
- **Programador (Scheduler Daemon)**: El daemon `script_scheduler_daemon` en `main.py` corre minuto a minuto. Valida las expresiones cron de tareas activas de manera asíncrona mediante un pool de hilos (`run_in_executor`) para evitar bloqueos del loop principal de FastAPI.
|
|
- **Plantillas Pre-configuradas**: Sembrado de tareas listas para producción destinadas a:
|
|
- **FortiGate**: Copias de seguridad a través de la API REST de configuración de FortiOS.
|
|
- **UniFi Controller**: Descargas automatizadas usando cookies de autenticación de red.
|
|
- **Grandstream UCM/GWN**: Script completo en Python para automatizar el volcado del sistema.
|
|
- **Terminal Oscura e Historial**: Nueva pestaña en la web con capacidad de ejecutar scripts manualmente y abrir una modal del historial con terminal oscura (`monospace` font, terminal negra) para auditar la salida estándar (`stdout`/`stderr`) de los intérpretes Python/Bash con codificación UTF-8 robusta.
|
|
|
|
---
|
|
|
|
## 🤖 11. Paridad de Características de Karen's Replicator en el Agente de Windows
|
|
|
|
Hemos añadido paridad absoluta en el cliente nativo de Windows (PyQt6) con respecto a la interfaz original de Karen's Replicator, implementando tres características clave:
|
|
- **Tags de Carpeta Destino (Destination Folder Tags)**: El motor resuelve expresiones de fecha en la ruta local (ej. `D:\Backup\<yyyy>-<mm>-<dd>`) reemplazando etiquetas en tiempo real al ejecutar el backup. La GUI del agente PyQt6 incorpora un botón interactivo **Tags...** que despliega un menú flotante con las variables utilizables.
|
|
- **Papelera de Reciclaje (Move to Recycle Bin)**: Implementación de la API ctypes `SHFileOperationW` mapeada de la librería nativa de Windows `shell32.dll`. Al replicar eliminaciones locales, los archivos huérfanos se mueven de forma segura a la Papelera de Reciclaje permitiendo su restauración manual, con fallback transparente a la remoción física permanente si el sistema no es compatible.
|
|
- **Exclusiones Globales del Sistema (Global Exclusions)**: Inclusión automática en el escáner del agente de exclusiones de archivos del sistema bloqueados (`pagefile.sys`, `hiberfil.sys`, `Thumbs.db`, `Desktop.ini`, `*.tmp`) y carpetas temporales o de papelera (`Temp`, `Recycler`, `$Recycle.Bin`). El agente PyQt incluye una casilla en la sección de configuraciones para activar/desactivar el filtrado global de forma persistente.
|
|
|
|
|