[A04.P005] DASUTEN: Pipeline refactorizado + Documentación + Informes
Refactorización del pipeline de backups DASUTEN: 1. Flujo simplificado (un solo destino): - Backup directo a X:\ (share srv-ns8) - Eliminado paso intermedio E:\BK_SQL\sysdasuten\ - Reducido de 3 ubicaciones a 2 (X: → /var/tmp/) 2. Módulo común DasuExecutor (lib/dasu_executor.rb): - Centraliza ejecución PowerShell en dasu-sql4 - Centraliza verificación de archivos en fenix - Elimina código repetido en 6 drones (-52% líneas) 3. Drones refactorizados: - dasuten_exportar_srvv-fenix.rb (FULL → X:) - dasuten_exportar_diferencial_srvv-fenix.rb (DIF → X:) - dasuten_transferir_srvv-fenix-srv-ns8.rb (simplificado) - dasuten_restaurar_dasu-sql4.rb (usa DasuExecutor) - dasuten_restaurar_diferencial_dasu-sql4.rb (usa DasuExecutor) - dasuten_download_drive-dasu-sql4.rb (usa DasuExecutor) - dasuten_verificar-integridad_dasu-sql4.rb (usa DasuExecutor) 4. Integración BKPs mantenida: - T8-T15: Tareas individuales - C7: dasuten_full (pipeline semanal) - C8: dasuten_diferencial (pipeline diario) 5. Documentación actualizada: - A04.P006_Backups-DASUTEN.md: flujo simplificado + módulo común - Lecciones aprendidas agregadas 6. Nuevos archivos: - Informes técnicos DASUTEN (docs/informes/2026-04_DASUTEN-migracion/) - A01.P011/P012: Documentación de drones y pipeline - proc_linux.rb, ops.rb: Utilitarios del ecosistema 7. Scripts legacy (para referencia): - orquestador_pipeline.rb, orquestador_pipeline_diferencial.rb - dasuten_upload_srv-ns8-drive.rb
This commit is contained in:
@@ -5,8 +5,8 @@
|
||||
**Código:** A04.P005
|
||||
**Fecha:** 27 de marzo de 2026
|
||||
**Autor:** Sistema ADN
|
||||
**Versión:** 4.0
|
||||
**Estado:** 🚧 EN EJECUCIÓN (F5 completada — BD restaurada, pendiente validación con PC cliente)
|
||||
**Versión:** 5.3
|
||||
**Estado:** 🚧 EN EJECUCIÓN (F8b — Refresco final de BD pendiente)
|
||||
**Dependencia:** A04.P001 (Red srv-dasu)
|
||||
|
||||
## 📊 Progreso General
|
||||
@@ -17,7 +17,11 @@
|
||||
- **Fase 4: Nueva VM dasu-sql4** [██████████] 100% (12/12) ✅
|
||||
- **Fase 5: Migración BD** [██████████] 100% (5/5) ✅
|
||||
- **Fase 5b: Hardening** [██████████] 100% (4/4) ✅
|
||||
- **Fase 6: Validación** [█░░░░░░░░░] 9% (1/10) 🚧
|
||||
- **Fase 6: Validación** [██████████] 100% (10/10) ✅
|
||||
- **Fase 7: PC Física** [██████████] 100% (9/9) ✅
|
||||
- **Fase 8: Refresco BD** [██████████] 100% (4/4) ✅
|
||||
- **Fase 8b: Refresco Final** [██████████] 100% (4/4) ✅ ¡COMPLETADA!
|
||||
- **Fase 9: Cierre** [░░░░░░░░░░] 0% (0/4) ⏳
|
||||
|
||||
## 📋 Resumen Ejecutivo
|
||||
|
||||
@@ -169,7 +173,7 @@ Crear dos VMs nuevas (SQL Server + PC cliente) en `srv-dasu`, instalar el sistem
|
||||
- [x] **6.10:** **Decisión**: ¿Se puede prescindir del DC definitivamente?
|
||||
- ✅ **SÍ** → El esquema Workgroup es 100% viable. Se valida que el cliente DASUTEN funciona modificando el `Kermet.ini`. Con esta prueba exitosa en la máquina virtual cliente (Test-Bed `dasu-pcv`), procedemos oficialmente a desplegar este esquema en Producción Física.
|
||||
|
||||
### 🚀 **FASE 7: Migración a Producción (PC Física)** *(A iniciar 2026-04-11)*
|
||||
### 🚧 **FASE 7: Migración a Producción (PC Física)** *(En curso 2026-04-13)*
|
||||
|
||||
> **Contexto:** Habiendo superado con éxito la reingeniería en el entorno controlado de la VM de prueba (`dasu-pcv`), el objetivo ahora es trasladar esta misma configuración (Workgroup + Configuración DB directa) a la PC física real operada por la usuaria de DASUTEN.
|
||||
|
||||
@@ -177,20 +181,61 @@ Crear dos VMs nuevas (SQL Server + PC cliente) en `srv-dasu`, instalar el sistem
|
||||
> **Motivo:** Para que la resolución de nombres NetBIOS funcione de manera más armónica y el firewall perciba los nodos como "Red Privada" simétrica, todos los participantes deben pertenecer estrictamente al Group `DASUTEN`.
|
||||
- [x] **PC Cliente Virtual (`dasu-pcv`):** Grupo `DASUTEN` asignado previamente. ✅
|
||||
- [x] **Servidor SQL (`dasu-sql4`):** Modificar grupo de trabajo actual a `DASUTEN`. ✅ (Aplicado remotamente vía SSH)
|
||||
- [ ] **PC Física (`dasu-pc`):** Se modificará a `DASUTEN` durante el relevamiento.
|
||||
- [x] **PC Física (`dasu-pc`):** Ya estaba en Workgroup `DASUTEN`. ✅ *(Confirmado 2026-04-13)*
|
||||
|
||||
#### 7.2 Relevamiento de la PC Física
|
||||
- [ ] **Acceso inicial:** Gestionar acceso por AnyDesk/TeamViewer a la PC física de la entidad.
|
||||
- [ ] **Validar estado actual:** Corroborar si aún sigue atada al dominio antiguo y si la usuaria está utilizando un perfil local o de dominio cacheado para evitar pérdida de archivos al mover a Workgroup.
|
||||
- [ ] **Configuración DASUTEN previo:** Backup preventivo de su directorio `C:\SysDasuten\Sistema\Kermet.ini`.
|
||||
#### 7.2 Relevamiento y Despliegue en PC Física *(completado 2026-04-13)*
|
||||
- [x] **Acceso inicial:** SSH habilitado (`UTNLR@100.119.233.11:7022`). Tailscale y AnyDesk activos. ✅
|
||||
- [x] **Validar estado actual:** Win10 Pro, Workgroup `DASUTEN`, hostname `dasu-pc`, perfil local `aalmiron`. ✅
|
||||
- [x] **Despliegue SysDasuten:** `C:\SysDasuten` no existía previamente. Se copió el directorio completo desde `dasu-pcv` (montaje disco VM NTFS → tar.gz → HTTP LAN srv-dasu:8080 → PowerShell download → extracción). ✅
|
||||
- [x] **Kermet.ini verificado:** `SERVER=dasu-sql4`, `UID=sa`, `DATABASE=sysdasuten`. ✅
|
||||
- [x] **Acceso directo creado** en el escritorio de `aalmiron`. ✅ *(El .lnk generado por WScript.Shell no funcionó; se recreó manualmente).*
|
||||
|
||||
#### 7.2 Migración de Configuración en PC Física
|
||||
- [ ] **Ajuste Workgroup:** Desvincular del dominio obsoleto y agregar al grupo de trabajo `DASUTEN` sin afectar la información local.
|
||||
- [ ] **Re-conexión al SQL (Nuevo esquema):** Inyectar el `Kermet.ini` modificado con `UID=sa` y **`SERVER=dasu-sql4`**. *(Nota: Se comprobó que usar el Hostname en lugar de la IP funciona perfectamente gracias a la resolución de nombres del grupo de trabajo compartido, otorgando resiliencia ante rotación del DHCP).*
|
||||
- [ ] **Pruebas de Usuario Final:** Loguearse al sistema con credenciales productivas y validar.
|
||||
#### 7.3 Prueba Funcional con Usuaria *(parcial 2026-04-13)*
|
||||
> **Usuaria:** Andrea Almirón (`aalmiron`)
|
||||
|
||||
#### 7.3 Destrucción Ecosistema Antiguo
|
||||
- [ ] Proceder al apagado seguro de las VMs legacy que sostenían el Active Directory (VM 100, VM 101).
|
||||
- [x] **Inicio rápido del sistema:** ✅ OK — Arranca sin errores.
|
||||
- [x] **Acceso a ventana de bonos:** ✅ OK — Datos visibles y navegables.
|
||||
- [x] **Impresión desde el sistema:** ✅ OK — **RESUELTO (2026-04-14)**. El symlink `C:\Sistema → C:\SysDasuten\Sistema` fue la solución definitiva. Las plantillas Word/Excel se localizan correctamente.
|
||||
|
||||
#### 7.4 Workaround Temporario *(resuelto 2026-04-13)*
|
||||
> Mientras se resuelve el problema de impresión, se solicitó a la usuaria que continúe operando mediante el sistema anterior (vía acceso remoto a `dasu-pcv`).
|
||||
- [x] **RustDesk reinstalado en dasu-pcv:** ❌ No resolvió inicialmente. Se actualizaron también las claves Kaspersky (antivirus vencido causaba cortes de red). Persistió el problema.
|
||||
- [x] **Verificación cruzada desde srv-ns8:** ❌ Confirmado: RustDesk no conecta desde ningún nodo → problema con los servidores relay propios de RustDesk (no es local).
|
||||
- [x] **Solución provisional: TeamViewer instalado** en ambas máquinas (dasu-pcv + dasu-pc). Interconexión configurada y verificada con éxito. ✅
|
||||
- [x] **Usuaria informada:** Operando en sistema legacy vía TeamViewer mientras finaliza tareas urgentes. ✅
|
||||
- [x] **HALLAZGO RustDesk (2026-04-13 ~16:00):** Se descubrió que RustDesk implementó una nueva política de validación contra su servidor central que antes no existía. Esta validación era la causa raíz de las fallas de conexión entre nodos. Se verificó reconectando exitosamente `srv-ns8 → dasu-pcv` tras aceptar la nueva validación. ✅
|
||||
- ⚠️ **Acción pendiente:** Reconfigurar RustDesk en `dasu-pcv` (y `dasu-pc`) para que funcione con la nueva política, restaurando el acceso remoto directo sin depender de TeamViewer.
|
||||
|
||||
#### 7.5 Diagnóstico de Impresión — Ingeniería Inversa *(en curso 2026-04-13)*
|
||||
|
||||
> **Estrategia:** El sistema DASUTEN (Visual FoxPro) genera documentos de impresión mediante **OLE Automation** con Word/Excel, usando plantillas. Se usa `dasu-pcv` como entorno de diagnóstico para hacer ingeniería inversa.
|
||||
|
||||
##### 7.5.1 Ingeniería inversa — Resultados (2026-04-13 ~18:20)
|
||||
- [x] **Plantillas localizadas:** `C:\SysDasuten\Sistema\Word\` (97 archivos `.doc` — formato Word 97-2003) + `C:\SysDasuten\Sistema\Excel\Recibo.xls`. ✅
|
||||
- [x] **Kermet.ini verificado:** No contiene rutas a plantillas — solo config de BD. Las rutas se resuelven dentro del ejecutable VFP. ✅
|
||||
- [x] **EXE VFP analizado:** `DasutenSQL.exe` compilado desde `c:\users\lis\fox\generalprueba\`. No hardcodea rutas a plantillas — las resuelve relativamente a `.\Word\` y `.\Excel\`. ✅
|
||||
- [x] **Office en dasu-pcv:** Microsoft **Office 2010** (v14.0.6024.1000) — `C:\Program Files (x86)\Microsoft Office\Office14\`. ✅
|
||||
- [x] **Office en dasu-pc:** Microsoft **Office 2016/365** (Office16) — `C:\Program Files\Microsoft Office\Office16\`. ✅
|
||||
|
||||
##### 🔴 CAUSA RAÍZ IDENTIFICADA (2026-04-13 ~18:28)
|
||||
> **Ruta de plantillas incorrecta.** El archivo `leeme!!!!.txt` del sistema indica que las plantillas deben estar en **`C:\Sistema\Word\`** (ruta legacy hardcodeada en el ejecutable VFP). Sin embargo, en la configuración actual las plantillas están en `C:\SysDasuten\Sistema\Word\`. El directorio `C:\Sistema` **no existe** en ninguno de los dos equipos, por lo que el sistema no encuentra las plantillas al intentar imprimir.
|
||||
>
|
||||
> **La versión de Office (2010 vs 2016) es una diferencia pero NO la causa principal.**
|
||||
|
||||
##### 7.5.2 Resolución — Symlink *(parcial 2026-04-13, continúa 2026-04-14)*
|
||||
- [x] **Symlink creado en dasu-pcv:** `mklink /D C:\Sistema C:\SysDasuten\Sistema` → enlace simbólico que redirige `C:\Sistema\` a `C:\SysDasuten\Sistema\`. ✅ Verificado: `C:\Sistema\Word\Consulta.doc` resuelve correctamente.
|
||||
- [x] **OLE Word funcional en dasu-pcv (Session 0):** `New-Object -ComObject Word.Application` → Word 14.0 responde. ✅ Nota: `Documents.Open()` requiere sesión de escritorio interactiva (no funciona por SSH/Session 0).
|
||||
|
||||
##### 7.5.3 Pendiente — Validación interactiva en dasu-pcv *(próxima sesión)*
|
||||
> ⚠️ **La prueba OLE por SSH (Session 0) no alcanza** — Word no puede abrir documentos sin escritorio activo. Se requiere sesión GUI.
|
||||
|
||||
- [x] **Paso 1:** Conectar a `dasu-pcv` vía RustDesk (nueva política) o TeamViewer (ya configurado). ✅
|
||||
- [x] **Paso 2:** Abrir DASUTEN (`C:\SysDasuten\Sistema\DasutenSQL.exe`) desde el escritorio. ✅
|
||||
- [x] **Paso 3:** Intentar imprimir (ej. bono de consulta) → symlink resolvió el error de plantillas. ✅
|
||||
- [x] **Paso 4:** Replicado en `dasu-pc` (PC física). **Impresión funcional en producción.** ✅
|
||||
|
||||
#### 7.6 Destrucción Ecosistema Antiguo *(pospuesto → Fase 9)*
|
||||
> Movido a Fase 9 (Cierre del proyecto) tras validación completa.
|
||||
|
||||
### 🔄 **FASE 8: Refresco de BD de Producción Final** *(Orquestación)*
|
||||
|
||||
@@ -205,6 +250,62 @@ Crear dos VMs nuevas (SQL Server + PC cliente) en `srv-dasu`, instalar el sistem
|
||||
- [x] **Restauración Transaccional:** Ejecución de `RESTORE DATABASE ... WITH REPLACE` asegurando el forzado a Single User (ejecutado directo, el Dron arrojó error de parsing UTF8 por los mensajes en ISO-8859-1 de `sqlcmd`). ✅
|
||||
- [x] **Verificación Post-Restore:** Comprobación `DBCC CHECKDB` certificando la consistencia final de la DB. ✅
|
||||
|
||||
### 🚧 **FASE 8b: Refresco Final de BD** *(En curso 2026-04-14)*
|
||||
|
||||
> **Contexto:** Con la PC física operativa e impresión funcionando, se requiere un último refresco de la BD desde srvv-fenix para que dasu-sql4 tenga los datos más recientes (transacciones de los últimos días).
|
||||
>
|
||||
> **NUEVO ENFOQUE (2026-04-14):** Se reemplaza la cadena de transferencias SMB→SCP→SCP por **Google Drive como medio intermedio**, optimizando el flujo y eliminando dependencias de Tailscale inestable. Se implementa arquitectura de **Drones Atómicos Interconectados** con comunicación vía JSON.
|
||||
|
||||
#### Pipeline de transferencia (NUEVO — Google Drive)
|
||||
```
|
||||
srvv-fenix (BACKUP WITH COMPRESSION)
|
||||
↓ SMB (rápido, LAN)
|
||||
srv-ns8 (/var/tmp/)
|
||||
↓ rclone (subida)
|
||||
Google Drive (carpeta compartida drive_bkps-dasu)
|
||||
↓ HTTP Direct Download (Invoke-WebRequest)
|
||||
dasu-sql4 (F:\BACKUP\)
|
||||
↓ RESTORE DATABASE WITH REPLACE
|
||||
→ sysdasuten ONLINE
|
||||
```
|
||||
|
||||
#### Drones Atómicos Implementados
|
||||
| Dron | Nodo | Tarea | Output JSON |
|
||||
|------|------|-------|-------------|
|
||||
| `dasuten_exportar.rb` | srvv-fenix | BACKUP DATABASE WITH COMPRESSION | `backup_ruta` |
|
||||
| `dasuten_upload_drive.rb` | srv-ns8 | rclone copy → Google Drive | `drive_ruta`, `drive_url` |
|
||||
| `dasuten_download_drive.rb` | dasu-sql4 | Invoke-WebRequest ← Google Drive | `backup_local`, `duracion` |
|
||||
| `dasuten_restaurar.rb` | dasu-sql4 | RESTORE + DBCC CHECKDB | `estado_integridad`, `pipeline_completo` |
|
||||
|
||||
#### Orquestador
|
||||
- **Script:** `adn/tools/cli/drones/orquestador_pipeline.rb`
|
||||
- **Función:** Lanza drones secuencialmente, lee outputs JSON, inyecta contexto al siguiente dron
|
||||
- **Comando:** `./adn/tools/run dron lanzar --nota "Pipeline DASUTEN" -- ruby adn/tools/cli/drones/orquestador_pipeline.rb`
|
||||
|
||||
#### Estado Actual — Resultados Finales
|
||||
| Paso | Estado | Duración | Resultado |
|
||||
|------|--------|----------|-----------|
|
||||
| **8b.1** | ✅ Completado | 44.8s | Backup generado en `srvv-fenix` |
|
||||
| **8b.2** | ✅ Completado | 1736s (29 min) | Upload a Google Drive (1.4 GB) |
|
||||
| **8b.3** | ✅ Completado | ~5 min | Download HTTP directo en `dasu-sql4` |
|
||||
| **8b.4** | ✅ Completado | 248.79s (4 min) | Restore + DBCC CHECKDB — Integridad: **OK** |
|
||||
|
||||
**Pipeline completado exitosamente.** Base de datos `sysdasuten` ONLINE en `dasu-sql4` con datos actualizados al 2026-04-14.
|
||||
|
||||
#### Lecciones Técnicas — Google Drive Download
|
||||
- **Virus confirmation page:** Google Drive muestra página de confirmación para archivos >100MB. Se maneja extrayendo parámetros `id`, `uuid`, `confirm` del HTML y construyendo 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. Acceso recomendado vía relay SSH desde `srv-dasu` con `sshpass` + ProxyCommand.
|
||||
- **Base64 encoding:** Scripts PowerShell se codifican en base64 para transporte sobre SSH, evitando problemas de escaping UTF-8.
|
||||
|
||||
### ⏳ **FASE 9: Cierre del Proyecto** *(pendiente — tras resolver impresión)*
|
||||
|
||||
> **Contexto:** Una vez que la impresión funcione en la PC física y el sistema esté 100% operativo, se procede al cierre formal del proyecto.
|
||||
|
||||
- [ ] **9.1:** Validación final completa con usuaria (todos los flujos funcionales incluyendo impresión). ✅/❌
|
||||
- [ ] **9.2:** Reservar IPs fijas en router ISP para `dasu-sql4` y `dasu-pc` (evitar cambios por DHCP).
|
||||
- [ ] **9.3:** Apagado seguro de VMs legacy: VM 100 (DC), VM 101 (SQL dominio). Documentar estado final.
|
||||
- [ ] **9.4:** Actualizar informe ejecutivo (`docs/informes/2026-04_DASUTEN-migracion/01_informe_ejecutivo_DASUTEN.md`) a versión definitiva y elevar a autoridades.
|
||||
|
||||
---
|
||||
| **Red** | Privada 10.0.100.x (gw interno) | DHCP del ISP (gw del ISP) |
|
||||
| **Autenticación SQL** | Windows Integrated (Kerberos) | SQL Auth (mixta) |
|
||||
@@ -244,6 +345,8 @@ Crear dos VMs nuevas (SQL Server + PC cliente) en `srv-dasu`, instalar el sistem
|
||||
- **Python `http.server` NO soporta descargas grandes (~1GB+):** `Invoke-WebRequest` y `Net.WebClient.DownloadFile()` en PowerShell fallan con "conexión terminada inesperadamente" al descargar archivos de ~1.3GB desde `python3 -m http.server`. El módulo es single-threaded y no maneja correctamente respuestas chunked/grandes. **Solución**: instalar OpenSSH Server en la VM destino Windows y transferir vía SCP por la LAN (gigabit), que es nativo y confiable para archivos grandes.
|
||||
- **W-Zombi se bloquea en comandos largos:** Cuando el agente PS1 ejecuta un comando que tarda minutos (ej. `Add-WindowsCapability`), deja de pollear el relay. No se pierde — al terminar, reanuda automáticamente y recoge el siguiente comando en cola. No reiniciar el agente prematuramente.
|
||||
- **Scripts wrapper evitan problemas de escape con candados:** Para comandos con comillas complejas (ej. `smbclient -U "user%$PASS"`), crear un script `.sh` local con `File.write`, asignar `chmod 0755`, y pasarlo como argumento a `candados run`. Esto evita el doble/triple escape de comillas.
|
||||
- **Google Drive como medio de transferencia (2026-04-14):** Para evitar cadenas largas de SCP/SMB con Tailscale inestable, se usa Google Drive como intermediario. **Ventaja:** Download HTTP directo desde dasu-sql4 sin depender de Tailscale. **Desafío:** Archivos >100MB requieren confirmación de virus — se resuelve parseando HTML y extrayendo parámetros `id`, `uuid`, `confirm`.
|
||||
- **Arquitectura de Drones Atómicos Interconectados:** Cada paso del pipeline es un dron independiente que escribe su output en JSON (`/tmp/dron_*_output.json`). El orquestador lee estos JSONs para pasar contexto al siguiente dron. **Ventajas:** Re-ejecución de pasos individuales, observabilidad en Bitácora Web, acoplamiento mínimo.
|
||||
|
||||
## 🔗 Referencias
|
||||
|
||||
@@ -259,3 +362,5 @@ Crear dos VMs nuevas (SQL Server + PC cliente) en `srv-dasu`, instalar el sistem
|
||||
- **DHCP del ISP cambia IPs tras reboot:** `dasu-sql4` obtuvo `.11` en vez de `.26` tras el corte de luz. Verificar siempre la IP actual usando ARP + MAC antes de asumir que la IP anterior sigue vigente.
|
||||
- **W-Zombi no sobrevive reboots del agente:** El script PS1 debe re-lanzarse manualmente desde la consola Proxmox/noVNC tras un reinicio inesperado de la VM. Considerar crear una Scheduled Task.
|
||||
- **QEMU Guest Agent no inicia automáticamente:** Tras corte de luz, el servicio `QEMU-GA` quedó caído. Verificar que el servicio esté en `Automatic` startup.
|
||||
- **DASUTEN hardcodea ruta `C:\Sistema`:** El ejecutable VFP busca plantillas en `C:\Sistema\Word\` y `C:\Sistema\Excel\`, pero la instalación moderna las coloca en `C:\SysDasuten\Sistema\`. **Solución:** `mklink /D C:\Sistema C:\SysDasuten\Sistema` — el symlink es transparente para el ejecutable y no requiere modificación alguna del binario.
|
||||
- **OLE Automation Word es retrocompatible (Office 2010→2016):** `New-Object -ComObject Word.Application` funciona tanto con Office 14 (2010) como Office 16 (2016). La interfaz COM no cambió — no era necesario downgrade de Office.
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user