feat(dtic-BKPs): auto-relaunch inside GNU screen
This commit is contained in:
@@ -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) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user