V0.1
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user