Feat(ADN): Implementado sistema de configuración persistente y subcomando 'predeterminar' para backups
This commit is contained in:
@@ -3,13 +3,21 @@
|
||||
require 'optparse'
|
||||
require 'fileutils'
|
||||
require 'date'
|
||||
require_relative '../core/configurador'
|
||||
|
||||
module ADN
|
||||
class SubcomandoBackup
|
||||
def initialize(args, logger)
|
||||
@args = args
|
||||
@logger = logger
|
||||
@opciones = { modo: 'stop', storage: 'local', compress: 'gzip' }
|
||||
|
||||
# Cargar valores predeterminados desde config.yml
|
||||
defaults = Configurador.obtener('backup.defaults') || {}
|
||||
@opciones = {
|
||||
modo: defaults['modo'] || 'stop',
|
||||
storage: defaults['storage'] || 'local',
|
||||
compress: defaults['compress'] || 'gzip'
|
||||
}
|
||||
end
|
||||
|
||||
def ejecutar
|
||||
@@ -19,9 +27,12 @@ module ADN
|
||||
opts.separator "Ejecuta un backup remoto siguiendo el protocolo ADN"
|
||||
opts.separator ""
|
||||
opts.separator "Opciones:"
|
||||
opts.on("--mode MODO", "Modo de backup (stop, snapshot, suspend. Default: stop)") do |m|
|
||||
opts.on("--mode MODO", "Modo de backup (stop, snapshot, suspend. Default: #{@opciones[:modo]})") do |m|
|
||||
@opciones[:modo] = m
|
||||
end
|
||||
opts.on("--storage STORAGE", "Nombre del storage en Proxmox (Default: #{@opciones[:storage]})") do |s|
|
||||
@opciones[:storage] = s
|
||||
end
|
||||
opts.on("-h", "--help", "Mostrar esta ayuda") do
|
||||
puts opts
|
||||
exit
|
||||
@@ -42,6 +53,11 @@ module ADN
|
||||
exit 1
|
||||
end
|
||||
|
||||
if @args[0] == 'predeterminar'
|
||||
comando_predeterminar(@args[1..-1])
|
||||
return
|
||||
end
|
||||
|
||||
nodo = @args[0]
|
||||
ejecutar_backup(nodo)
|
||||
end
|
||||
@@ -100,13 +116,11 @@ module ADN
|
||||
end
|
||||
|
||||
contenido = File.read(ruta_nodo)
|
||||
# Buscamos VMID (puede decir "VM ID: 100" o "vmid: 100")
|
||||
vmid = contenido.match(/(?:VM ID|vmid):\s*(\d+)/i)&.[](1)
|
||||
# Buscamos VMID (puede decir "VM ID: 100" o "vmid: 100" o "- **VMID**: `100`")
|
||||
vmid = contenido.match(/(?:VM ID|vmid|VMID)\*\*?:?\s*`?(\d+)`?/i)&.[](1)
|
||||
|
||||
# Buscamos el host (especificamente el link o nombre entre backticks)
|
||||
# Formato: - **Padre/Host**: `srv-dasu`
|
||||
host_name = contenido.match(/Padre\/Host\*\*:?\s*`([^`]+)`/)&.[](1)
|
||||
host_name ||= contenido.match(/Host\*\*:?\s*`([^`]+)`/)&.[](1)
|
||||
host_name = contenido.match(/(?:Padre\/Host|Host Anfitrión|Anfitrión|Host)\*\*:?\s*`([^`]+)`/i)&.[](1)
|
||||
|
||||
unless vmid && host_name
|
||||
@logger.error("Contexto incompleto en #{nombre_nodo}.md: VMID=#{vmid}, Host=#{host_name}")
|
||||
@@ -179,7 +193,7 @@ module ADN
|
||||
contenido = File.read(ruta)
|
||||
|
||||
# Actualizar la línea de tiempo
|
||||
linea_nueva = "| 08:31 | #{hora} | #{desc} | [R] #{estado} |"
|
||||
linea_nueva = "| #{hora} (Fin) | | #{desc} | [R] #{estado} |"
|
||||
|
||||
# Buscamos la tarea BKP-ADN
|
||||
nuevo_contenido = contenido.gsub(/#### ⏳ - BKP-ADN/, "#### #{estado} - BKP-ADN")
|
||||
@@ -187,5 +201,28 @@ module ADN
|
||||
|
||||
File.write(ruta, nuevo_contenido)
|
||||
end
|
||||
|
||||
def comando_predeterminar(args)
|
||||
if args.length < 2
|
||||
puts "#{Color::YELLOW}Uso: adn backup predeterminar <parametro> <valor>#{Color::RESET}"
|
||||
puts "Ej: adn backup predeterminar modo snapshot"
|
||||
exit 1
|
||||
end
|
||||
|
||||
param = args[0].downcase
|
||||
valor = args[1].downcase
|
||||
|
||||
# Normalizar parámetro (ej: 'modo' -> 'modo', 'storage' -> 'storage')
|
||||
param = 'modo' if param == 'mode'
|
||||
|
||||
unless ['modo', 'storage', 'compress'].include?(param)
|
||||
@logger.error("Parámetro no predeterminable: #{param}")
|
||||
exit 1
|
||||
end
|
||||
|
||||
Configurador.establecer("backup.defaults.#{param}", valor)
|
||||
@logger.exito("Valor predeterminado establecido: backup.#{param} = #{valor}")
|
||||
puts "#{Color::GREEN}✓ Se ha predeterminado el #{param} a '#{valor}' para futuros backups.#{Color::RESET}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user