This commit is contained in:
Chevallier
2025-07-23 09:50:11 +02:00
parent ab7611a923
commit b77709c677

View File

@@ -7,7 +7,7 @@ from datetime import datetime
class InterfaceParser: class InterfaceParser:
""" """
Parses 'display interface' command output to extract interface details. Parse les données de la commande 'display interface' pour extraire les informations des interfaces.
""" """
def parse(self, content: str) -> dict: def parse(self, content: str) -> dict:
interfaces = {} interfaces = {}
@@ -72,11 +72,11 @@ class InterfaceParser:
class LinkAggregationParser: class LinkAggregationParser:
""" """
Parses 'display link-aggregation verbose' command output. Parse les données de la commande 'display link-aggregation verbose'.
Extracts link counts, MAC mappings, and bridge mappings. Extrait les comptes de liens, les mappages MAC et les mappages de pont.
""" """
def _convert_port_name(self, port_name: str) -> str: def _convert_port_name(self, port_name: str) -> str:
"""Converts the port name to a standardized format.""" """Convertit le nom du port en un format standardisé."""
port_name = re.sub(r'\([A-Z]\)', '', port_name) port_name = re.sub(r'\([A-Z]\)', '', port_name)
patterns = [ patterns = [
(r'^XGE(\d+/\d+/\d+)$', r'Ten-GigabitEthernet\1'), (r'^XGE(\d+/\d+/\d+)$', r'Ten-GigabitEthernet\1'),
@@ -175,11 +175,11 @@ class LinkAggregationParser:
class ConfigurationParser: class ConfigurationParser:
""" """
Parses 'display current-configuration' command output. Parse les données de la commande 'display current-configuration'.
Extracts interface configurations and general switch configurations. Extrait les configurations des interfaces et les configurations générales du commutateur.
""" """
def _parse_vlan_ranges(self, vlan_string: str) -> list: def _parse_vlan_ranges(self, vlan_string: str) -> list:
"""Parses a VLAN string and returns a list of unique VLANs.""" """Parse un string de VLAN et renvoie une liste de VLANs uniques."""
vlans = set() vlans = set()
parts = vlan_string.split() parts = vlan_string.split()
i = 0 i = 0
@@ -370,7 +370,7 @@ class ConfigurationParser:
class DeviceInfoParser: class DeviceInfoParser:
""" """
Parses 'display device manuinfo' command output to extract MAC addresses. Parse les données de la commande 'display device manuinfo' pour extraire les adresses MAC.
""" """
def parse(self, content: str) -> list[str]: def parse(self, content: str) -> list[str]:
mac_addresses = [] mac_addresses = []
@@ -394,8 +394,8 @@ class DeviceInfoParser:
class LogFileProcessor: class LogFileProcessor:
""" """
Manages the parsing of a single log file, coordinating different parsers Manage le parsing d'un fichier journal unique, en coordonnant différents analyseurs
and merging their results into a unified JSON structure. et en fusionnant leurs résultats dans une structure JSON unifiée.
""" """
def __init__(self): def __init__(self):
self.interface_parser = InterfaceParser() self.interface_parser = InterfaceParser()
@@ -404,7 +404,7 @@ class LogFileProcessor:
self.device_info_parser = DeviceInfoParser() self.device_info_parser = DeviceInfoParser()
def _extract_sections(self, file_content: str) -> dict: def _extract_sections(self, file_content: str) -> dict:
"""Extracts different sections from the log file content.""" """Extrait les sections pertinentes du contenu du fichier journal en fonction des motifs définis."""
sections = {} sections = {}
current_section = None current_section = None
lines = file_content.splitlines() lines = file_content.splitlines()
@@ -441,14 +441,14 @@ class LogFileProcessor:
return sections return sections
def _extract_switch_name(self, content: str) -> str | None: def _extract_switch_name(self, content: str) -> str | None:
"""Extracts the switch name from the log file content.""" """Extrait le nom du commutateur à partir du contenu du fichier journal."""
sysname_match = re.search(r"(?m)^\s*sysname\s+(.+)$", content) sysname_match = re.search(r"(?m)^\s*sysname\s+(.+)$", content)
if sysname_match: if sysname_match:
return sysname_match.group(1).strip() return sysname_match.group(1).strip()
return None return None
def _merge_configuration_into_interfaces(self, interfaces: dict, interfaces_config: dict): def _merge_configuration_into_interfaces(self, interfaces: dict, interfaces_config: dict):
"""Merges configuration details into the parsed interface data.""" """Merge les détails de configuration dans les données d'interface analysées."""
for interface_name, config in interfaces_config.items(): for interface_name, config in interfaces_config.items():
if interface_name in interfaces: if interface_name in interfaces:
interfaces[interface_name].update({ interfaces[interface_name].update({
@@ -480,13 +480,13 @@ class LogFileProcessor:
} }
def _merge_link_aggregation_counts(self, interfaces: dict, link_counts: dict): def _merge_link_aggregation_counts(self, interfaces: dict, link_counts: dict):
"""Merges link aggregation counts into the interface data.""" """Merge le nombre de link aggregation dans les données d'interface."""
for interface_name, count in link_counts.items(): for interface_name, count in link_counts.items():
if interface_name in interfaces: if interface_name in interfaces:
interfaces[interface_name]["nb_liens"] = count interfaces[interface_name]["nb_liens"] = count
def _merge_mac_mappings(self, interfaces: dict, mac_mappings: dict): def _merge_mac_mappings(self, interfaces: dict, mac_mappings: dict):
"""Merges MAC address mappings into the interface data.""" """Merge les mappages d'adresses MAC dans les données d'interface."""
for interface_name, mac_address in mac_mappings.items(): for interface_name, mac_address in mac_mappings.items():
if interface_name in interfaces: if interface_name in interfaces:
interfaces[interface_name]["mac_destination"] = mac_address interfaces[interface_name]["mac_destination"] = mac_address
@@ -509,15 +509,15 @@ class LogFileProcessor:
} }
def _merge_bridge_mappings(self, interfaces: dict, bridge_mappings: dict): def _merge_bridge_mappings(self, interfaces: dict, bridge_mappings: dict):
"""Merges bridge aggregation mappings into existing interfaces.""" """Merge les bridge agreggation dans les interfaces existantes."""
for interface_name, bridge_name in bridge_mappings.items(): for interface_name, bridge_name in bridge_mappings.items():
if interface_name in interfaces: if interface_name in interfaces:
interfaces[interface_name]["bridge_name"] = bridge_name interfaces[interface_name]["bridge_name"] = bridge_name
def process_file(self, filepath: str) -> dict | None: def process_file(self, filepath: str) -> dict | None:
""" """
Processes a single log file to extract and consolidate network device data. Gère le parsing d'un fichier journal unique pour extraire et consolider les données des appareils réseau.
Returns a dictionary containing metadata and parsed data, or None on error. Renvoie un dictionnaire contenant des métadonnées et des données analysées, ou None en cas d'erreur.
""" """
try: try:
with open(filepath, 'r', encoding='latin-1', errors='ignore') as f: with open(filepath, 'r', encoding='latin-1', errors='ignore') as f:
@@ -580,7 +580,7 @@ class LogFileProcessor:
class DataExporter: class DataExporter:
""" """
Handles the export of processed data to a JSON file. Gère l'export des données traitées vers un fichier JSON.
""" """
def export(self, data: dict, output_filepath: str): def export(self, data: dict, output_filepath: str):
try: try:
@@ -596,7 +596,8 @@ class DataExporter:
class MainApplication: class MainApplication:
""" """
Main application class to orchestrate the log file processing. Application principale pour coordonner le traitement des fichiers journaux,
l'export des données et la gestion des erreurs.
""" """
def __init__(self): def __init__(self):
self.processor = LogFileProcessor() self.processor = LogFileProcessor()
@@ -625,8 +626,8 @@ class MainApplication:
def process_file_return_json(filepath: str) -> dict | None: def process_file_return_json(filepath: str) -> dict | None:
""" """
Standalone function to process a single file and return JSON object, Fonction autonome pour traiter un fichier unique et renvoyer un objet JSON,
useful for external calls that don't need the full CLI application. utile pour les appels externes.
""" """
processor = LogFileProcessor() processor = LogFileProcessor()
return processor.process_file(filepath) return processor.process_file(filepath)