[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:
Ricardo Monla
2026-04-14 20:06:06 -03:00
parent bc1f42db1f
commit 892019fa22
59 changed files with 5438 additions and 42 deletions
@@ -0,0 +1,88 @@
#!/usr/bin/env ruby
# frozen_string_literal: true
# ==========================================================
# adn/tools/cli/drones/dasuten_upload_srv-ns8-drive.rb
# ==========================================================
# Dron: Upload a Google Drive desde srv-ns8
# Flujo: /var/tmp/sysdasuten_compressed_ADN.bak → Google Drive
# Entrada: Backup ya descargado en /var/tmp/
# Salida: URL de Google Drive
# ==========================================================
require 'time'
require 'json'
require 'shellwords'
REMOTE_DRIVE = "rmonla-GDrive:drive_bkps-dasu"
# Leer ruta del backup desde el output de la transferencia
TRANSFER_OUTPUT = '/tmp/dron_transfer_output.json'
if File.exist?(TRANSFER_OUTPUT)
output = JSON.parse(File.read(TRANSFER_OUTPUT))
BACKUP_LOCAL = output['backup_local']
BACKUP_NAME = File.basename(BACKUP_LOCAL)
puts "[*] Dron: Upload a Google Drive (DIFERENCIAL)"
else
BACKUP_LOCAL = "/var/tmp/sysdasuten_compressed_ADN.bak"
BACKUP_NAME = "sysdasuten_compressed_ADN_#{Time.now.strftime('%Y%m%d_%H%M%S')}.bak"
puts "[*] Dron: Upload a Google Drive (COMPLETO)"
end
puts " Nodo: srv-ns8"
puts " Origen: #{BACKUP_LOCAL}"
puts " Destino: #{REMOTE_DRIVE}/#{BACKUP_NAME}"
# Verificar archivo local
unless File.exist?(BACKUP_LOCAL)
puts "[!] Backup no encontrado en #{BACKUP_LOCAL}"
puts " Ejecutar primero: dasuten_transferir_srvv-fenix-srv-ns8.rb"
exit 1
end
tamaño_mb = (File.size(BACKUP_LOCAL) / 1024.0 / 1024.0).round(2)
puts "[+] Archivo local: #{tamaño_mb} MB"
begin
# Upload a Google Drive
puts "\n[1/2] Subiendo a Google Drive..."
start = Time.now
cmd_upload = "rclone copy '#{BACKUP_LOCAL}' '#{REMOTE_DRIVE}/#{BACKUP_NAME}' --progress -v 2>&1"
system(cmd_upload)
if $?.success?
duracion = (Time.now - start).round(2)
puts "[+] Upload completado en #{duracion} segundos"
else
puts "[!] Error en upload (código: #{$?.exitstatus})"
exit 1
end
# Verificar en Drive
puts "\n[2/2] Verificando archivo en Drive..."
cmd_verify = "rclone size '#{REMOTE_DRIVE}/#{BACKUP_NAME}' 2>/dev/null"
output = `#{cmd_verify}`.strip
puts " Tamaño en Drive: #{output}"
# Output para orquestador
resultado = {
paso: 'upload_complete',
drive_ruta: "#{REMOTE_DRIVE}/#{BACKUP_NAME}",
drive_url: "https://drive.google.com/drive/folders/1Tgrn2QYyWf0v0eyY1bSGCLlhiqhtIA2n",
nodo: 'srv-ns8',
duracion: duracion,
timestamp: Time.now.iso8601,
siguiente_paso: 'download_drive'
}
puts "\n✅ Upload completado"
puts " Output: #{resultado.to_json}"
File.write('/tmp/dron_upload_output.json', resultado.to_json)
rescue => e
puts "[!] Error fatal: #{e.message}"
exit 1
end