#!/usr/bin/env ruby # frozen_string_literal: true # ========================================================== # adn/tools/cli/drones/dasuten_restaurar_dasu-sql4.rb # ========================================================== # Dron: Restaurar backup en dasu-sql4 # Flujo: RESTORE DATABASE (sin DBCC CHECKDB) # Entrada: Backup en F:\BACKUP\ # Salida: restore_complete (listo para verificación) # ========================================================== require 'time' require 'json' require_relative 'lib/dasu_executor' DOWNLOAD_OUTPUT = '/tmp/dron_download_output.json' BACKUP_DIR_WINDOWS = 'F:\\BACKUP' JSON_PATH = 'C:\temp\dron_restore_output.json' # 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 = File.basename(backup_local) LOCAL_BACKUP = "#{BACKUP_DIR_WINDOWS}\\#{backup_name}" puts "[*] Dron: Restaurar backup DASUTEN" else LOCAL_BACKUP = "#{BACKUP_DIR_WINDOWS}\\sysdasuten_FULL_*.bak" puts "[*] Dron: Restaurar backup DASUTEN (buscar más reciente)" end puts " Nodo: dasu-sql4" puts " Backup: #{LOCAL_BACKUP}" # PowerShell script para restore ps_script = <<~'PSCMD'.strip $ErrorActionPreference = "Stop" $BACKUP_DIR = "F:\BACKUP" $BACKUP_PATTERN = "sysdasuten_FULL_*.bak" $JSON_PATH = "C:\temp\dron_restore_output.json" $null = New-Item -ItemType Directory -Force -Path "C:\temp" Write-Host "[0/1] Buscando backup completo más reciente..." $backupFile = Get-ChildItem "$BACKUP_DIR\$BACKUP_PATTERN" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if (-not $backupFile) { Write-Host "[!] No se encontró backup completo en $BACKUP_DIR" exit 1 } $LOCAL_BACKUP = $backupFile.FullName Write-Host " Archivo: $LOCAL_BACKUP" Write-Host " Tamaño: $([math]::Round($backupFile.Length / 1MB, 2)) MB" Write-Host "[1/1] Ejecutando RESTORE DATABASE..." $start = Get-Date $sqlcmd = "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe" $restoreSql = @" RESTORE DATABASE sysdasuten FROM DISK = '$LOCAL_BACKUP' WITH REPLACE, MOVE 'sysdasuten' TO 'F:\DATA\sysdasuten.mdf', MOVE 'sysdasuten_log' TO 'F:\LOG\sysdasuten_log.ldf' "@ Write-Host " SQL: $restoreSql" $restoreOutput = & $sqlcmd -S localhost -Q $restoreSql 2>&1 $exitoRestore = $LASTEXITCODE -eq 0 $duracionRestore = [math]::Round((New-TimeSpan -Start $start -End (Get-Date)).TotalSeconds, 2) if (-not $exitoRestore) { Write-Host "[!] Error en restore:" Write-Host $restoreOutput exit 1 } Write-Host "[+] Restore completado en $duracionRestore segundos" $res = @{ paso = "restore_complete" backup_ruta = $LOCAL_BACKUP nodo = "dasu-sql4" duracion_total = $duracionRestore duracion_restore = $duracionRestore estado_integridad = "PENDING_CHECKDB" timestamp = (Get-Date -Format "o") siguiente_paso = "verificar_integridad" } Write-Host "`n✅ Restauración completada (pendiente CHECKDB)" Write-Host " Output: $($res | ConvertTo-Json -Compress)" $res | ConvertTo-Json | Out-File -FilePath $JSON_PATH -Encoding utf8 PSCMD puts "\n[1/2] Ejecutando restore en dasu-sql4..." DasuExecutor.execute_ps_on_dasu(ps_script, output_path: JSON_PATH) puts "\n[2/2] Leyendo output JSON..." resultado = DasuExecutor.read_json_from_dasu(JSON_PATH) puts " Output: #{resultado.to_json}" puts "\n✅ Restauración completada" puts " Backup: #{resultado['backup_ruta']}" puts " Estado: #{resultado['estado_integridad']}" puts " Duración: #{resultado['duracion_total']}s" File.write('/tmp/dron_restore_output.json', resultado.to_json) puts " JSON guardado en: /tmp/dron_restore_output.json"