Files
parseur_logs/models/base_switch.py

139 lines
4.4 KiB
Python
Raw Normal View History

2025-07-10 10:52:32 +02:00
from typing import List, Optional
2025-07-10 13:33:56 +02:00
import re
def normalize_port_name(port: str) -> str:
port = port.upper()
port = port.replace("GE", "GIGABITETHERNET")
port = port.replace("XGE", "TEN-GIGABITETHERNET")
port = port.replace("BAGG", "BRIDGE-AGGREGATION")
return port
2025-07-10 10:52:32 +02:00
class PowerSupply:
def __init__(self, id: int, state: str, mode: Optional[str] = None):
self.id = id
self.state = state
self.mode = mode
self.summary = f"Alimentation {id} en état {state}"
def to_dict(self):
return {
"object": "power_supply",
"id": self.id,
"state": self.state,
"mode": self.mode,
"summary": self.summary,
}
class Fan:
def __init__(self, id: int, state: str):
self.id = id
self.state = state
self.summary = f"Ventilateur {id} en état {state}"
def to_dict(self):
return {
"object": "fan",
"id": self.id,
"state": self.state,
"summary": self.summary,
}
class MACEntry:
def __init__(self, mac: str, vlan: int, port: str, type_: str):
self.mac = mac
self.vlan = vlan
self.port = port
self.type = type_
def to_dict(self):
return {
"object": "mac_entry",
"mac": self.mac,
"vlan": self.vlan,
"port": self.port,
"type": self.type,
}
class Port:
def __init__(self, name: str):
self.object = "port"
self.name = name
self.status = None
self.speed = None
self.vlan = None
self.link_type = None
2025-07-10 13:33:56 +02:00
self.trunk_vlans: List[int] = []
2025-07-10 10:52:32 +02:00
self.bpdu_protection = False
self.portfast = False
self.loopback_detection = None
2025-07-10 13:33:56 +02:00
self.mac_addresses: List[str] = []
2025-07-10 10:52:32 +02:00
self.summary = ""
def to_dict(self):
2025-07-10 13:33:56 +02:00
mac_count = len(self.mac_addresses)
mac_info = f", {mac_count} MAC" if mac_count else ""
vlan_info = f"TRUNK ({', '.join(map(str, sorted(self.trunk_vlans)))})" if self.link_type == "trunk" else f"VLAN {self.vlan or '?'}"
status = self.status.upper() if self.status else "INCONNU"
speed = self.speed or "vitesse inconnue"
self.summary = f"Port {self.name} est {status} à {speed}, {vlan_info}{mac_info}"
2025-07-10 10:52:32 +02:00
return {
"object": "port",
"name": self.name,
"status": self.status,
"speed": self.speed,
"vlan": self.vlan,
"link_type": self.link_type,
2025-07-10 13:33:56 +02:00
"trunk_vlans": ", ".join(map(str, self.trunk_vlans)) if self.link_type == "trunk" else None,
2025-07-10 10:52:32 +02:00
"bpdu_protection": self.bpdu_protection,
"portfast": self.portfast,
"loopback_detection": self.loopback_detection,
2025-07-10 13:33:56 +02:00
"mac_addresses": self.mac_addresses,
2025-07-10 10:52:32 +02:00
"summary": self.summary,
}
class VLAN:
def __init__(self, vlan_id: int, name: Optional[str] = None, description: Optional[str] = None):
self.vlan_id = vlan_id
self.name = name
self.description = description
self.summary = f"VLAN {vlan_id} : {name or 'non nommé'}"
def to_dict(self):
return {
"object": "vlan",
"vlan_id": self.vlan_id,
"name": self.name,
"description": self.description,
"summary": self.summary,
}
class Switch:
def __init__(self):
self.hostname = None
self.model = None
self.firmware_version = None
self.boot_image = None
self.uptime = None
self.ports: List[Port] = []
self.vlans: List[VLAN] = []
self.fans: List[Fan] = []
self.power_supplies: List[PowerSupply] = []
self.mac_table: List[MACEntry] = []
self.summary = ""
def to_dict(self):
return {
"object": "switch",
"hostname": self.hostname,
"model": self.model,
"firmware_version": self.firmware_version,
"boot_image": self.boot_image,
"uptime": self.uptime,
"summary": self.summary,
"fans": [f.to_dict() for f in self.fans],
"power_supplies": [p.to_dict() for p in self.power_supplies],
"ports": [p.to_dict() for p in self.ports],
"vlans": [v.to_dict() for v in self.vlans],
"mac_table": [m.to_dict() for m in self.mac_table],
}