#!/usr/bin/env ruby # frozen_string_literal: true # ========================================================== # adn/tools/cli/drones/dasuten_upload_srv-ns8-drive.rb # ========================================================== # Dron: Upload a Google Drive desde srv-ns8 # Flujo: /var/tmp/sysdasuten_compressed_ADN.bak → Google Drive # Entrada: Backup ya descargado en /var/tmp/ # Salida: URL de Google Drive # ========================================================== require 'time' require 'json' require 'shellwords' REMOTE_DRIVE = "rmonla-GDrive:drive_bkps-dasu" # Archivos de output de los pasos anteriores TRANSFER_OUTPUT = '/tmp/dron_transfer_output.json' EXPORT_OUTPUT = '/tmp/dron_export_output.json' # Determinar cuál es el más reciente (si existen) archivos_output = [TRANSFER_OUTPUT, EXPORT_OUTPUT].select { |f| File.exist?(f) } output_reciente = archivos_output.max_by { |f| File.mtime(f) } if output_reciente == TRANSFER_OUTPUT output = JSON.parse(File.read(TRANSFER_OUTPUT)) BACKUP_LOCAL = output['backup_local'] || output['backup_ruta_unix'] BACKUP_NAME = File.basename(BACKUP_LOCAL) puts "[*] Dron: Upload a Google Drive (Desde TRANSFERENCIA)" elsif output_reciente == EXPORT_OUTPUT output = JSON.parse(File.read(EXPORT_OUTPUT)) BACKUP_LOCAL = output['backup_ruta_unix'] BACKUP_NAME = File.basename(BACKUP_LOCAL) puts "[*] Dron: Upload a Google Drive (Desde EXPORTACIÓN DIRECTA)" else BACKUP_LOCAL = "/var/tmp/sysdasuten_compressed_ADN.bak" BACKUP_NAME = "sysdasuten_compressed_ADN_#{Time.now.strftime('%Y%m%d_%H%M%S')}.bak" puts "[*] Dron: Upload a Google Drive (COMPLETO FALLBACK)" end puts " Nodo: srv-ns8" puts " Origen: #{BACKUP_LOCAL}" puts " Destino: #{REMOTE_DRIVE}/#{BACKUP_NAME}" # Verificar archivo local unless File.exist?(BACKUP_LOCAL) puts "[!] Backup no encontrado en #{BACKUP_LOCAL}" puts " Ejecutar primero: dasuten_transferir_srvv-fenix-srv-ns8.rb" exit 1 end tamaño_mb = (File.size(BACKUP_LOCAL) / 1024.0 / 1024.0).round(2) puts "[+] Archivo local: #{tamaño_mb} MB" begin # Upload a Google Drive puts "\n[1/2] Subiendo a Google Drive..." start = Time.now cmd_upload = "rclone copy '#{BACKUP_LOCAL}' '#{REMOTE_DRIVE}/#{BACKUP_NAME}' --progress -v 2>&1" system(cmd_upload) if $?.success? duracion = (Time.now - start).round(2) puts "[+] Upload completado en #{duracion} segundos" else puts "[!] Error en upload (código: #{$?.exitstatus})" exit 1 end # Verificar en Drive puts "\n[2/2] Verificando archivo en Drive..." cmd_verify = "rclone size '#{REMOTE_DRIVE}/#{BACKUP_NAME}' 2>/dev/null" output = `#{cmd_verify}`.strip puts " Tamaño en Drive: #{output}" # Output para orquestador resultado = { paso: 'upload_complete', drive_ruta: "#{REMOTE_DRIVE}/#{BACKUP_NAME}", drive_url: "https://drive.google.com/drive/folders/1Tgrn2QYyWf0v0eyY1bSGCLlhiqhtIA2n", nodo: 'srv-ns8', duracion: duracion, timestamp: Time.now.iso8601, siguiente_paso: 'download_drive' } puts "\n✅ Upload completado" puts " Output: #{resultado.to_json}" File.write('/tmp/dron_upload_output.json', resultado.to_json) rescue => e puts "[!] Error fatal: #{e.message}" exit 1 end