#!/usr/bin/env ruby # frozen_string_literal: true # Monitor de instalación SQL Server en dasu-sql4 vía W-Zombi # Ejecutar como dron: ./adn/tools/run dron lanzar --nota "Monitor SQL Install dasu-sql4" -- ruby adn/tools/scripts/dasuten_sql_monitor.rb require 'json' require 'fileutils' TELE_LOG = File.expand_path("../w-zombi/data/telemetria.log", __dir__) WZOMBI = File.expand_path("../w-zombi/bin/w-zombi", __dir__) def wzombi_cmd(cmd) system("ruby", WZOMBI, "cmd", cmd) end def last_result_for(id_prefix) lines = File.readlines(TELE_LOG, encoding: "utf-8") result_line = lines.reverse.find { |l| l.include?("RESULTADO [ID:#{id_prefix}]") } return nil unless result_line result_line end def wait_for_result(target_id, timeout: 600, interval: 30) elapsed = 0 loop do lines = File.readlines(TELE_LOG, encoding: "utf-8") result = lines.reverse.find { |l| l.include?("[ID:#{target_id}]") && (l.include?("RESULTADO") || l.include?("ERROR")) } if result puts "✅ Resultado detectado: #{result.strip}" return result end elapsed += interval if elapsed >= timeout puts "⏰ Timeout esperando resultado de ID:#{target_id} (#{timeout}s)" return nil end puts "⏳ Esperando resultado ID:#{target_id}... (#{elapsed}s/#{timeout}s)" sleep interval end end def get_last_id lines = File.readlines(TELE_LOG, encoding: "utf-8") ids = lines.grep(/EJECUTANDO \[ID:(\d+)\]/) { $1.to_i } ids.max end # === FASE 1: Esperar que termine la instalación SQL (ID:221) === puts "🔍 Fase 1: Esperando finalización de instalación SQL Server (ID:221)..." result = wait_for_result(221, timeout: 900, interval: 30) if result.nil? puts "❌ Timeout esperando instalación SQL. Abortando." exit 1 end if result.include?("ERROR") puts "❌ Error en instalación SQL: #{result.strip}" exit 1 end puts "✅ Instalación SQL completada." # === FASE 2: Abrir firewall === puts "\n🔥 Fase 2: Configurando regla de firewall para puerto 1433..." wzombi_cmd("New-NetFirewallRule -DisplayName SQL-Server -Direction Inbound -LocalPort 1433 -Protocol TCP -Action Allow -Enabled True") sleep 20 fw_id = get_last_id fw_result = wait_for_result(fw_id, timeout: 60) puts fw_result ? "✅ Firewall configurado." : "⚠️ Sin confirmación de firewall." # === FASE 3: Verificar servicio SQL === puts "\n🔍 Fase 3: Verificando servicio MSSQLSERVER..." wzombi_cmd("Get-Service MSSQLSERVER | Select-Object Status, StartType | ConvertTo-Json") sleep 20 svc_id = get_last_id svc_result = wait_for_result(svc_id, timeout: 60) if svc_result puts "✅ Estado del servicio SQL: #{svc_result.strip}" else puts "⚠️ No se pudo verificar el servicio." end # === FASE 4: Test sqlcmd === puts "\n🔍 Fase 4: Verificando login SA con sqlcmd..." wzombi_cmd('sqlcmd -S localhost -U sa -P UTNlarioja00DASU -Q "SELECT @@VERSION"') sleep 20 sql_id = get_last_id sql_result = wait_for_result(sql_id, timeout: 60) if sql_result puts "✅ SQL Server respondió: #{sql_result.strip}" else puts "⚠️ No se pudo verificar sqlcmd." end puts "\n🎯 === MONITOR COMPLETADO ===" puts "SQL Server 2019 instalado y verificado en dasu-sql4." puts "Próximo paso: transferir y restaurar sysdasuten_compressed_ADN.bak"