#!/usr/bin/env ruby # frozen_string_literal: true # ========================================================== # adn/tools/cli/drones/dasuten_transferir_srvv-fenix-srv-ns8.rb # ========================================================== # Dron: Transferencia SMB desde srvv-fenix a srv-ns8 # Flujo: srvv-fenix (E:\BK_SQL\) → srv-ns8 (/var/tmp/) # Usa: smbclient con credenciales de candados # ========================================================== require 'time' require 'json' require 'shellwords' require 'pathname' # Ruta por defecto (backup completo) BACKUP_REMOTO_DEFAULT = "sysdasuten_compressed_ADN.bak" BACKUP_LOCAL_DEFAULT = "/var/tmp/sysdasuten_compressed_ADN.bak" # Si existe output del dron anterior (export o export_dif), leer la ruta EXPORT_OUTPUT_FILE = '/tmp/dron_export_output.json' EXPORT_DIF_OUTPUT_FILE = '/tmp/dron_export_dif_output.json' backup_remoto_name = BACKUP_REMOTO_DEFAULT backup_local = BACKUP_LOCAL_DEFAULT if File.exist?(EXPORT_DIF_OUTPUT_FILE) output = JSON.parse(File.read(EXPORT_DIF_OUTPUT_FILE)) if output['backup_ruta'] # Extraer solo el nombre del archivo de la ruta completa (E:\BK_SQL\archivo.bak) # Usar split para manejar tanto backslashes como forward slashes backup_remoto_name = output['backup_ruta'].split(/[\\\/]/).last backup_local = "/var/tmp/#{backup_remoto_name}" puts "[*] Dron: Transferencia SMB srvv-fenix → srv-ns8 (DIFERENCIAL)" end elsif File.exist?(EXPORT_OUTPUT_FILE) output = JSON.parse(File.read(EXPORT_OUTPUT_FILE)) if output['backup_ruta'] backup_remoto_name = output['backup_ruta'].split(/[\\\/]/).last backup_local = "/var/tmp/#{backup_remoto_name}" puts "[*] Dron: Transferencia SMB srvv-fenix → srv-ns8 (COMPLETO)" end end BACKUP_SERVER = "//10.0.10.200/BK_SQL" BACKUP_FILE = backup_remoto_name # Directorio de destino en srv-ns8 (compartido para backups DASUTEN) # Nota: Este directorio está expuesto vía Samba para acceso desde srvv-fenix BACKUP_NS8_DIR = "/mnt/ns8Disco2/bkps-dasuten" puts "[*] Dron: Transferencia SMB srvv-fenix → srv-ns8" puts " Share: #{BACKUP_SERVER}" puts " Archivo: #{BACKUP_FILE}" puts " Destino: #{backup_local}" begin # Autorizar candados primero system("ruby adn/tools/candados/candados.rb authorize >/dev/null 2>&1") # Obtener credencial de candados pass_cmd = "ruby adn/tools/candados/candados.rb get utnlarioja.intranet:monlaricardo 2>/dev/null" pass = `#{pass_cmd}`.strip if pass.empty? puts "[!] No se pudo obtener credencial de candados" exit 1 end # Transferencia SMB puts "\n[1/2] Descargando vía SMB..." start = Time.now # Escapar contraseña para smbclient (evitar problemas con $ y caracteres especiales) pass_escaped = pass.gsub('$', '\\$') cmd_smb = "smbclient #{BACKUP_SERVER} -U \"monlaricardo%#{pass_escaped}\" -W UTNlarioja -c \"lcd /var/tmp; get #{BACKUP_FILE}\" 2>&1" system(cmd_smb) if $?.success? duracion = (Time.now - start).round(2) puts "[+] Transferencia completada en #{duracion} segundos" else puts "[!] Error en transferencia SMB (código: #{$?.exitstatus})" exit 1 end # Verificar archivo local puts "\n[2/2] Verificando archivo..." if File.exist?(backup_local) tamaño_mb = (File.size(backup_local) / 1024.0 / 1024.0).round(2) puts "[+] Archivo verificado: #{tamaño_mb} MB" puts " Nota: Para copiar al share SMB, ejecutar desde srvv-fenix:" puts " net use X: \\\\10.0.10.8\\bkps-dasuten /user:rmonla " puts " copy #{backup_local} X:\\#{backup_remoto_name}" else puts "[!] Archivo no encontrado en destino" exit 1 end # Output para orquestador resultado = { paso: 'transfer_complete', backup_local: backup_local, backup_ns8_share: "#{BACKUP_NS8_DIR}/#{backup_remoto_name}", nodo: 'srv-ns8', duracion: duracion, timestamp: Time.now.iso8601, siguiente_paso: 'upload_drive' } puts "\n✅ Transferencia completada" puts " Output: #{resultado.to_json}" File.write('/tmp/dron_transfer_output.json', resultado.to_json) rescue => e puts "[!] Error fatal: #{e.message}" exit 1 end