[P2604-S12] Refactorizar ssh.rb: datos desde fichas via NodosInfo
- Eliminar hash NODOS hardcodeado de ssh.rb - Leer IP, puerto, usuario, auth, bóveda de fichas nodos/*.md - Inferir proxy automáticamente (host != nodo → proxy) - Mejorar NodosInfo: detectar_clave_boveda, detectar_auth_type - Actualizar fichas: srv-dasu (IP Tailscale), pcv-dasu0, sql-dasuten - Formato SSH estándar: usuario@ip:port (Auth, Bóveda: clave) - 15 tests pasan sin regresiones - Evento 1077 (16:58→17:03)
This commit is contained in:
@@ -19,21 +19,31 @@ module ADN
|
||||
so: detectar_so(contenido),
|
||||
vmid: detectar_vmid(contenido),
|
||||
puerto_ssh: detectar_puerto_ssh(contenido) || 22,
|
||||
usuario: detectar_usuario(contenido)
|
||||
usuario: detectar_usuario(contenido),
|
||||
clave_boveda: detectar_clave_boveda(contenido),
|
||||
auth_type: detectar_auth_type(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
|
||||
# **SSH**: user@ip:port o DOMAIN\user@ip:port
|
||||
if contenido =~ /\*\*SSH\*\*:\s*`?([^`\s(]+)/i
|
||||
full = $1
|
||||
# Extraer usuario de formato user@ip:port o DOMAIN\user@ip:port
|
||||
if full.include?('@')
|
||||
return full.split('@')[0...-1].join('@') if full.split('@').last =~ /^[\d\.]+/
|
||||
return full.split(':')[0]
|
||||
end
|
||||
return full
|
||||
end
|
||||
# Fallback: | SSH | user@domain@ip: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
|
||||
@@ -43,6 +53,10 @@ module ADN
|
||||
end
|
||||
|
||||
def self.detectar_ip(contenido)
|
||||
# Prioridad 1: IP de línea SSH (es la IP operativa para conexión)
|
||||
if contenido =~ /\*\*SSH\*\*:\s*`?[^@]+@([\d\.]+)/i
|
||||
return $1
|
||||
end
|
||||
# | 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
|
||||
@@ -80,6 +94,10 @@ module ADN
|
||||
end
|
||||
|
||||
def self.detectar_puerto_ssh(contenido)
|
||||
# **SSH**: user@ip:7022
|
||||
if contenido =~ /\*\*SSH\*\*:\s*`?[^`\s]+:(\d+)/i
|
||||
return $1.to_i
|
||||
end
|
||||
# | SSH | user@ip:7022 |
|
||||
if contenido =~ /(?:SSH|Puerto|Puerto SSH)\*\*?:?\s*.*:(\d+)/i
|
||||
return $1.to_i
|
||||
@@ -90,5 +108,27 @@ module ADN
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
# Detecta la clave de la bóveda de candados desde la ficha
|
||||
# Formato esperado: (Bóveda: `clave`) o (Bóveda: clave)
|
||||
def self.detectar_clave_boveda(contenido)
|
||||
if contenido =~ /\*\*SSH\*\*:.*Bóveda:\s*`?([a-zA-Z0-9_\-:]+)`?\)?/i
|
||||
return $1
|
||||
end
|
||||
# Fallback: buscar en cualquier línea de credenciales
|
||||
if contenido =~ /[Bb]óveda:\s*`?([a-zA-Z0-9_\-:]+)`?\)?/
|
||||
return $1
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
# Detecta tipo de autenticación SSH
|
||||
# Formato: (Passphrase RSA, ...) o (Password, ...)
|
||||
def self.detectar_auth_type(contenido)
|
||||
if contenido =~ /\*\*SSH\*\*:.*\((Passphrase|Password)/i
|
||||
return $1.downcase == 'passphrase' ? :passphrase : :password
|
||||
end
|
||||
:password # Default para VMs Windows
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user