135 lines
4.4 KiB
Ruby
135 lines
4.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'optparse'
|
|
require_relative '../core/colores'
|
|
require_relative 'nodos/info'
|
|
require_relative '../core/help_formatter'
|
|
|
|
class SubcomandoContexto
|
|
def initialize(args, logger)
|
|
@args = args
|
|
@logger = logger
|
|
@opciones = { cmd: false }
|
|
end
|
|
|
|
def ejecutar
|
|
# Handle help flags
|
|
if @args.empty? || @args[0] == 'help' || @args[0] == '-h' || @args[0] == '--help'
|
|
mostrar_ayuda
|
|
return
|
|
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
|
|
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 mostrar_ayuda
|
|
ayuda = ADN::HelpFormatter.generar_help(
|
|
titulo: "Contexto de Nodo",
|
|
descripcion: "Obtiene información contextual de un nodo",
|
|
uso: "./adn/tools/run contexto <nombre-nodo> [--cmd]",
|
|
opciones: [
|
|
{ names: ['--cmd'], desc: "Generar comando SSH con ProxyJump si es necesario" }
|
|
],
|
|
ejemplos: [
|
|
{ cmd: "./adn/tools/run contexto srv-pmox1", desc: "Obtener contexto del nodo srv-pmox1" },
|
|
{ cmd: "./adn/tools/run contexto srvv-fenix --cmd", desc: "Obtener contexto con comandos SSH sugeridos" }
|
|
]
|
|
)
|
|
|
|
puts ayuda
|
|
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
|