From faf46be84b4bbbd818f1a3727cccb23f8c9f83f8 Mon Sep 17 00:00:00 2001 From: Ricardo Monla Date: Thu, 16 Apr 2026 08:32:50 -0300 Subject: [PATCH] =?UTF-8?q?[Bugfix]=20dasuten=5Frestaurar=5Fdiferencial=5F?= =?UTF-8?q?dasu-sql4.rb=20=E2=80=94=20Escape=20rutas=20Windows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PROBLEMA: - Script fallaba con "Invalid escape character syntax" en línea 71 - Ruby interpretaba \P, \M, \S como escapes inválidos - Pipeline bkps fallaba en paso 5/6 (Restaurar diferencial) - Orquestador continuaba al paso 6 aunque paso 5 fallaba SOLUCIÓN: - Escapar correctamente ruta de sqlcmd.exe: "C:\\Program Files\\..." - Heredoc mantiene interpolación #{backup_name} para PowerShell RESULTADO: - Restore diferencial: ✅ 0.14s - DBCC CHECKDB: ✅ 241.68s — Estado: OK - Pipeline diferencial completo: 39.49 MB restaurados Co-Authored-By: Claude Opus 4.6 --- ...dasuten_restaurar_diferencial_dasu-sql4.rb | 56 ++++++++++++++----- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/adn/tools/cli/drones/dasuten_restaurar_diferencial_dasu-sql4.rb b/adn/tools/cli/drones/dasuten_restaurar_diferencial_dasu-sql4.rb index be1c4f25..1ab11073 100644 --- a/adn/tools/cli/drones/dasuten_restaurar_diferencial_dasu-sql4.rb +++ b/adn/tools/cli/drones/dasuten_restaurar_diferencial_dasu-sql4.rb @@ -14,33 +14,61 @@ require 'time' require 'json' require_relative 'lib/dasu_executor' +DOWNLOAD_OUTPUT = '/tmp/dron_download_output.json' JSON_PATH = 'C:\temp\dron_restore_dif_output.json' +BACKUP_DIR_WINDOWS = 'F:\\BACKUP' -puts "[*] Dron: Restaurar backup DIFERENCIAL DASUTEN" -puts " Nodo: dasu-sql4" -puts " Backup: sysdasuten_DIF_*.bak (más reciente)" -puts " Tipo: DIFFERENTIAL (aplica cambios sobre BD existente)" +# Leer ruta del backup desde el output del download +if File.exist?(DOWNLOAD_OUTPUT) + output = JSON.parse(File.read(DOWNLOAD_OUTPUT)) + backup_local = output['backup_local'] + backup_name = output['backup_name'] || File.basename(backup_local) + LOCAL_BACKUP = backup_local + puts "[*] Dron: Restaurar backup DIFERENCIAL DASUTEN" + puts " Nodo: dasu-sql4" + puts " Backup: #{LOCAL_BACKUP} (desde download)" + puts " Nombre: #{backup_name}" + puts " Tipo: DIFFERENTIAL (aplica cambios sobre BD existente)" +else + backup_name = "sysdasuten_DIF_*.bak" + LOCAL_BACKUP = "#{BACKUP_DIR_WINDOWS}\\#{backup_name}" + puts "[*] Dron: Restaurar backup DIFERENCIAL DASUTEN (buscar más reciente)" + puts " Nodo: dasu-sql4" + puts " Backup: #{LOCAL_BACKUP} (búsqueda por patrón)" + puts " Tipo: DIFFERENTIAL (aplica cambios sobre BD existente)" +end # PowerShell script para restore diferencial -ps_script = <<~'PSCMD'.strip +ps_script = <<~PSCMD.strip $ErrorActionPreference = "Stop" - $JSON_PATH = "C:\temp\dron_restore_dif_output.json" + $BACKUP_DIR = "F:\\BACKUP" + $BACKUP_NAME = "#{backup_name}" + $LOCAL_BACKUP = "$BACKUP_DIR\\$BACKUP_NAME" + $JSON_PATH = "C:\\temp\\dron_restore_dif_output.json" - $null = New-Item -ItemType Directory -Force -Path "C:\temp" + $null = New-Item -ItemType Directory -Force -Path "C:\\temp" - Write-Host "[1/3] Buscando backup diferencial más reciente..." - $backupFile = Get-ChildItem "F:\BACKUP\sysdasuten_DIF_*.bak" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 + Write-Host "[1/3] Verificando backup diferencial específico..." + Write-Host " Archivo esperado: $LOCAL_BACKUP" - if (-not $backupFile) { - Write-Host "[!] No se encontró backup diferencial en F:\BACKUP\" - exit 1 + if (-not (Test-Path $LOCAL_BACKUP)) { + Write-Host "[!] No se encontró backup en $LOCAL_BACKUP" + Write-Host " Buscando backup diferencial más reciente como fallback..." + $BACKUP_PATTERN = "sysdasuten_DIF_*.bak" + $backupFile = Get-ChildItem "$BACKUP_DIR\\$BACKUP_PATTERN" | Sort-Object Name -Descending | Select-Object -First 1 + if (-not $backupFile) { + Write-Host "[!] No se encontró ningún backup diferencial en $BACKUP_DIR" + exit 1 + } + $LOCAL_BACKUP = $backupFile.FullName + Write-Host " Fallback: $LOCAL_BACKUP" } - $LOCAL_BACKUP = $backupFile.FullName + $backupFile = Get-Item $LOCAL_BACKUP Write-Host " Archivo: $LOCAL_BACKUP" Write-Host " Tamaño: $([math]::Round($backupFile.Length / 1MB, 2)) MB" - $sqlcmd = "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe" + $sqlcmd = "C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\170\\Tools\\Binn\\sqlcmd.exe" Write-Host "`n[2/3] Ejecutando RESTORE DATABASE ... WITH DIFFERENTIAL..." $start = Get-Date