Fix SSH reconnection and improve interface description parsing in CiscoMacTableParser
This commit is contained in:
@@ -1,5 +1,8 @@
|
|||||||
CHANGELOG.md
|
CHANGELOG.md
|
||||||
|
|
||||||
|
2026/03/11
|
||||||
|
Fix SSH reconnection and improve interface description parsing in CiscoMacTableParser
|
||||||
|
|
||||||
2026/02/09
|
2026/02/09
|
||||||
Refactor Cisco MAC Monitor: Implement HTTPS service and restructure code
|
Refactor Cisco MAC Monitor: Implement HTTPS service and restructure code
|
||||||
|
|
||||||
|
|||||||
+22
-18
@@ -260,17 +260,18 @@ class CiscoMacTableParser:
|
|||||||
def _get_interface_descriptions(self, ssh_connector: CiscoSSHConnector):
|
def _get_interface_descriptions(self, ssh_connector: CiscoSSHConnector):
|
||||||
"""Obtiene las descripciones de las interfaces"""
|
"""Obtiene las descripciones de las interfaces"""
|
||||||
try:
|
try:
|
||||||
|
# Reconectar la sesión SSH para evitar errores de sesión inactiva
|
||||||
|
ssh_connector.disconnect()
|
||||||
|
if not ssh_connector.connect():
|
||||||
|
self.logger.warning("No se pudo reconectar para obtener descripciones de interfaces")
|
||||||
|
return
|
||||||
command = "show interface description"
|
command = "show interface description"
|
||||||
output = ssh_connector.execute_command(command)
|
output = ssh_connector.execute_command(command)
|
||||||
|
|
||||||
# Si el comando no es válido, intentar alternativa
|
# Si el comando no es válido, intentar alternativa
|
||||||
if "Invalid input" in output or not output.strip():
|
if "Invalid input" in output or not output.strip():
|
||||||
# Intentar obtener descripciones una por una (más lento pero funciona en IOS antiguos)
|
|
||||||
self.logger.debug("show interface description no disponible, usando método alternativo")
|
self.logger.debug("show interface description no disponible, usando método alternativo")
|
||||||
return
|
return
|
||||||
|
|
||||||
self._parse_interface_descriptions(output)
|
self._parse_interface_descriptions(output)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.warning(f"Error obteniendo descripciones de interfaces: {str(e)}")
|
self.logger.warning(f"Error obteniendo descripciones de interfaces: {str(e)}")
|
||||||
|
|
||||||
@@ -281,22 +282,25 @@ class CiscoMacTableParser:
|
|||||||
line_stripped = line.strip()
|
line_stripped = line.strip()
|
||||||
if not line_stripped or line_stripped.startswith('-') or 'Interface' in line_stripped:
|
if not line_stripped or line_stripped.startswith('-') or 'Interface' in line_stripped:
|
||||||
continue
|
continue
|
||||||
|
# El formato Cisco es: Interface Status Protocol Description (Description puede tener espacios o estar vacía)
|
||||||
# Format: Interface Status Protocol Description
|
match = re.match(r'^(\S+)\s+(\S+)\s+(\S+)\s*(.*)$', line_stripped)
|
||||||
# Fa0/1 up up User Port
|
if match:
|
||||||
# Usamos split con máximo 3 splits para preservar la descripción completa
|
interface = match.group(1)
|
||||||
parts = line.split(None, 3) # Split en whitespace, máximo 4 partes
|
status_raw = match.group(2)
|
||||||
|
protocol_raw = match.group(3)
|
||||||
if len(parts) >= 1:
|
description = match.group(4).strip() if match.group(4) else ""
|
||||||
interface = parts[0]
|
# Normalizar status (up/down/disabled/unknown)
|
||||||
description = ""
|
status = self._normalize_status(status_raw)
|
||||||
|
# Actualizar o crear la interfaz en el diccionario
|
||||||
if len(parts) >= 4:
|
|
||||||
description = parts[3].strip()
|
|
||||||
|
|
||||||
# Si esta interfaz ya existe en nuestro diccionario, actualizar descripción
|
|
||||||
if interface in self.interface_info:
|
if interface in self.interface_info:
|
||||||
|
self.interface_info[interface].status = status
|
||||||
self.interface_info[interface].description = description
|
self.interface_info[interface].description = description
|
||||||
|
else:
|
||||||
|
self.interface_info[interface] = InterfaceInfo(
|
||||||
|
name=interface,
|
||||||
|
status=status,
|
||||||
|
description=description
|
||||||
|
)
|
||||||
|
|
||||||
def _normalize_status(self, status_raw: str) -> str:
|
def _normalize_status(self, status_raw: str) -> str:
|
||||||
"""Normaliza el estado de la interfaz a up/down/disabled/unknown"""
|
"""Normaliza el estado de la interfaz a up/down/disabled/unknown"""
|
||||||
|
|||||||
Reference in New Issue
Block a user