11 KiB
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.jsonpara 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
QComboBoxpara 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 enregistration_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_tokenal 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:00osat,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_runspara 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
.tmpy se renombran a su nombre final solo cuando la copia deshutilse 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éricojwten lugar dePyJWTrompía el métodojwt.encode. Se forzó la reinstalación limpia depyjwten 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_shareensettings_service.pyque realiza llamadas controladas al comandonet usede 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_jobsyscript_job_runspara persistir tareas automatizadas e historiales completos. - Programador (Scheduler Daemon): El daemon
script_scheduler_daemonenmain.pycorre 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 (
monospacefont, 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
SHFileOperationWmapeada de la librería nativa de Windowsshell32.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.