Files
Ricardo Monla d4ea8c0bcd fix(dron): corregir ámbito/nodo de registro en bitácora para pipeline DASUTEN
Bug 2 — proc_dasuten.rb:
- Separa nodo operacional (srvv-fenix, srv-ns8, etc.) del nodo de bitácora
- Registro siempre bajo nodo=dtic-BKPs / ámbito=dtic-DIIAA
- Agrega constantes NODO_BITACORA y AMBITO_BITACORA

Bug 3 — ejecutor.rb (detectar_nodo_id):
- Ignoraba el parámetro 'nodo' y siempre usaba Socket.gethostname
- Fix: usa el nombre pasado para lookup en DB
- Fallback a hostname local solo si nodo es nil/empty o no existe en DB
- Segundo fallback a hostname si el nodo pasado tampoco existe en DB

DB: creado nodo 'dtic-BKPs' (ID:49, tipo:servicio, ámbito:dtic-DIIAA)

Refs: A04.P006 — Pipeline DASUTEN / A03 BKPs
2026-04-21 08:30:32 -03:00

104 lines
3.6 KiB
Ruby

# frozen_string_literal: true
# ==========================================================
# adn/tools/bkps/lib/proc_dasuten.rb
# ==========================================================
# Procesador de Backups DASUTEN
# Integra pipeline de backups en bkps.rb
# ==========================================================
module ADN
module BKPs
module Procesador
class Dasuten
DRONES_DIR = File.join(
File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))),
'cli', 'drones'
)
# Nodo y ámbito de REGISTRO en bitácora (lógico, no operacional)
# El nodo operacional (srvv-fenix, srv-ns8, etc.) es interno al dron
NODO_BITACORA = 'dtic-BKPs'.freeze
AMBITO_BITACORA = 'dtic-DIIAA'.freeze
SCRIPTS = {
'dasuten_export_full' => 'dasuten_exportar_srvv-fenix.rb',
'dasuten_export_dif' => 'dasuten_exportar_diferencial_srvv-fenix.rb',
'dasuten_transferir' => 'dasuten_transferir_srvv-fenix-srv-ns8.rb',
'dasuten_upload' => 'dasuten_upload_srv-ns8-drive.rb',
'dasuten_download' => 'dasuten_download_drive-dasu-sql4.rb',
'dasuten_restaurar_full' => 'dasuten_restaurar_dasu-sql4.rb',
'dasuten_restaurar_dif' => 'dasuten_restaurar_diferencial_dasu-sql4.rb',
'dasuten_verificar' => 'dasuten_verificar-integridad_dasu-sql4.rb',
}.freeze
def initialize(logger)
@logger = logger
@dron_runner = File.join(
File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))),
'run'
)
end
def ejecutar(tarea)
script_name = SCRIPTS[tarea[:id]]
unless script_name
@logger.error("Tarea DASUTEN desconocida: #{tarea[:id]}")
return false
end
script_path = File.join(DRONES_DIR, script_name)
unless File.exist?(script_path)
@logger.error("Script no encontrado: #{script_path}")
return false
end
nota = tarea[:texto] || "DASUTEN: #{tarea[:id]}"
nodo_bitacora = NODO_BITACORA # Registro lógico en bitácora
ambito_bitacora = AMBITO_BITACORA # Ámbito de registro en bitácora
# Lanzar dron con bitácora automática
# --nodo y --ambito son para REGISTRO en bitácora, no el nodo operacional
cmd = "#{@dron_runner} dron lanzar --nota #{Shellwords.escape(nota)} --nodo #{Shellwords.escape(nodo_bitacora)} --ambito #{Shellwords.escape(ambito_bitacora)} -- ruby #{script_path}"
@logger.info("Ejecutando dron: #{nota}")
@logger.debug("Comando: #{cmd}")
exito = system(cmd)
codigo = $?.exitstatus
if exito
@logger.info("✅ Dron completado (código: #{codigo})")
true
else
@logger.error("❌ Dron fallido (código: #{codigo})")
false
end
end
# Para modo atómico (no aplica en DASUTEN - todos son pipelines)
def ejecutar_uno(tarea, archivo)
@logger.warn("Modo atómico no soportado para DASUTEN")
ejecutar(tarea)
end
# Listar archivos pendientes (no aplica - pipeline fijo)
def listar(tarea)
[]
end
private
def detectar_nodo(tarea_id)
case tarea_id
when /export/ then 'srvv-fenix'
when /transferir/, /upload/ then 'srv-ns8'
when /download/, /restaurar/, /verificar/ then 'dasu-sql4'
else 'srv-dasu'
end
end
end
end
end
end