#!/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 = output['backup_name'] || File.basename(backup_local) LOCAL_BACKUP = backup_local # Usar la ruta EXACTA que viene del download puts "[*] Dron: Restaurar backup DASUTEN" puts " Nodo: dasu-sql4" puts " Backup: #{LOCAL_BACKUP} (desde download)" puts " Nombre: #{backup_name}" else LOCAL_BACKUP = "#{BACKUP_DIR_WINDOWS}\\sysdasuten_FULL_*.bak" puts "[*] Dron: Restaurar backup DASUTEN (buscar más reciente)" puts " Nodo: dasu-sql4" puts " Backup: #{LOCAL_BACKUP} (búsqueda por patrón)" end # PowerShell script para restore ps_script = <<~PSCMD.strip $ErrorActionPreference = "Stop" $BACKUP_DIR = "F:\\BACKUP" $BACKUP_NAME = "#{backup_name}" $LOCAL_BACKUP = "$BACKUP_DIR\\$BACKUP_NAME" $JSON_PATH = "C:\\temp\\dron_restore_output.json" $null = New-Item -ItemType Directory -Force -Path "C:\\temp" Write-Host "[0/1] Verificando backup específico..." Write-Host " Archivo esperado: $LOCAL_BACKUP" if (-not (Test-Path $LOCAL_BACKUP)) { Write-Host "[!] No se encontró backup en $LOCAL_BACKUP" Write-Host " Buscando backup más reciente como fallback..." $BACKUP_PATTERN = "sysdasuten_FULL_*.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 en $BACKUP_DIR" exit 1 } $LOCAL_BACKUP = $backupFile.FullName Write-Host " Fallback: $LOCAL_BACKUP" } $backupFile = Get-Item $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 backup_name = $BACKUP_NAME 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"