Files
dtic-DIIAA/adn/tools/cli/drones/dasuten_restaurar_dasu-sql4.rb

127 lines
4.3 KiB
Ruby

#!/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"