|
|
|
@@ -0,0 +1,98 @@
|
|
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
|
|
require 'optparse'
|
|
|
|
|
require_relative '../core/colores'
|
|
|
|
|
|
|
|
|
|
module ADN
|
|
|
|
|
class SubcomandoDasuten
|
|
|
|
|
def initialize(args, logger)
|
|
|
|
|
@args = args
|
|
|
|
|
@logger = logger
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def ejecutar
|
|
|
|
|
if @args.empty? || @args[0] == 'help'
|
|
|
|
|
mostrar_ayuda
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
case @args[0]
|
|
|
|
|
when 'db:migrar'
|
|
|
|
|
migrar_db
|
|
|
|
|
else
|
|
|
|
|
puts "#{Color::RED}✗ Subcomando dasuten desconocido: #{@args[0]}#{Color::RESET}"
|
|
|
|
|
mostrar_ayuda
|
|
|
|
|
exit 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def mostrar_ayuda
|
|
|
|
|
puts "#{Color::BOLD}Herramientas de Mantenimiento DASUTEN#{Color::RESET}"
|
|
|
|
|
puts "Uso: ./adn/tools/run dasuten [comando]"
|
|
|
|
|
puts ""
|
|
|
|
|
puts "Comandos disponibles:"
|
|
|
|
|
puts " db:migrar Extraer último backup SMB y desplegar a dasu-sql2"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def run_cmd(description, node_user, cmd, vault_key=nil)
|
|
|
|
|
puts "#{Color::CYAN}▶ #{description}#{Color::RESET}"
|
|
|
|
|
system("ruby adn/tools/candados/candados.rb abrir") # just in case
|
|
|
|
|
vault_arg = vault_key ? vault_key : node_user
|
|
|
|
|
system("ruby adn/tools/candados/candados.rb run #{vault_arg} \"#{cmd}\"")
|
|
|
|
|
raise "Error ejecutando paso: #{description}" unless $?.success?
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def extract_password_for_node(node_user)
|
|
|
|
|
# Uses the actual value from candados!
|
|
|
|
|
out = `ruby adn/tools/candados/candados.rb show #{node_user}`
|
|
|
|
|
# The output of candados show prints real values, but if not we can use run!
|
|
|
|
|
# Actually candados.rb run passes $PASS inside the shell context automatically!
|
|
|
|
|
# We rely on candados.rb run injecting $PASS.
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def migrar_db
|
|
|
|
|
puts "#{Color::GREEN}=== INICIANDO EXTRACCION DE DB DASUTEN VIA ADN ===#{Color::RESET}"
|
|
|
|
|
|
|
|
|
|
# Step 1: Install tools on srv-dasu (proxmox host)
|
|
|
|
|
# srv-dasu defaults to root with sshpass or local proxmox configuration, but typically we have unar installed or use root
|
|
|
|
|
run_cmd("Aprovisionando unar en srv-dasu", "srv-dasu:root", "SSHPASS='\\$PASS' sshpass -e ssh -o StrictHostKeyChecking=no root@srv-dasu 'apt-get update && apt-get install -y unar'")
|
|
|
|
|
|
|
|
|
|
# Step 2: Download RAR locally (srv-ns8 has Fenix reachability)
|
|
|
|
|
cmd_smb = "smbclient //10.0.10.200/BK_SQL -U \"monlaricardo%\\$PASS\" -W UTNlarioja -c 'cd 30-03-26; lcd /tmp; get bksysdasuten_Full_260330.rar'"
|
|
|
|
|
run_cmd("Descargando RAR comprimido localmente (SrvNS8)", "dominio-utnlarioja.intranet:monlaricardo", cmd_smb)
|
|
|
|
|
|
|
|
|
|
# Step 3: Transfer compressed RAR to srv-dasu (900MB limit over Tailscale instead of 9GB!)
|
|
|
|
|
scp_rar = "SSHPASS='\\$PASS' sshpass -e scp -o StrictHostKeyChecking=no /tmp/bksysdasuten_Full_260330.rar root@srv-dasu:/var/tmp/bksysdasuten_Full_260330.rar"
|
|
|
|
|
run_cmd("Transfiriendo RAR comprimido hacia srv-dasu", "srv-dasu:root", scp_rar)
|
|
|
|
|
|
|
|
|
|
# Step 4: Unzip on srv-dasu (Host bridge)
|
|
|
|
|
run_cmd("Descomprimiendo RAR de 9GB en srv-dasu", "srv-dasu:rmonla", "ssh -o StrictHostKeyChecking=no srv-dasu 'cd /var/tmp && unar -f bksysdasuten_Full_260330.rar'")
|
|
|
|
|
|
|
|
|
|
# Step 5: SCP extracted back to dasu-sql2 (Requires dasu-sql2 password)
|
|
|
|
|
scp_cmd = "ssh -o StrictHostKeyChecking=no srv-dasu \\\"SSHPASS='\\$PASS' sshpass -e scp -o StrictHostKeyChecking=no -P 7022 /var/tmp/bksysdasuten_Full Administrador@192.168.1.14:C:/Users/Administrador/bksysdasuten.bak\\\""
|
|
|
|
|
run_cmd("Transfiriendo a dasu-sql2 (Escudo local Gigabit)", "dasu-sql2:Administrator", scp_cmd)
|
|
|
|
|
|
|
|
|
|
# Step 6: Create and SCP SQL script to avoid nested shell escaping issues
|
|
|
|
|
restore_query = <<~SQL
|
|
|
|
|
RESTORE DATABASE [sysdasuten] FROM DISK=N'C:\\bksysdasuten.bak' WITH REPLACE, MOVE N'sysdasuten_Data' TO N'C:\\Program Files\\Microsoft SQL Server\\MSSQL15.MSSQLSERVER\\MSSQL\\DATA\\sysdasuten.mdf', MOVE N'sysdasuten_Log' TO N'C:\\Program Files\\Microsoft SQL Server\\MSSQL15.MSSQLSERVER\\MSSQL\\DATA\\sysdasuten_log.ldf'
|
|
|
|
|
SQL
|
|
|
|
|
File.write("/tmp/dasuten_restore.sql", restore_query)
|
|
|
|
|
run_cmd("Copiando script SQL local a srv-dasu", "srv-dasu:root", "scp -o StrictHostKeyChecking=no /tmp/dasuten_restore.sql root@srv-dasu:/tmp/dasuten_restore.sql")
|
|
|
|
|
|
|
|
|
|
scp_sql_cmd = "ssh -o StrictHostKeyChecking=no srv-dasu \\\"SSHPASS='\\$PASS' sshpass -e scp -o StrictHostKeyChecking=no -P 7022 /tmp/dasuten_restore.sql Administrador@192.168.1.14:C:/Users/Administrador/restore.sql\\\""
|
|
|
|
|
run_cmd("Transfiriendo script SQL a dasu-sql2", "dasu-sql2:Administrator", scp_sql_cmd)
|
|
|
|
|
|
|
|
|
|
ps_command = "powershell.exe -Command \\\\\\\"Move-Item -Path C:\\\\Users\\\\Administrador\\\\bksysdasuten.bak -Destination C:\\\\bksysdasuten.bak -Force; Remove-Item Env:\\\\SQLCMDUSER -ErrorAction SilentlyContinue; Remove-Item Env:\\\\SQLCMDPASSWORD -ErrorAction SilentlyContinue; sqlcmd.exe -S localhost -E -i C:\\\\Users\\\\Administrador\\\\restore.sql\\\\\\\""
|
|
|
|
|
ssh_restore = "ssh -o StrictHostKeyChecking=no srv-dasu \\\"SSHPASS='\\$PASS' sshpass -e ssh -o StrictHostKeyChecking=no -p 7022 Administrador@192.168.1.14 '#{ps_command}'\\\""
|
|
|
|
|
run_cmd("Restaurando SQL DB en dasu-sql2", "dasu-sql2:Administrator", ssh_restore)
|
|
|
|
|
|
|
|
|
|
# Step 7: Cleanup
|
|
|
|
|
run_cmd("Limpieza Local", "srv-dasu:rmonla", "rm -f /tmp/bksysdasuten_Full_260330.rar")
|
|
|
|
|
run_cmd("Limpieza Remota", "srv-dasu:rmonla", "ssh -o StrictHostKeyChecking=no srv-dasu \\\"rm -rf /var/tmp/bksysdasuten_Full_260330.rar /var/tmp/bksysdasuten_Full\\\"")
|
|
|
|
|
|
|
|
|
|
puts "#{Color::GREEN}=== MIGRACION COMPLETADA CON EXITO ===#{Color::RESET}"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|