246 lines
7.2 KiB
Markdown
246 lines
7.2 KiB
Markdown
# 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**: `python-everything` o integración directa con Everything SDK
|
|
- **Función**: Localizar archivos *.s7p en directorios de observación
|
|
- **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 timestamps 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 hash de todos los archivos del directorio del proyecto
|
|
- Compara con último hash almacenado
|
|
- Solo hace backup si hay diferencias
|
|
|
|
#### 1.3 Scheduler Flexible
|
|
- **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
|
|
|
|
### 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
|
|
|
|
#### 3.2 Proceso de Backup
|
|
1. **Verificación de Acceso**: Intentar abrir archivos en modo lectura
|
|
2. **Hash Etapa 1**: Verificar timestamp del archivo .s7p
|
|
3. **Hash Etapa 2**: Si Etapa 1 detecta cambios, verificar hash completo
|
|
4. **Compresión**: Crear archivo ZIP con estructura de directorios preservada
|
|
5. **Almacenamiento**: Guardar en `backup_destination/YYYY-MM-DD_HH-MM-SS/`
|
|
6. **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
|
|
```
|
|
backup_destination/
|
|
├── 2025-09-01_02-15-30/
|
|
│ ├── Projects_Siemens_PLC_MainLine.zip
|
|
│ └── Important_Docs_Documentation.zip
|
|
└── 2025-09-02_02-15-45/
|
|
└── Projects_Siemens_PLC_SecondaryLine.zip
|
|
```
|
|
|
|
#### 5.2 Contenido del ZIP
|
|
```
|
|
PLC_MainLine.zip
|
|
└── Projects/
|
|
└── Siemens/
|
|
└── PLC_MainLine/
|
|
├── PLC_MainLine.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**: `python-everything` o implementación custom
|
|
- **Hashing**: hashlib (biblioteca estándar)
|
|
- **Config**: json (biblioteca estándar)
|
|
- **Logging**: logging (biblioteca estándar)
|
|
- **File Access Check**: Implementación custom con try/except
|
|
|
|
#### 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.
|