docs: Actualización de contexto IA, Drones, Candados y nuevos nodos
This commit is contained in:
@@ -66,6 +66,7 @@ module Dron
|
||||
lines << "\n#{Color::BOLD}Opciones:#{Color::RESET}"
|
||||
lines << " #{Color::GREEN}--nota \"texto\"#{Color::RESET} Nota descriptiva para la bitácora"
|
||||
lines << " #{Color::GREEN}--evento ID#{Color::RESET} Vincular a evento existente"
|
||||
lines << " #{Color::GREEN}--nodo NOMBRE#{Color::RESET} Nodo para bitácora (auto-detect si no se especifica)"
|
||||
lines << " #{Color::GREEN}--timeout N#{Color::RESET} Timeout en segundos (default: 3600)"
|
||||
lines << " #{Color::GREEN}--dry-run#{Color::RESET} Simulación sin ejecutar"
|
||||
lines << " #{Color::GREEN}--help#{Color::RESET} Mostrar esta ayuda"
|
||||
@@ -107,7 +108,8 @@ module Dron
|
||||
nota: opciones[:nota],
|
||||
evento_id: opciones[:evento_id],
|
||||
timeout: opciones[:timeout],
|
||||
flujo_id: opciones[:flujo_id]
|
||||
flujo_id: opciones[:flujo_id],
|
||||
nodo: opciones[:nodo]
|
||||
)
|
||||
|
||||
# Mostrar resultado
|
||||
@@ -128,6 +130,7 @@ module Dron
|
||||
evento_id: nil,
|
||||
timeout: 3600,
|
||||
flujo_id: nil,
|
||||
nodo: nil,
|
||||
cmd: nil
|
||||
}
|
||||
|
||||
@@ -143,6 +146,8 @@ module Dron
|
||||
opciones[:timeout] = args.shift.to_i
|
||||
when '--flujo'
|
||||
opciones[:flujo_id] = args.shift
|
||||
when '--nodo'
|
||||
opciones[:nodo] = args.shift
|
||||
when '--help', '-h'
|
||||
Dispatcher.mostrar_ayuda
|
||||
exit 0
|
||||
|
||||
@@ -13,15 +13,15 @@ module Dron
|
||||
HEARTBEAT_INTERVAL = 30
|
||||
|
||||
class << self
|
||||
def lanzar(cmd:, nota: nil, evento_id: nil, timeout: DEFAULT_TIMEOUT, flujo_id: nil)
|
||||
def lanzar(cmd:, nota: nil, evento_id: nil, timeout: DEFAULT_TIMEOUT, flujo_id: nil, nodo: nil)
|
||||
Base.logger.info("🛠️ Dron Ejecutor iniciado: #{Process.pid}")
|
||||
dron_id = ADN::DB::DronDB.generar_dron_id
|
||||
|
||||
ADN::DB::DronDB.registrar_inicio(tipo: 'ejecutor', cmd: cmd, flujo_id: flujo_id, metadata: { nota: nota, evento_id: evento_id, timeout: timeout })
|
||||
evento_id = registrar_bitacora(nota, evento_id, 'inicio') if nota
|
||||
ADN::DB::DronDB.registrar_inicio(tipo: 'ejecutor', cmd: cmd, flujo_id: flujo_id, metadata: { nota: nota, evento_id: evento_id, timeout: timeout, nodo: nodo })
|
||||
evento_id = registrar_bitacora(nota, evento_id, 'inicio', nodo) if nota
|
||||
resultado = ejecutar_comando(cmd, dron_id, timeout)
|
||||
ADN::DB::DronDB.registrar_fin(dron_id, resultado[:exit_code], resultado[:output])
|
||||
registrar_bitacora(nota, evento_id, 'fin', resultado) if evento_id
|
||||
registrar_bitacora(nota, evento_id, 'fin', resultado, nodo) if evento_id
|
||||
|
||||
Base.logger.info("🛠️ Dron Ejecutor completado: #{dron_id} - #{resultado[:exit_code] == 0 ? '✅' : '❌'}")
|
||||
{ dron_id: dron_id, exit_code: resultado[:exit_code], duration: resultado[:duration], evento_id: evento_id }
|
||||
@@ -67,14 +67,18 @@ module Dron
|
||||
{ exit_code: exit_code || 1, output: output.join("\n").strip, duration: (Time.now - start_time).round(2) }
|
||||
end
|
||||
|
||||
def registrar_bitacora(nota, evento_id, tipo, resultado = nil)
|
||||
def registrar_bitacora(nota, evento_id, tipo, resultado = nil, nodo = nil)
|
||||
return nil unless nota
|
||||
require_relative '../../db/core/bitacora_db'
|
||||
|
||||
# Detectar nodo automáticamente si no se especifica
|
||||
nodo_id = detectar_nodo_id(nodo)
|
||||
|
||||
if tipo == 'inicio'
|
||||
descripcion = "🛸 dron: #{nota}"
|
||||
BitacorasDB::BitacoraDB.with_connection do |db|
|
||||
db.crear_evento(nodo_id: 1, descripcion: descripcion, inicio: Time.now.strftime('%H:%M'), estado: '⏳')
|
||||
evento = db.crear_evento(nodo_id: nodo_id, descripcion: descripcion, inicio: Time.now.strftime('%H:%M'), estado: '⏳')
|
||||
evento['id'] # Retornar ID para actualizar después
|
||||
end
|
||||
else
|
||||
estado = resultado[:exit_code] == 0 ? '✅' : '❌'
|
||||
@@ -82,11 +86,44 @@ module Dron
|
||||
BitacorasDB::BitacoraDB.with_connection do |db|
|
||||
db.actualizar_evento(evento_id, descripcion: descripcion, fin: Time.now.strftime('%H:%M'))
|
||||
end
|
||||
evento_id # Retornar mismo ID
|
||||
end
|
||||
rescue StandardError => e
|
||||
Base.logger.warn("⚠️ Error en bitácora: #{e.message}")
|
||||
nil
|
||||
end
|
||||
|
||||
def detectar_nodo_id(nodo)
|
||||
return nodo if nodo.is_a?(Integer)
|
||||
|
||||
# Si no se especifica nodo, usar el hostname para detectar
|
||||
require 'socket'
|
||||
hostname = Socket.gethostname.downcase
|
||||
|
||||
# Buscar nodo por nombre en la tabla de nodos
|
||||
require_relative '../../db/core/bitacora_db'
|
||||
sql = 'SELECT id FROM nodos WHERE LOWER(nombre) = $1 LIMIT 1'
|
||||
|
||||
resultado = nil
|
||||
BitacorasDB::BitacoraDB.with_connection do |db|
|
||||
resultado = db.execute(sql, [hostname])
|
||||
end
|
||||
|
||||
if resultado&.any?
|
||||
resultado.first['id']
|
||||
else
|
||||
# Fallback: buscar por prefijo (ej: srv-ns8 coincide con srv-ns8.frlr.utn.edu.ar)
|
||||
sql = 'SELECT id FROM nodos WHERE LOWER(nombre) LIKE $1 LIMIT 1'
|
||||
resultado = nil
|
||||
BitacorasDB::BitacoraDB.with_connection do |db|
|
||||
resultado = db.execute(sql, ["#{hostname}%"])
|
||||
end
|
||||
resultado&.any? ? resultado.first['id'] : 1
|
||||
end
|
||||
rescue StandardError => e
|
||||
Base.logger.warn("⚠️ Error detectando nodo: #{e.message}, usando default (1)")
|
||||
1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user