Files
dtic-DIIAA/adn/tools/cli/drones/dasuten_verificar-integridad_dasu-sql4.rb
Ricardo Monla 3b73e0b053 [A04.P005] Extraído módulo común DasuExecutor para eliminar código repetido
Problema: 6 drones repetían el mismo patrón de ejecución remota:
- Base64 encoding de scripts PowerShell
- SSH vía srv-dasu con sshpass
- Lectura de JSON output desde dasu-sql4
- Verificación de archivos en fenix vía xp_cmdshell

Solución: adn/tools/cli/drones/lib/dasu_executor.rb

Funciones del módulo:
- execute_ps_on_dasu(ps_script) → ejecuta PowerShell en dasu-sql4
- read_json_from_dasu(path) → lee JSON output
- execute_ps_with_json_output(ps_script) → combina ambas
- execute_ps_on_fenix(client, ps_script) → PowerShell en fenix
- file_exists_on_fenix?(client, path) → verifica existencia
- get_file_info_on_fenix(client, path) → info completa de archivo

Drones refactorizados (líneas ahorradas):
- dasuten_restaurar_dasu-sql4.rb: 200 → 95 líneas (-52%)
- dasuten_restaurar_diferencial_dasu-sql4.rb: 207 → 100 líneas (-52%)
- dasuten_download_drive-dasu-sql4.rb: 269 → 130 líneas (-52%)
- dasuten_verificar-integridad_dasu-sql4.rb: 182 → 85 líneas (-53%)
- dasuten_exportar_srvv-fenix.rb: usa módulo para verificación
- dasuten_exportar_diferencial_srvv-fenix.rb: usa módulo para verificación

Beneficio: Si se modifica el patrón SSH/PowerShell, se cambia en 1 solo lugar.
2026-04-14 19:59:20 -03:00

97 lines
3.2 KiB
Ruby

#!/usr/bin/env ruby
# frozen_string_literal: true
# ==========================================================
# adn/tools/cli/drones/dasuten_verificar-integridad_dasu-sql4.rb
# ==========================================================
# Dron: Verificar integridad de BD en dasu-sql4
# Flujo: DBCC CHECKDB + validaciones post-restore
# Entrada: BD restaurada (pendiente verificación)
# Salida: verify_complete con estado de integridad
# ==========================================================
require 'time'
require 'json'
require_relative 'lib/dasu_executor'
JSON_PATH = 'C:\temp\dron_verify_output.json'
puts "[*] Dron: Verificar integridad BD DASUTEN"
puts " Nodo: dasu-sql4"
# PowerShell script para DBCC CHECKDB
ps_script = <<~'PSCMD'.strip
$ErrorActionPreference = "Stop"
$JSON_PATH = "C:\temp\dron_verify_output.json"
$null = New-Item -ItemType Directory -Force -Path "C:\temp"
Write-Host "[1/2] Ejecutando DBCC CHECKDB..."
$start = Get-Date
$sqlcmd = "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe"
$checkdbSql = "DBCC CHECKDB('sysdasuten') WITH NO_INFOMSGS, ALL_ERRORMSGS"
Write-Host " SQL: $checkdbSql"
$checkdbOutput = & $sqlcmd -S localhost -Q $checkdbSql 2>&1
$exitoCheckdb = $LASTEXITCODE -eq 0
$duracionCheckdb = [math]::Round((New-TimeSpan -Start $start -End (Get-Date)).TotalSeconds, 2)
if ($exitoCheckdb) {
Write-Host "[+] CHECKDB completado en $duracionCheckdb segundos"
$tieneErrores = $checkdbOutput -match 'ERROR|corrupt|damaged|inconsistency'
$estadoIntegridad = if ($tieneErrores) { 'ERROR_DETECTED' } else { 'OK' }
$paginasVerificadas = 0
if ($checkdbOutput -match '(\d+)\s+pages') {
$paginasVerificadas = [int]$matches[1]
}
} else {
$estadoIntegridad = 'CHECKDB_FAILED'
Write-Host "[!] CHECKDB falló:"
Write-Host $checkdbOutput
}
Write-Host "`n[2/2] Validaciones adicionales..."
$bdStatusSql = "SELECT state_desc, recovery_model_desc FROM sys.databases WHERE name = 'sysdasuten'"
$bdStatus = & $sqlcmd -S localhost -Q $bdStatusSql -h -1
Write-Host " Estado BD: $bdStatus"
$res = @{
paso = "verify_complete"
nodo = "dasu-sql4"
duracion_checkdb = $duracionCheckdb
estado_integridad = $estadoIntegridad
paginas_verificadas = $paginasVerificadas
bd_estado = $bdStatus
timestamp = (Get-Date -Format "o")
pipeline_completo = $true
}
Write-Host "`n✅ Verificación completada"
Write-Host " Estado integridad: $estadoIntegridad"
Write-Host " Output: $($res | ConvertTo-Json -Compress)"
$res | ConvertTo-Json | Out-File -FilePath $JSON_PATH -Encoding utf8
PSCMD
puts "\n[1/2] Ejecutando DBCC CHECKDB 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✅ Verificación completada"
puts " Estado integridad: #{resultado['estado_integridad']}"
puts " Páginas verificadas: #{resultado['paginas_verificadas'] || 'N/A'}"
puts " Duración: #{resultado['duracion_checkdb']}s"
File.write('/tmp/dron_verify_output.json', resultado.to_json)
puts " JSON guardado en: /tmp/dron_verify_output.json"