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:
"""
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:
interfaces = {}
@@ -72,11 +72,11 @@ class InterfaceParser:
class LinkAggregationParser:
"""
Parses 'display link-aggregation verbose' command output.
Extracts link counts, MAC mappings, and bridge mappings.
Parse les données de la commande 'display link-aggregation verbose'.
Extrait les comptes de liens, les mappages MAC et les mappages de pont.
"""
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)
patterns = [
(r'^XGE(\d+/\d+/\d+)$', r'Ten-GigabitEthernet\1'),
@@ -175,11 +175,11 @@ class LinkAggregationParser:
class ConfigurationParser:
"""
Parses 'display current-configuration' command output.
Extracts interface configurations and general switch configurations.
Parse les données de la commande 'display current-configuration'.
Extrait les configurations des interfaces et les configurations générales du commutateur.
"""
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()
parts = vlan_string.split()
i = 0
@@ -370,7 +370,7 @@ class ConfigurationParser:
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]:
mac_addresses = []
@@ -394,8 +394,8 @@ class DeviceInfoParser:
class LogFileProcessor:
"""
Manages the parsing of a single log file, coordinating different parsers
and merging their results into a unified JSON structure.
Manage le parsing d'un fichier journal unique, en coordonnant différents analyseurs
et en fusionnant leurs résultats dans une structure JSON unifiée.
"""
def __init__(self):
self.interface_parser = InterfaceParser()
@@ -404,7 +404,7 @@ class LogFileProcessor:
self.device_info_parser = DeviceInfoParser()
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 = {}
current_section = None
lines = file_content.splitlines()
@@ -441,14 +441,14 @@ class LogFileProcessor:
return sections
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)
if sysname_match:
return sysname_match.group(1).strip()
return None
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():
if interface_name in interfaces:
interfaces[interface_name].update({
@@ -480,13 +480,13 @@ class LogFileProcessor:
}
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():
if interface_name in interfaces:
interfaces[interface_name]["nb_liens"] = count
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():
if interface_name in interfaces:
interfaces[interface_name]["mac_destination"] = mac_address
@@ -509,15 +509,15 @@ class LogFileProcessor:
}
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():
if interface_name in interfaces:
interfaces[interface_name]["bridge_name"] = bridge_name
def process_file(self, filepath: str) -> dict | None:
"""
Processes a single log file to extract and consolidate network device data.
Returns a dictionary containing metadata and parsed data, or None on error.
Gère le parsing d'un fichier journal unique pour extraire et consolider les données des appareils réseau.
Renvoie un dictionnaire contenant des métadonnées et des données analysées, ou None en cas d'erreur.
"""
try:
with open(filepath, 'r', encoding='latin-1', errors='ignore') as f:
@@ -580,7 +580,7 @@ class LogFileProcessor:
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):
try:
@@ -596,7 +596,8 @@ class DataExporter:
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):
self.processor = LogFileProcessor()
@@ -625,8 +626,8 @@ class MainApplication:
def process_file_return_json(filepath: str) -> dict | None:
"""
Standalone function to process a single file and return JSON object,
useful for external calls that don't need the full CLI application.
Fonction autonome pour traiter un fichier unique et renvoyer un objet JSON,
utile pour les appels externes.
"""
processor = LogFileProcessor()
return processor.process_file(filepath)