# AutoBackups - Especificación Técnica Detallada ## Resumen Ejecutivo AutoBackups es una aplicación Python que automatiza el backup de proyectos Simatic S7 y directorios definidos por el usuario, utilizando la API de Everything para búsqueda eficiente de archivos y un sistema de hash inteligente para evitar backups innecesarios. ## Arquitectura del Sistema ### 1. Componentes Principales #### 1.1 Motor de Búsqueda (Everything API) - **Librería**: PyEverything wrapper - **DLL Local**: `Everything-SDK\dll\Everything64.dll` - **Función**: Localizar archivos *.s7p en directorios de observación - **Optimización**: Evitar último nivel del árbol para archivos .s7p - **Ventaja**: Aprovecha el índice existente de Everything para búsquedas instantáneas #### 1.2 Sistema de Hash en Dos Etapas **Etapa 1**: Hash rápido de archivos *.s7p - Solo verifica MD5 de (timestamp + tamaño) de archivos .s7p - Si no hay cambios → no se procede con backup - Si hay cambios → procede a Etapa 2 **Etapa 2**: Hash completo del proyecto - Calcula MD5 de (timestamp + tamaño) de todos los archivos del directorio - Compara con último hash almacenado - Solo hace backup si hay diferencias #### 1.3 Scheduler de Background - **daily**: Una vez al día a hora configurada - **hourly**: Cada hora - **3-hour**: Cada 3 horas - **7-hour**: Cada 7 horas - **startup**: Al iniciar la aplicación - **manual**: Solo bajo demanda del usuario - **Escaneos**: Automáticos cada 1 hora - **Backups**: Mínimo cada 10 minutos - **Prioridad**: Baja prioridad de sistema ### 2. Estructura de Datos #### 2.1 config.json (Configuración Global) ```json { "observation_directories": [ { "path": "C:\\Projects\\Siemens", "type": "siemens_s7", "enabled": true }, { "path": "D:\\Engineering\\Projects", "type": "siemens_s7", "enabled": true }, { "path": "C:\\Important\\Docs", "type": "manual", "enabled": true } ], "backup_destination": "D:\\Backups\\AutoBackups", "default_schedule": "daily", "default_schedule_time": "02:00", "retry_delay_hours": 1, "web_interface": { "host": "127.0.0.1", "port": 5000 }, "logging": { "level": "INFO", "max_log_files": 30 } } ``` #### 2.2 projects.json (Estado de Proyectos) ```json { "projects": [ { "id": "project_001", "name": "PLC_MainLine", "path": "C:\\Projects\\Siemens\\PLC_MainLine", "type": "siemens_s7", "s7p_file": "C:\\Projects\\Siemens\\PLC_MainLine\\PLC_MainLine.s7p", "schedule": "daily", "schedule_time": "02:00", "enabled": true, "last_backup": "2025-09-01T02:15:30", "last_s7p_hash": "abc123def456", "last_full_hash": "def789ghi012", "last_s7p_timestamp": "2025-08-31T14:30:00", "status": "ready", "retry_count": 0, "next_retry": null, "error_message": null } ] } ``` ### 3. Flujo de Operación #### 3.1 Inicio de Aplicación 1. Cargar configuración desde `config.json` 2. Cargar estado de proyectos desde `projects.json` 3. Inicializar logger con timestamp de inicio 4. Escanear directorios de observación usando Everything API 5. Actualizar lista de proyectos detectados 6. Iniciar scheduler 7. Iniciar interfaz web Flask #### 4.2 Proceso de Backup 1. **Verificación de Espacio**: Verificar mínimo 100MB libres 2. **Verificación de Acceso .s7p**: Intentar comprimir solo archivo .s7p 3. **Hash Etapa 1**: Verificar MD5 de (timestamp + tamaño) del archivo .s7p 4. **Hash Etapa 2**: Si Etapa 1 detecta cambios, verificar hash completo 5. **Compresión**: Crear archivo ZIP con estructura específica preservada 6. **Almacenamiento**: Guardar en `backup_destination/ProjectPath/YYYY-MM-DD/HH-MM-SS_projects.zip` 7. **Actualización**: Actualizar hashes y timestamps en `projects.json` #### 3.3 Gestión de Errores - **Archivos en uso**: Marcar proyecto para reintento en 1 hora - **Errores de permisos**: Log de error y notificación en interfaz - **Errores de espacio**: Verificar espacio disponible antes de backup ### 4. Interfaz Web #### 4.1 Dashboard Principal - **Lista de Proyectos**: Tabla con estado, último backup, próximo backup - **Controles Globales**: Backup manual global, pausar/reanudar scheduler - **Estadísticas**: Total de proyectos, backups exitosos, errores #### 4.2 Configuración de Proyectos - **Habilitación/Deshabilitación**: Toggle por proyecto - **Configuración de Schedule**: Dropdown con opciones de frecuencia - **Backup Manual**: Botón de backup inmediato por proyecto #### 4.3 Logs y Monitoreo - **Log Viewer**: Mostrar logs recientes con filtros por nivel - **Estado del Sistema**: Información de Everything API, espacio en disco ### 5. Estructura de Backup #### 5.1 Nomenclatura de Archivos (Estructura Específica) ``` backup_destination/ ├── LineA/ │ └── Project1/ │ ├── 2025-09-01/ │ │ ├── 02-15-30_projects.zip │ │ └── 14-30-15_projects.zip │ └── 2025-09-02/ │ └── 02-15-45_projects.zip └── LineB/ └── Project2/ └── 2025-09-01/ └── 08-20-10_projects.zip ``` #### 5.2 Contenido del ZIP ``` 02-15-30_projects.zip └── LineA/ └── Project1/ ├── project.s7p ├── subfolder1/ └── subfolder2/ ``` ### 6. Tecnologías y Librerías #### 6.1 Python Core - **Python**: 3.12 - **Framework Web**: Flask - **Scheduler**: APScheduler - **Compresión**: zipfile (biblioteca estándar) #### 6.2 Librerías Específicas - **Everything API**: PyEverything wrapper con DLL local - **Hashing**: hashlib MD5 para (timestamp + tamaño) - **Config**: json (biblioteca estándar) - **Logging**: logging (biblioteca estándar) - **File Access Check**: Intento de compresión + verificación .s7p - **Process Priority**: pywin32 para baja prioridad - **Disk Space**: psutil para monitoreo de espacio libre #### 6.3 Frontend - **HTML/CSS/JavaScript**: Vanilla (sin React por simplicidad) - **AJAX**: Para comunicación con Flask API - **Bootstrap**: Para estilizado responsivo ### 7. Consideraciones de Seguridad #### 7.1 Acceso a Archivos - Verificación de permisos antes de backup - Manejo seguro de rutas para evitar path traversal - Logs de todos los accesos a archivos #### 7.2 Interfaz Web - Solo acceso local (127.0.0.1) - No autenticación requerida (uso local únicamente) - Validación de inputs en formularios ### 8. Logging y Monitoreo #### 8.1 Estructura de Logs ``` .logs/ ├── autobackups_2025-09-01_08-30-15.log ├── autobackups_2025-09-02_08-30-22.log └── ... ``` #### 8.2 Niveles de Log - **INFO**: Inicio/fin de backups, descubrimiento de proyectos - **WARNING**: Archivos en uso, reintentos - **ERROR**: Fallos de backup, errores de configuración - **DEBUG**: Detalles de hashes, operaciones de archivos ### 9. Instalación y Despliegue #### 9.1 Entorno Miniconda ```bash conda create --name autobackups python=3.12 conda activate autobackups pip install -r requirements.txt ``` #### 9.2 Ejecución - **Desarrollo**: `python src/app.py` - **Producción**: `pythonw.exe src/app.py` (sin consola) - **Como servicio**: Futuro enhancement con `python-windows-service` ### 10. Roadmap de Desarrollo #### Fase 1: Core Backend - [ ] Integración con Everything API - [ ] Sistema de hash en dos etapas - [ ] Motor de backup básico - [ ] Scheduler con APScheduler #### Fase 2: Interfaz Web - [ ] Dashboard básico con Flask - [ ] API REST para operaciones CRUD - [ ] Frontend con HTML/JS/Bootstrap #### Fase 3: Características Avanzadas - [ ] Logs web viewer - [ ] Configuración avanzada de directorios - [ ] Estadísticas y reportes #### Fase 4: Optimizaciones - [ ] Ejecución como servicio Windows - [ ] Notificaciones por email - [ ] Backup incremental Este documento será la base para el desarrollo del proyecto AutoBackups.