|
- from __future__ import annotations
-
- import csv
- from dataclasses import dataclass
- from pathlib import Path
- from typing import List, Optional
-
- from .normalize import norm_mac
-
-
- @dataclass
- class GatewayDef:
- mac: str
- name: str = ""
- id: str = ""
-
-
- def _sniff_delimiter(sample: str) -> str:
- # fallback robusto: prova a sniffare, altrimenti ';'
- try:
- return csv.Sniffer().sniff(sample, delimiters=";,\t").delimiter
- except Exception:
- return ";"
-
-
- def load_gateway_features_csv(path: str) -> List[GatewayDef]:
- """
- Carica gateway.csv.
- Attesi header: mac;name;id (name/id opzionali)
- Normalizza MAC in formato canonico 'AA:BB:CC:DD:EE:FF'
- """
- p = Path(path)
- if not p.exists():
- raise FileNotFoundError(f"gateway csv not found: {path}")
-
- txt = p.read_text(encoding="utf-8", errors="ignore")
- delim = _sniff_delimiter(txt[:2048])
-
- rows: List[GatewayDef] = []
- with p.open("r", encoding="utf-8", errors="ignore", newline="") as f:
- rd = csv.DictReader(f, delimiter=delim)
- for r in rd:
- # accetta anche varianti tipo 'MAC' o 'gw_mac'
- mac_raw = r.get("mac") or r.get("MAC") or r.get("gw_mac") or r.get("gateway_mac")
- if not mac_raw:
- continue
- mac = norm_mac(mac_raw)
- if not mac:
- continue
-
- name = (r.get("name") or r.get("NAME") or "").strip()
- gid = (r.get("id") or r.get("ID") or "").strip()
- rows.append(GatewayDef(mac=mac, name=name, id=gid))
-
- return rows
-
-
- # ---------------------------------------------------------------------------
- # BACKWARD COMPATIBILITY
- # main.py si aspetta load_gateway_csv() -> List[GatewayDef]
- # ---------------------------------------------------------------------------
- def load_gateway_csv(path: str) -> List[GatewayDef]:
- """
- Alias compatibile per vecchie versioni.
- """
- return load_gateway_features_csv(path)
|