Files
dtic-DIIAA/dtic-BKPs/lib/proc_xen.rb
T

86 lines
2.7 KiB
Ruby

# frozen_string_literal: true
# ==========================================================
# dtic-BKPs/lib/proc_xen.rb — Procesador de backups XEN (.xva)
# ==========================================================
require 'shellwords'
require 'open3'
require 'fileutils'
module DTICBKPs
module Procesador
class Xen
def initialize(log)
@log = log
@pv = system('which pv > /dev/null 2>&1')
end
def ejecutar(tarea)
@log.titulo(tarea[:texto])
@log.info("#{tarea[:id]}: Origen: #{tarea[:origen]}")
archivos = Dir.glob(File.join(tarea[:origen], '*.xva'))
if archivos.empty?
@log.warn("#{tarea[:id]}: Sin archivos .xva en origen.")
return true
end
@log.info("Encontrados #{archivos.length} archivo(s) .xva.")
procesados = 0
archivos.each do |ruta_xva|
nombre_xva = File.basename(ruta_xva)
nombre_vm = nombre_xva.split('_').first
dir_dest = File.join(tarea[:destino], nombre_vm)
FileUtils.mkdir_p(dir_dest)
nombre_sin_ext = File.basename(nombre_xva, '.xva')
ruta_tar = File.join(dir_dest, "#{nombre_sin_ext}.tar.gz")
if File.exist?(ruta_tar)
if tarea[:sobrescribir]
@log.warn("#{File.basename(ruta_tar)} existe. Sobrescribiendo.")
else
@log.warn("#{File.basename(ruta_tar)} existe. Saltando.")
next
end
end
begin
@log.paso("Comprimiendo #{nombre_xva}")
if @pv
cmd_tar = ['tar', '-czf', '-', '-C', tarea[:origen], nombre_xva]
cmd_pv = ['pv', '-s', File.size(ruta_xva).to_s]
File.open(ruta_tar, 'wb') do |f|
Open3.pipeline(cmd_tar, cmd_pv, out: f).each_with_index do |s, i|
raise "Falló #{%w[tar pv][i]} (#{s.exitstatus})" unless s.success?
end
end
else
cmd = "tar -czf #{Shellwords.escape(ruta_tar)} -C #{Shellwords.escape(tarea[:origen])} #{Shellwords.escape(nombre_xva)}"
system(cmd) or raise "tar falló (#{$?.exitstatus})"
end
@log.ok("Compresión OK: #{File.basename(ruta_tar)}")
if tarea[:eliminar_origen]
FileUtils.rm_f(ruta_xva)
@log.info("XVA original eliminado.")
end
procesados += 1
rescue => e
@log.error("#{tarea[:id]}: Error comprimiendo #{nombre_xva}: #{e.message}")
FileUtils.rm_f(ruta_tar)
end
end
@log.ok("#{procesados} archivos .xva procesados.")
true
end
end
end
end