AutoBackups/autobackups/SPECIFICATION.md

7.8 KiB

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)

{
  "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)

{
  "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

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.