From 2acf1cd416963601f84788f03171219d6d31725f Mon Sep 17 00:00:00 2001 From: Ricardo Monla Date: Mon, 23 Feb 2026 20:07:05 -0300 Subject: [PATCH] feat(dtic-BKPs): auto-relaunch inside GNU screen --- adn/01_ontologia.md | 1 + tools/dtic-BKPs/dtic-BKPs_app.rb | 22 +++++++++++++++++++++- tools/dtic-BKPs/fxs/proc_syncPmox.rb | 21 ++++++++++++++------- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/adn/01_ontologia.md b/adn/01_ontologia.md index 0f0c26d3..eefbdcad 100644 --- a/adn/01_ontologia.md +++ b/adn/01_ontologia.md @@ -71,6 +71,7 @@ Facultad Regional La Rioja | :--- | :--- | :--- | | **[cam-hikvision-24](../nodos/cam-hikvision-24.md)** | `10.0.10.24` | Cámara / DVR | | **[pc-dasu0](../nodos/pc-dasu0.md)** | Oficina DASUTEN | Win10 Físico (Ryzen 5) | +| **[srv-dasu](../nodos/srv-dasu.md)** | Oficina DASUTEN | Proxmox VE Físico (Standalone) | --- diff --git a/tools/dtic-BKPs/dtic-BKPs_app.rb b/tools/dtic-BKPs/dtic-BKPs_app.rb index 33cc2508..cd5f7941 100755 --- a/tools/dtic-BKPs/dtic-BKPs_app.rb +++ b/tools/dtic-BKPs/dtic-BKPs_app.rb @@ -213,7 +213,27 @@ end # --- Inicio del Script --- Signal.trap("INT") { puts "\n#{ROJO}Ctrl+C detectado. Saliendo...#{RESET}"; log :warn, "Script interrumpido (Ctrl+C)."; exit 130; } -log :info, "===== Inicio script #{APP_NOM} #{APP_VER} =====" + +# === AUTO-SCREEN WRAPPER === +# Verificamos si ya estamos dentro de una sesión de GNU Screen +unless ENV['TERM'] == 'screen' || ENV['TERM'] =~ /^screen/ || ENV['STY'] + puts "\n#{CIAN}ℹ Relanzando dtic-BKPs en una sesión separada (screen) para permitir desatención...#{RESET}" + + # Construimos el comando original con sus argumentos + comando_original = [$PROGRAM_NAME] + ARGV + comando_escapado = comando_original.map { |arg| Shellwords.escape(arg) }.join(' ') + + # Nombre de sesión dinámico + nombre_sesion = "dticBKPs_#{Time.now.strftime('%H%M%S')}" + + puts "Para reconectarte luego, usa: #{AMARILLO}screen -r #{nombre_sesion}#{RESET}" + sleep 2 + + # Reemplaza el proceso actual por screen ejecutando este mismo script + exec('screen', '-S', nombre_sesion, 'bash', '-c', "#{comando_escapado}; echo ''; read -p 'Presiona Enter para cerrar la sesión...'") +end + +log :info, "===== Inicio script #{APP_NOM} #{APP_VER} (en Screen) =====" tareas_config, comandos_config, auto_avanzar = cargar_configuracion diff --git a/tools/dtic-BKPs/fxs/proc_syncPmox.rb b/tools/dtic-BKPs/fxs/proc_syncPmox.rb index 16c83956..23688005 100644 --- a/tools/dtic-BKPs/fxs/proc_syncPmox.rb +++ b/tools/dtic-BKPs/fxs/proc_syncPmox.rb @@ -98,15 +98,22 @@ def procesar_backups_tipo_proxmox(tarea_cfg) archivos_fuente_del_backup = Dir.glob(File.join(dir_origen, "#{nombre_base_log}*")) ruta_notes = archivos_fuente_del_backup.find { |f| f.end_with?('.notes') } - unless ruta_notes - log :warn, "#{tarea_cfg[:id]}: No se encontró el archivo .notes para '#{nombre_base_log}'. Saltando." - next + nombre_vm = nil + + if ruta_notes + nombre_vm = File.read(ruta_notes).strip end - nombre_vm = File.read(ruta_notes).strip - if nombre_vm.empty? - log :warn, "#{tarea_cfg[:id]}: El archivo .notes para '#{nombre_base_log}' está vacío. Saltando." - next + if nombre_vm.nil? || nombre_vm.empty? + # Fallback: extraemos el ID de la VM del nombre de archivo (ej. vzdump-qemu-101-...) + regex_match = nombre_base_log.match(/vzdump-(?:qemu|lxc)-(\d+)-/) + if regex_match + nombre_vm = "VM-#{regex_match[1]}" + log :info, "#{tarea_cfg[:id]}: Sin .notes válido para '#{nombre_base_log}'. Respaldo asignado a: #{nombre_vm}" + else + log :warn, "#{tarea_cfg[:id]}: No se pudo determinar nombre de VM para '#{nombre_base_log}'. Saltando." + next + end end nombre_final_tar = "#{nombre_vm}_#{File.mtime(ruta_log).strftime('%Y%m%d_%H%M%S')}.tar.gz"