# frozen_string_literal: true # ========================================================== # dtic-BKPs - Automatic Backup Processor # ---------------------------------------------------------- # APP: dtic-BKPs # FILE: fxs/sync_rclone.rb # VERSION: v5.5.1 # AUTHOR: Ricardo MONLA (rmonla@) # LICENSE: MIT License # ========================================================== # Carga las constantes y helpers globales # require_relative '../core/globals' def sincronizar_rclone(tarea_cfg) system 'clear' or system 'cls' origen = tarea_cfg[:origen] destino = tarea_cfg[:destino] puts "\n#{NEGRITA}#{CIAN}--- #{tarea_cfg[:menu_texto]} ---#{RESET}" log :info, "#{tarea_cfg[:id]}: Iniciado rclone sync. Origen: #{origen}, Destino: #{destino}" # Get all subdirectories recursively subdirs = Dir.glob("#{origen}/**/*").select { |f| File.directory?(f) }.map { |d| d.sub("#{origen}/", '') } all_exito = true # Opciones base de rclone: # --delete-before: Borra origen del remoto ANTES de transferir, liberando espacio clave para respaldos grandes (Code 7 limits) # --retries 5 etc: Blindaje de conexión para archivos gigantescos hacia la nube. rclone_ops = "--delete-before --retries 5 --retries-sleep 10s --timeout 30m --contimeout 10m --tpslimit 10" # Execute rclone for each subdirectory subdirs.each do |subdir| comando_sub = "rclone sync #{Shellwords.escape(File.join(origen, subdir))} #{Shellwords.escape(File.join(destino, subdir))} --progress -v #{rclone_ops}" log :info, "#{tarea_cfg[:id]}: Ejecutando subdir #{subdir} → #{comando_sub}" puts "#{CIAN}→ Ejecutando rclone sync subdir (#{subdir})#{RESET}" exito_sub = system(comando_sub) if !exito_sub log :error, "#{tarea_cfg[:id]}: Fallo en sincronización subdir #{subdir}" puts "#{ICONO_ERROR} Fallo sincronización rclone subdir (#{subdir})." end all_exito &= exito_sub end # Execute rclone for the root directory comando_rclone = "rclone sync #{Shellwords.escape(origen)} #{Shellwords.escape(destino)} --progress -v #{rclone_ops}" log :info, "#{tarea_cfg[:id]}: Ejecutando root → #{comando_rclone}" puts "#{CIAN}→ Ejecutando rclone sync root (Origen: #{origen} → Destino: #{destino})#{RESET}" exito = system(comando_rclone) all_exito &= exito codigo_salida = $?.exitstatus estado_final = all_exito ? "Éxito" : "Fallo (cód: #{codigo_salida})" $estadisticas_ejecucion[:tareas_completadas][tarea_cfg[:id]] = { estado: estado_final } if all_exito log :info, "#{tarea_cfg[:id]}: Sincronización OK" puts "#{ICONO_OK} Sincronización rclone OK." else log :error, "#{tarea_cfg[:id]}: Fallo en sincronización (#{estado_final})" puts "#{ICONO_ERROR} Fallo sincronización rclone (#{estado_final})." end sleep 1.5 all_exito end