Files
dtic-DIIAA/tools/dtic-BKPs/fxs/sync_rclone.rb
T

70 lines
2.8 KiB
Ruby

# 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