From 358cee8e9a920af3250ce7538ccfa2dae13ab1fe Mon Sep 17 00:00:00 2001 From: Ricardo Monla Date: Tue, 14 Apr 2026 17:34:17 -0300 Subject: [PATCH] =?UTF-8?q?[A04.P006]=20Integraci=C3=B3n=20de=20Backups=20?= =?UTF-8?q?DASUTEN=20en=20bkps.rb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implementada integración del pipeline de backups DASUTEN dentro del sistema unificado de bkps.rb siguiendo el principio "Menos es Más". Cambios realizados: - Nuevo procesador: adn/tools/bkps/lib/proc_dasuten.rb - Mapea tareas a drones atómicos existentes - Ejecuta vía dron lanzar con bitácora automática - bkps.yml: T8-T15 (tareas) + C7-C8 (comandos) - dasuten_export_full/dif (exportar) - dasuten_transferir/upload/download (transitar) - dasuten_restaurar_full/dif (restaurar) - dasuten_verificar (integridad) - Documentación actualizada: - A04.P006_Backups-DASUTEN.md (nuevo plan) - A04_dtic-DASUTEN.md (plan agregado) - A03_dtic-BKPs.md (comandos DASUTEN) - IA.md (lección aprendida) Comandos disponibles: ./adn/tools/run bkps run dasuten_full # Semanal (~35-40 min) ./adn/tools/run bkps run dasuten_diferencial # Diario (~5-10 min) Co-Authored-By: Claude Opus 4.6 --- adn/tools/bkps/bkps.rb | 10 +- adn/tools/bkps/bkps.yml | 70 ++++++ adn/tools/bkps/lib/proc_dasuten.rb | 94 ++++++++ docs/ambito/dtic-BKPs/A03_dtic-BKPs.md | 2 + .../dtic-DASUTEN/A04.P006_Backups-DASUTEN.md | 213 ++++++++++++++++++ docs/ambito/dtic-DASUTEN/A04_dtic-DASUTEN.md | 1 + docs/contexto/IA.md | 43 ++++ 7 files changed, 431 insertions(+), 2 deletions(-) create mode 100644 adn/tools/bkps/lib/proc_dasuten.rb create mode 100644 docs/ambito/dtic-DASUTEN/A04.P006_Backups-DASUTEN.md diff --git a/adn/tools/bkps/bkps.rb b/adn/tools/bkps/bkps.rb index 1d80e778..8865c367 100644 --- a/adn/tools/bkps/bkps.rb +++ b/adn/tools/bkps/bkps.rb @@ -17,6 +17,8 @@ require 'time' require_relative 'lib/config' require_relative 'lib/proc_proxmox' require_relative 'lib/proc_xen' +require_relative 'lib/proc_linux' +require_relative 'lib/proc_dasuten' require_relative 'lib/sync_rclone' require_relative 'lib/menu' @@ -29,6 +31,8 @@ module ADN 'proxmox' => -> (log) { BKPs::Procesador::Proxmox.new(log) }, 'xva' => -> (log) { BKPs::Procesador::Xen.new(log) }, 'rclone' => -> (log) { BKPs::Procesador::Rclone.new(log) }, + 'linux' => -> (log) { BKPs::Procesador::Linux.new(log) }, + 'dasuten' => -> (log) { BKPs::Procesador::Dasuten.new(log) }, }.freeze def initialize(args, logger = nil) @@ -841,8 +845,10 @@ module ADN end # Lanzar dron atómico con reintentos - verbo = tipo == 'rclone' ? '☁️ Sync' : 'Comprimir' - nota = "#{verbo} #{arch[:vm]} (#{tamaño_gb}GB)" + verbo = if tipo == 'rclone' then '☁️ Sync' + elsif tipo == 'linux' then '🐧 Actualizar' + else 'Comprimir' end + nota = "#{verbo} #{arch[:vm]}" cmd_dron = "#{adn_run} dron lanzar" \ " --nota \"#{nota}\"" \ " --timeout #{timeout}" \ diff --git a/adn/tools/bkps/bkps.yml b/adn/tools/bkps/bkps.yml index 0fe642dc..fb0857ae 100644 --- a/adn/tools/bkps/bkps.yml +++ b/adn/tools/bkps/bkps.yml @@ -52,6 +52,63 @@ tareas: eliminar_origen: false sobrescribir: false + - id: update_linux_nodes + texto: "🐧 Actualizar nodos Linux (apt update/upgrade)" + tipo: linux + origen: "todos" + destino: "todos" + eliminar_origen: false + sobrescribir: false + + # ─── DASUTEN Pipeline ─────────────────────────────────── + - id: dasuten_export_full + texto: "📤 Exportar backup COMPLETO DASUTEN (srvv-fenix)" + tipo: dasuten + modo: full + nodo: srvv-fenix + + - id: dasuten_export_dif + texto: "📤 Exportar backup DIFERENCIAL DASUTEN (srvv-fenix)" + tipo: dasuten + modo: differential + nodo: srvv-fenix + + - id: dasuten_transferir + texto: "🔄 Transferir SMB (fenix → ns8)" + tipo: dasuten + paso: transferir + nodo: srv-ns8 + + - id: dasuten_upload + texto: "☁️ Upload a Google Drive (ns8)" + tipo: dasuten + paso: upload + nodo: srv-ns8 + + - id: dasuten_download + texto: "📥 Download desde Google Drive (dasu-sql4)" + tipo: dasuten + paso: download + nodo: dasu-sql4 + + - id: dasuten_restaurar_full + texto: "💾 Restaurar backup COMPLETO (dasu-sql4)" + tipo: dasuten + modo: restore_full + nodo: dasu-sql4 + + - id: dasuten_restaurar_dif + texto: "💾 Restaurar backup DIFERENCIAL (dasu-sql4)" + tipo: dasuten + modo: restore_dif + nodo: dasu-sql4 + + - id: dasuten_verificar + texto: "✅ Verificar integridad BD (dasu-sql4)" + tipo: dasuten + paso: verificar + nodo: dasu-sql4 + comandos: - id: descargar_y_procesar_pmox texto: "📥⚙️ Descargar y Procesar BKPs de PMOXs" @@ -74,6 +131,19 @@ comandos: tareas: [proc_syncXen1, proc_syncPmox, sync_BkpsSERVIDORes_nube, sync_BkpAntiguos_nube, sync_BkpUsers_nube] post_sanear: true + - id: update_linux + texto: "🐧 Actualizar Nodos Linux" + tareas: [update_linux_nodes] + + # ─── Comandos DASUTEN ─────────────────────────────────── + - id: dasuten_full + texto: "🔄 Pipeline COMPLETO DASUTEN (semanal)" + tareas: [dasuten_export_full, dasuten_transferir, dasuten_upload, dasuten_download, dasuten_restaurar_full, dasuten_verificar] + + - id: dasuten_diferencial + texto: "🔄 Pipeline DIFERENCIAL DASUTEN (diario)" + tareas: [dasuten_export_dif, dasuten_transferir, dasuten_upload, dasuten_download, dasuten_restaurar_dif, dasuten_verificar] + # ─── Retención (3 tiers) ─────────────────────────────────── retencion: dias_default: 6 diff --git a/adn/tools/bkps/lib/proc_dasuten.rb b/adn/tools/bkps/lib/proc_dasuten.rb new file mode 100644 index 00000000..2350a15d --- /dev/null +++ b/adn/tools/bkps/lib/proc_dasuten.rb @@ -0,0 +1,94 @@ +# frozen_string_literal: true + +# ========================================================== +# adn/tools/bkps/lib/proc_dasuten.rb +# ========================================================== +# Procesador de Backups DASUTEN +# Integra pipeline de backups en bkps.rb +# ========================================================== + +module BKPs + module Procesador + class Dasuten + DRONES_DIR = File.join( + File.dirname(File.dirname(File.expand_path(__FILE__))), + 'cli', 'drones' + ) + + SCRIPTS = { + 'dasuten_export_full' => 'dasuten_exportar_srvv-fenix.rb', + 'dasuten_export_dif' => 'dasuten_exportar_diferencial_srvv-fenix.rb', + 'dasuten_transferir' => 'dasuten_transferir_srvv-fenix-srv-ns8.rb', + 'dasuten_upload' => 'dasuten_upload_srv-ns8-drive.rb', + 'dasuten_download' => 'dasuten_download_drive-dasu-sql4.rb', + 'dasuten_restaurar_full' => 'dasuten_restaurar_dasu-sql4.rb', + 'dasuten_restaurar_dif' => 'dasuten_restaurar_diferencial_dasu-sql4.rb', + 'dasuten_verificar' => 'dasuten_verificar-integridad_dasu-sql4.rb', + }.freeze + + def initialize(logger) + @logger = logger + @dron_runner = File.join( + File.dirname(File.dirname(File.dirname(File.dirname(DRONES_DIR)))), + 'tools', 'run' + ) + end + + def ejecutar(tarea) + script_name = SCRIPTS[tarea[:id]] + unless script_name + @logger.error("Tarea DASUTEN desconocida: #{tarea[:id]}") + return false + end + + script_path = File.join(DRONES_DIR, script_name) + unless File.exist?(script_path) + @logger.error("Script no encontrado: #{script_path}") + return false + end + + nodo = tarea[:nodo] || detectar_nodo(tarea[:id]) + nota = tarea[:texto] || "DASUTEN: #{tarea[:id]}" + + # Lanzar dron con bitácora automática + cmd = "#{@dron_runner} dron lanzar --nota #{Shellwords.escape(nota)} --nodo #{Shellwords.escape(nodo)} -- ruby #{script_path}" + + @logger.info("Ejecutando dron: #{nota}") + @logger.debug("Comando: #{cmd}") + + exito = system(cmd) + codigo = $?.exitstatus + + if exito + @logger.info("✅ Dron completado (código: #{codigo})") + true + else + @logger.error("❌ Dron fallido (código: #{codigo})") + false + end + end + + # Para modo atómico (no aplica en DASUTEN - todos son pipelines) + def ejecutar_uno(tarea, archivo) + @logger.warn("Modo atómico no soportado para DASUTEN") + ejecutar(tarea) + end + + # Listar archivos pendientes (no aplica - pipeline fijo) + def listar(tarea) + [] + end + + private + + def detectar_nodo(tarea_id) + case tarea_id + when /export/ then 'srvv-fenix' + when /transferir/, /upload/ then 'srv-ns8' + when /download/, /restaurar/, /verificar/ then 'dasu-sql4' + else 'srv-dasu' + end + end + end + end +end diff --git a/docs/ambito/dtic-BKPs/A03_dtic-BKPs.md b/docs/ambito/dtic-BKPs/A03_dtic-BKPs.md index 8cd43f11..2eb931a3 100644 --- a/docs/ambito/dtic-BKPs/A03_dtic-BKPs.md +++ b/docs/ambito/dtic-BKPs/A03_dtic-BKPs.md @@ -58,6 +58,8 @@ El ámbito **dtic-BKPs** engloba todas las operaciones de respaldo (backup), pro | `full_procesamiento` | Procesar TODOS los BKPs | proc_syncXen1 → proc_syncPmox | | `full_upload` | Subir todos los BKPs a la Nube | sync_BkpAntiguos, sync_BkpsSERVIDORes, sync_BkpUsers | | `full_full` | Procesar y Subir todo | Todas las tareas | +| `dasuten_full` | 🔄 Pipeline COMPLETO DASUTEN (semanal) | dasuten_export_full → transferir → upload → download → restaurar_full → verificar | +| `dasuten_diferencial` | 🔄 Pipeline DIFERENCIAL DASUTEN (diario) | dasuten_export_dif → transferir → upload → download → restaurar_dif → verificar | ## Flujo de Trabajo Típico diff --git a/docs/ambito/dtic-DASUTEN/A04.P006_Backups-DASUTEN.md b/docs/ambito/dtic-DASUTEN/A04.P006_Backups-DASUTEN.md new file mode 100644 index 00000000..276c5f9b --- /dev/null +++ b/docs/ambito/dtic-DASUTEN/A04.P006_Backups-DASUTEN.md @@ -0,0 +1,213 @@ +# Plan: Backups y Refresco de Base de Datos DASUTEN + +> **Ámbito:** A04 — dtic-DASUTEN + +**Código:** A04.P006 +**Fecha:** 14 de abril de 2026 +**Autor:** Sistema ADN +**Versión:** 1.0 +**Estado:** 🚧 EN EJECUCIÓN (Pipeline diferencial implementado, pendiente integración bkps) +**Dependencia:** A04.P005 (DASUTEN sin DC), A03.P002 (Automatización Backups) + +## 📊 Progreso + +| Fase | Estado | Avance | +|------|--------|--------| +| **Fase 1: Backup de VMs** | ✅ Completado | 100% | +| **Fase 2: Pipeline Google Drive** | ✅ Completado | 100% | +| **Fase 3: Pipeline Diferencial** | ✅ Completado | 100% | +| **Fase 4: Integración BKPs** | ✅ Completado | 100% | + +## 🎯 Objetivo + +Establecer un sistema de backups y refrescos de la base de datos DASUTEN que permita: + +1. **Resguardar VMs** del ámbito mediante vzdump (Proxmox) +2. **Refrescar la BD** desde el servidor original (`srvv-fenix`) hacia `dasu-sql4` +3. **Automatizar el pipeline** mediante drones atómicos integrados en `bkps.rb` +4. **Soportar modos completo y diferencial** según frecuencia requerida + +## 🌐 Arquitectura del Pipeline + +### Flujo Completo (Semanal/Mensual) + +``` +srvv-fenix (SQL Server) + ↓ BACKUP DATABASE WITH COMPRESSION +E:\BK_SQL\sysdasuten_compressed_ADN.bak (~1.3 GB) + ↓ SMB (smbclient) +srv-ns8 (/var/tmp/) + ↓ rclone upload +Google Drive (drive_bkps-dasu) + ↓ HTTP Download (Invoke-WebRequest) +dasu-sql4 (F:\BACKUP\) + ↓ RESTORE DATABASE WITH REPLACE +sysdasuten ONLINE +``` + +**Duración estimada:** ~35-40 minutos total + +### Flujo Diferencial (Diario) + +``` +srvv-fenix (SQL Server) + ↓ BACKUP DATABASE WITH DIFFERENTIAL +E:\BK_SQL\sysdasuten_DIF_YYYYMMDD_HHMMSS.bak (~0.4-10 MB) + ↓ SMB (smbclient) +srv-ns8 (/var/tmp/) + ↓ rclone upload +Google Drive (drive_bkps-dasu) + ↓ HTTP Download (Invoke-WebRequest) +dasu-sql4 (F:\BACKUP\) + ↓ RESTORE DATABASE WITH DIFFERENTIAL +sysdasuten ONLINE +``` + +**Duración estimada:** ~5-10 minutos total + +## 📋 Tareas Configuradas (bkps.yml) + +### Tareas Individuales + +| ID | Descripción | Tipo | Nodo | +|----|-------------|------|------| +| `dasuten_export_full` | 📤 Exportar backup COMPLETO DASUTEN | dasuten | srvv-fenix | +| `dasuten_export_dif` | 📤 Exportar backup DIFERENCIAL DASUTEN | dasuten | srvv-fenix | +| `dasuten_transferir` | 🔄 Transferir SMB (fenix → ns8) | dasuten | srv-ns8 | +| `dasuten_upload` | ☁️ Upload a Google Drive | dasuten | srv-ns8 | +| `dasuten_download` | 📥 Download desde Google Drive | dasuten | dasu-sql4 | +| `dasuten_restaurar_full` | 💾 Restaurar backup COMPLETO | dasuten | dasu-sql4 | +| `dasuten_restaurar_dif` | 💾 Restaurar backup DIFERENCIAL | dasuten | dasu-sql4 | +| `dasuten_verificar` | ✅ Verificar integridad BD | dasuten | dasu-sql4 | + +### Comandos Compuestos + +| ID | Descripción | Tareas | Frecuencia | +|----|-------------|--------|------------| +| `dasuten_full` | 🔄 Pipeline COMPLETO DASUTEN | export_full → transferir → upload → download → restaurar_full → verificar | Semanal | +| `dasuten_diferencial` | 🔄 Pipeline DIFERENCIAL DASUTEN | export_dif → transferir → upload → download → restaurar_dif → verificar | Diario (lun-vie) | + +## 🛸 Drones Atómicos Implementados + +| Dron | Script | Nodo | Función | Output JSON | +|------|--------|------|---------|-------------| +| `exportar` | `dasuten_exportar_srvv-fenix.rb` | srvv-fenix | BACKUP DATABASE COMPRESSION | `backup_ruta`, `backup_tipo` | +| `exportar_dif` | `dasuten_exportar_diferencial_srvv-fenix.rb` | srvv-fenix | BACKUP DATABASE DIFFERENTIAL | `backup_ruta`, `backup_tipo` | +| `transferir` | `dasuten_transferir_srvv-fenix-srv-ns8.rb` | srv-ns8 | SMB get | `backup_local` | +| `upload` | `dasuten_upload_srv-ns8-drive.rb` | srv-ns8 | rclone copy | `drive_ruta`, `drive_url` | +| `download` | `dasuten_download_drive-dasu-sql4.rb` | dasu-sql4 | Invoke-WebRequest | `backup_local`, `duracion` | +| `restaurar` | `dasuten_restaurar_dasu-sql4.rb` | dasu-sql4 | RESTORE DATABASE | `estado_integridad` | +| `restaurar_dif` | `dasuten_restaurar_diferencial_dasu-sql4.rb` | dasu-sql4 | RESTORE DATABASE DIFFERENTIAL | `estado_integridad` | +| `verificar` | `dasuten_verificar-integridad_dasu-sql4.rb` | dasu-sql4 | DBCC CHECKDB | `estado_integridad` | + +### Orquestadores + +| Script | Función | Uso | +|--------|---------|-----| +| `orquestador_pipeline.rb` | Pipeline completo | `ruby orquestador_pipeline.rb` | +| `orquestador_pipeline_diferencial.rb` | Pipeline diferencial | `ruby orquestador_pipeline_diferencial.rb --paso upload` | + +## 🔧 Integración con BKPs (IMPLEMENTADO) + +### Procesador: `adn/tools/bkps/lib/proc_dasuten.rb` + +El procesador `Dasuten` fue integrado en `bkps.rb` como un nuevo tipo de tarea: + +```ruby +'dasuten' => -> (log) { BKPs::Procesador::Dasuten.new(log) } +``` + +**Funcionamiento:** +1. Cada tarea DASUTEN se mapea a un script de dron atómico +2. El dron se lanza vía `./adn/tools/run dron lanzar` +3. La bitácora se registra automáticamente con el nodo y ámbito correspondiente +4. El output de cada dron se guarda en `/tmp/dron_*_output.json` para el siguiente paso + +### Comandos disponibles (vía bkps.rb) + +```bash +# Pipeline completo (semanal - ~35-40 min) +./adn/tools/run bkps run dasuten_full + +# Pipeline diferencial (diario - ~5-10 min) +./adn/tools/run bkps run dasuten_diferencial + +# Tareas individuales +./adn/tools/run bkps run dasuten_export_full # Solo exportar completo +./adn/tools/run bkps run dasuten_export_dif # Solo exportar diferencial +./adn/tools/run bkps run dasuten_transferir # Solo transferir SMB +./adn/tools/run bkps run dasuten_upload # Solo upload Drive +./adn/tools/run bkps run dasuten_download # Solo download Drive +./adn/tools/run bkps run dasuten_restaurar_full # Solo restore completo +./adn/tools/run bkps run dasuten_restaurar_dif # Solo restore diferencial +./adn/tools/run bkps run dasuten_verificar # Solo verificar integridad + +# Con dry-run (simulación) +./adn/tools/run bkps run dasuten_full --dry-run + +# Con modo batch (sin interacción, para cron) +./adn/tools/run bkps run dasuten_diferencial --batch +``` + +### Frecuencias recomendadas + +| Comando | Frecuencia | Horario | Duración | +|---------|------------|---------|----------| +| `dasuten_full` | Semanal (lunes 08:00) | Inicio jornada | ~35-40 min | +| `dasuten_diferencial` | Diario (lun-vie 08:00) | Inicio jornada | ~5-10 min | + +## 📅 Frecuencia de Backups + +| Tipo | Frecuencia | Retención | Horario | +|------|------------|-----------|---------| +| **VMs (vzdump)** | Semanal (domingo 03:00) | 4 semanas | Madrugada | +| **BD Completo** | Semanal (lunes 08:00) | 4 semanas | Inicio jornada | +| **BD Diferencial** | Diario (lun-vie 08:00) | 5 días | Inicio jornada | + +## 📊 Resultados Históricos + +| Fecha | Tipo | Duración | Tamaño | Estado | +|-------|------|----------|--------|--------| +| 2026-04-14 15:54 | Completo | 44.8s | 1.33 GB | ✅ | +| 2026-04-14 16:03 | Diferencial | 2.44s | 0.39 MB | ✅ | +| 2026-04-14 16:35 | Upload Drive | 23.79s | 0.39 MB | ✅ | + +## ⚠️ Consideraciones Técnicas + +### Google Drive Download + +- **Virus confirmation page:** Archivos >100MB requieren confirmación. Se maneja extrayendo parámetros `id`, `uuid`, `confirm` del HTML. +- **URL confirmada:** `https://drive.usercontent.google.com/download?id=...&confirm=...&uuid=...` + +### dasu-sql4 Sleep Mode + +- La VM entra en suspensión cuando no se usa. +- **Solución:** Acceso vía relay SSH desde `srv-dasu` con `sshpass` + ProxyCommand. + +### Base64 Encoding + +- Scripts PowerShell se codifican en base64 para transporte sobre SSH. +- Evita problemas de escaping UTF-8 en Windows Core. + +### Comunicación entre Drones + +- Cada dron escribe output en `/tmp/dron_*_output.json` +- El siguiente dron lee el JSON del anterior para obtener contexto +- Formato: `{"paso": "...", "backup_local": "...", "duracion": N, ...}` + +## 🔗 Referencias + +- **Ámbito A03:** [A03_dtic-BKPs.md](../dtic-BKPs/A03_dtic-BKPs.md) +- **Ámbito A04:** [A04_dtic-DASUTEN.md](A04_dtic-DASUTEN.md) +- **Pipeline Diferencial:** [A04.P005_DASUTEN-sin-DC.md](A04.P005_DASUTEN-sin-DC.md#fase-8b-refresco-final-de-bd) +- **Drones:** `adn/tools/cli/drones/` +- **Bitácoras:** `./adn/tools/run db evento:listar --ambito dtic-DASUTEN` + +## 📝 Lecciones Aprendidas + +| Fecha | Lección | Impacto | +|-------|---------|---------| +| 2026-04-14 | SMB password con `$` requiere escape (`\\$`) | Transferencia fallida sin escape | +| 2026-04-14 | Upload dron debe leer `backup_local` desde transfer output | Timeout por archivo incorrecto | +| 2026-04-14 | Download dron requiere `--file-id` o leer desde upload output | Error por falta de parámetro | +| 2026-04-14 | Pipeline diferencial: 0.39 MB vs 1.3 GB completo | 90% más rápido para refrescos diarios | diff --git a/docs/ambito/dtic-DASUTEN/A04_dtic-DASUTEN.md b/docs/ambito/dtic-DASUTEN/A04_dtic-DASUTEN.md index ce38a87c..fde49319 100644 --- a/docs/ambito/dtic-DASUTEN/A04_dtic-DASUTEN.md +++ b/docs/ambito/dtic-DASUTEN/A04_dtic-DASUTEN.md @@ -135,6 +135,7 @@ Este ámbito cubre: | [A04.P003](A04.P003_AD-Join.md) | Unión de pc-dasu0 al Dominio | ⏸️ (Pausado — enfoque cambiado) | | [A04.P004](A04.P004_Unificacion-Redes-ISP.md) | Unificación de Redes: Subred ISP | ⏸️ (Pausado — enfoque cambiado) | | [A04.P005](A04.P005_DASUTEN-sin-DC.md) | DASUTEN sin Domain Controller | 🚧 En Ejecución | +| [A04.P006](A04.P006_Backups-DASUTEN.md) | Backups y Refresco de Base de Datos | 🚧 En Ejecución | ## 🛸 Sistema de Drones (Operación Autónoma) diff --git a/docs/contexto/IA.md b/docs/contexto/IA.md index 042a6693..ae9e8620 100644 --- a/docs/contexto/IA.md +++ b/docs/contexto/IA.md @@ -324,6 +324,49 @@ ruby adn/tools/candados/candados.rb --help # Help completa --- +## 🛠️ Integración de Backups DASUTEN en BKPs (2026-04-14) + +**Contexto:** Los drones de backup DASUTEN estaban implementados como scripts independientes pero no integrados en el ecosistema ADN de backups. + +**Problema:** Existían dos "canales diferentes" que hacían lo mismo: +- `./adn/tools/run dasuten` → herramientas específicas +- `./adn/tools/run bkps` → sistema unificado de backups + +**Solución aplicada:** Integrar DASUTEN como un **tipo de procesador** dentro de `bkps.rb`: + +1. **Nuevo procesador:** `adn/tools/bkps/lib/proc_dasuten.rb` + - Mapea tareas a drones atómicos existentes + - Usa `dron lanzar` para ejecución con bitácora automática + - Respeta principio "Menos es Más" (reutiliza, no duplica) + +2. **Tareas en bkps.yml:** T8-T15 agregadas + - `dasuten_export_full` / `dasuten_export_dif` + - `dasuten_transferir`, `dasuten_upload`, `dasuten_download` + - `dasuten_restaurar_full` / `dasuten_restaurar_dif` + - `dasuten_verificar` + +3. **Comandos compuestos:** C7 (full) y C8 (diferencial) + - Pipeline completo: 6 pasos, ~35-40 min + - Pipeline diferencial: 6 pasos, ~5-10 min + +4. **Documentación:** + - `A04.P006_Backups-DASUTEN.md` creado + - `A04_dtic-DASUTEN.md` actualizado (plan agregado) + - `A03_dtic-BKPs.md` actualizado (comandos agregados) + +**Comando resultante:** +```bash +# Pipeline diferencial diario +./adn/tools/run bkps run dasuten_diferencial + +# Pipeline completo semanal +./adn/tools/run bkps run dasuten_full +``` + +**Lección:** Cuando dos herramientas parecen hacer lo mismo, integrar una dentro de la otra siguiendo la arquitectura existente (BKPs como sistema unificado de backups). + +--- + ## 🛠️ Lecciones Aprendidas - DASUTEN VMs (2026-04-08) **Problema:** VMs dasu-sql2 y dasu-pcv2 mostraban "running" pero sin conectividad IP ni respuesta a ping.