[ADN] Commit final DB-First - Actualización completa de documentación, herramientas y componentes
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# adn/tools/core/nodos_info.rb — Utilidades para extracción de metadatos de fichas de nodos
|
||||
# ======================================================================================
|
||||
|
||||
require_relative 'constants'
|
||||
|
||||
module ADN
|
||||
module NodosInfo
|
||||
def self.extraer_metadata(nodo_nombre)
|
||||
ruta = File.join(ADN::NODOS_DIR, "#{nodo_nombre}.md")
|
||||
return nil unless File.exist?(ruta)
|
||||
|
||||
contenido = File.read(ruta, encoding: 'UTF-8')
|
||||
{
|
||||
nombre: nodo_nombre,
|
||||
ip: detectar_ip(contenido),
|
||||
host: detectar_host(contenido),
|
||||
so: detectar_so(contenido),
|
||||
vmid: detectar_vmid(contenido),
|
||||
puerto_ssh: detectar_puerto_ssh(contenido) || 22,
|
||||
usuario: detectar_usuario(contenido)
|
||||
}
|
||||
end
|
||||
|
||||
def self.detectar_usuario(contenido)
|
||||
# | SSH | user@domain@ip:7022 | o user@ip:7022 o user@domain:7022
|
||||
if contenido =~ /(?:SSH|Acceso)\*\*?:?\s*`?([a-zA-Z0-9_\-\.\@]+)/i
|
||||
full = $1
|
||||
if full.include?('@')
|
||||
parts = full.split('@')
|
||||
# Si la última parte es una IP, el usuario es el resto
|
||||
if parts.last =~ /^\d{1,3}(\.\d{1,3}){3}/
|
||||
return parts[0...-1].join('@')
|
||||
else
|
||||
# Probablemente sea user@domain or user@domain:port
|
||||
return full.split(':')[0]
|
||||
end
|
||||
end
|
||||
return full
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
def self.detectar_ip(contenido)
|
||||
# | IP / Ubicación | 10.0.10.10 |
|
||||
# | IP | 10.0.100.11/24 |
|
||||
if contenido =~ /\|\s*IP\s*(?:\/\s*Ubicación)?\s*\|\s*`?([\d\.]+)/i
|
||||
return $1
|
||||
end
|
||||
# - **IP**: `10.0.10.200`
|
||||
if contenido =~ /IP\*\*:\s*`?([\d\.]+)/i
|
||||
return $1
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
def self.detectar_host(contenido)
|
||||
if contenido =~ /\*\*(?:Padre\/Host|Host Anfitrión|Anfitrión|Host)\*\*\s*[:\|]?\s*`?([a-zA-Z0-9\-]+)`?/i
|
||||
return $1
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
def self.detectar_so(contenido)
|
||||
# | Sistema Operativo | ... | o - **Sistema Operativo**: ...
|
||||
if contenido =~ /(?:\||\-)\s*\*\*?(?:Sistema Operativo|SO|OS)\*\*?\s*[:\|]\s*([^\|\n]+)/i
|
||||
so_raw = $1.strip
|
||||
return :windows if so_raw =~ /windows|server|win/i
|
||||
return :linux if so_raw =~ /linux|ubuntu|debian|centos|rocky|proxmox/i
|
||||
end
|
||||
:linux # Default
|
||||
end
|
||||
|
||||
def self.detectar_vmid(contenido)
|
||||
if contenido =~ /(?:VM ID|vmid|VMID)\*\*?:?\s*`?(\d+)`?/i
|
||||
return $1
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
def self.detectar_puerto_ssh(contenido)
|
||||
# | SSH | user@ip:7022 |
|
||||
if contenido =~ /(?:SSH|Puerto|Puerto SSH)\*\*?:?\s*.*:(\d+)/i
|
||||
return $1.to_i
|
||||
end
|
||||
# (Puerto 7022)
|
||||
if contenido =~ /\(Puerto\s+(\d+)\)/i
|
||||
return $1.to_i
|
||||
end
|
||||
nil
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user