Files
dtic-DIIAA/adn/tools/cli/contexto.rb
T
Ricardo Monla a5f71df15d [P2604-S13] Consolidar core/ — lógica de dominio a submódulos CLI
Arquitectura antes:
  core/nodos_info.rb    → usado por 4 CLIs
  core/ejecutor_remoto.rb → usado por proceso.rb
  core/triggers.rb      → usado por triggers.rb
  core/eventos.rb       → usado por triggers.rb
  core/configurador.rb  → usado por backup.rb

Arquitectura después:
  cli/nodos/info.rb       ← submódulo de nodos
  cli/ssh/ejecutor.rb     ← submódulo de ssh
  cli/triggers/motor.rb   ← submódulo de triggers
  cli/triggers/eventos.rb ← submódulo de triggers
  cli/backup/configurador.rb ← submódulo de backup

core/ queda limpio con solo infraestructura genuina:
  colores, constants, error_handler, logger, help_formatter,
  conciliador (transversal), validador (obsoleto)

- 15 tests pasan sin regresiones
- Evento 1078 (17:14→17:17)
2026-03-15 17:19:14 -03:00

119 lines
3.8 KiB
Ruby

# frozen_string_literal: true
require 'optparse'
require_relative '../core/colores'
require_relative 'nodos/info'
class SubcomandoContexto
def initialize(args, logger)
@args = args
@logger = logger
@opciones = { cmd: false }
end
def ejecutar
if @args.empty?
@logger.error("Se requiere nombre de nodo")
puts "Uso: ./adn/tools/run contexto <nombre-nodo> [--cmd]"
exit 1
end
nodo = @args[0]
@args.shift
parser = OptionParser.new do |opts|
opts.banner = "Uso: ./adn/tools/run contexto <nombre-nodo> [OPCIONES]"
opts.separator ""
opts.separator "Obtiene contexto topológico de un nodo"
opts.separator ""
opts.separator "Opciones:"
opts.on("--cmd", "Generar comando SSH con ProxyJump si es necesario") do
@opciones[:cmd] = true
end
opts.on("-h", "--help", "Mostrar esta ayuda") do
puts opts
exit
end
end
begin
parser.parse!(@args)
rescue OptionParser::InvalidOption => e
@logger.error("Opción inválida: #{e.message}")
puts parser
exit 1
end
obtener_contexto(nodo)
end
private
def obtener_contexto(nombre_nodo)
@logger.info("Buscando contexto para nodo: #{nombre_nodo}")
ruta_nodo = File.join(ADN::NODOS_DIR, "#{nombre_nodo}.md")
unless File.exist?(ruta_nodo)
@logger.error("Nodo no encontrado: #{nombre_nodo}")
puts "#{Color::RED}✗ No se encontró ficha para el nodo '#{nombre_nodo}'#{Color::RESET}"
puts " Buscado en: #{ruta_nodo}"
exit 1
end
metadata = ADN::NodosInfo.extraer_metadata(nombre_nodo)
puts "#{Color::CYAN}📋 Contexto del nodo: #{nombre_nodo}#{Color::RESET}"
puts "#{Color::DIM}#{'-' * 60}#{Color::RESET}"
if metadata
puts " #{Color::GREEN}IP:#{Color::RESET} #{metadata[:ip] || '-'}"
puts " #{Color::GREEN}Rol:#{Color::RESET} #{metadata[:host] ? 'VM' : (metadata[:so] || '-')}"
puts " #{Color::GREEN}SO:#{Color::RESET} #{metadata[:so] || '-'}"
puts " #{Color::GREEN}Host:#{Color::RESET} #{metadata[:host] || '-'}"
puts " #{Color::GREEN}SSH:#{Color::RESET} #{metadata[:usuario] || 'rmonla'}@#{metadata[:ip] || '?'}:#{metadata[:puerto_ssh] || 22}"
if @opciones[:cmd]
generar_comando_ssh(nombre_nodo, metadata[:ip], metadata[:usuario])
end
# Buscar en ontología para contexto de red
ontologia_path = File.join(ADN::PROJECT_ROOT, 'adn', '01_ontologia.md')
if File.exist?(ontologia_path)
ontologia = File.read(ontologia_path, encoding: 'UTF-8')
if ontologia.include?(nombre_nodo)
clusters = ['srv-pmox1', 'srv-pmox2', 'srv-pmox3', 'srv-xen1', 'srv-dasu']
cluster = clusters.find { |c| ontologia.include?("**#{c}**") && ontologia.include?(nombre_nodo) }
if cluster && cluster != 'srv-ns8'
puts " #{Color::YELLOW}🔧 Acceso probable via ProxyJump:#{Color::RESET}"
puts " ssh -J root@#{cluster} rmonla@#{nombre_nodo}"
end
end
end
else
puts "#{Color::YELLOW}⚠ No se pudo extraer metadata del nodo#{Color::RESET}"
end
puts "#{Color::DIM}#{'-' * 60}#{Color::RESET}"
@logger.exito("Contexto obtenido para nodo: #{nombre_nodo}")
end
def generar_comando_ssh(nodo, ip, usuario = nil)
usuario ||= if nodo.start_with?('srvv-') || nodo.start_with?('pcv-')
'rmonla'
elsif nodo.start_with?('srv-') && nodo != 'srv-ns8'
'root'
else
'rmonla'
end
puts "\n#{Color::CYAN}🔧 Comando SSH sugerido:#{Color::RESET}"
puts " ssh #{usuario}@#{ip}"
unless nodo == 'srv-ns8' || nodo.start_with?('srv-pmox') || nodo.start_with?('srv-xen')
puts " #{Color::DIM}O usando nombre (si está en ~/.ssh/config):#{Color::RESET}"
puts " ssh #{nodo}"
end
end
end