You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

67 line
1.9 KiB

  1. from __future__ import annotations
  2. import csv
  3. from dataclasses import dataclass
  4. from pathlib import Path
  5. from typing import List, Optional
  6. from .normalize import norm_mac
  7. @dataclass
  8. class GatewayDef:
  9. mac: str
  10. name: str = ""
  11. id: str = ""
  12. def _sniff_delimiter(sample: str) -> str:
  13. # fallback robusto: prova a sniffare, altrimenti ';'
  14. try:
  15. return csv.Sniffer().sniff(sample, delimiters=";,\t").delimiter
  16. except Exception:
  17. return ";"
  18. def load_gateway_features_csv(path: str) -> List[GatewayDef]:
  19. """
  20. Carica gateway.csv.
  21. Attesi header: mac;name;id (name/id opzionali)
  22. Normalizza MAC in formato canonico 'AA:BB:CC:DD:EE:FF'
  23. """
  24. p = Path(path)
  25. if not p.exists():
  26. raise FileNotFoundError(f"gateway csv not found: {path}")
  27. txt = p.read_text(encoding="utf-8", errors="ignore")
  28. delim = _sniff_delimiter(txt[:2048])
  29. rows: List[GatewayDef] = []
  30. with p.open("r", encoding="utf-8", errors="ignore", newline="") as f:
  31. rd = csv.DictReader(f, delimiter=delim)
  32. for r in rd:
  33. # accetta anche varianti tipo 'MAC' o 'gw_mac'
  34. mac_raw = r.get("mac") or r.get("MAC") or r.get("gw_mac") or r.get("gateway_mac")
  35. if not mac_raw:
  36. continue
  37. mac = norm_mac(mac_raw)
  38. if not mac:
  39. continue
  40. name = (r.get("name") or r.get("NAME") or "").strip()
  41. gid = (r.get("id") or r.get("ID") or "").strip()
  42. rows.append(GatewayDef(mac=mac, name=name, id=gid))
  43. return rows
  44. # ---------------------------------------------------------------------------
  45. # BACKWARD COMPATIBILITY
  46. # main.py si aspetta load_gateway_csv() -> List[GatewayDef]
  47. # ---------------------------------------------------------------------------
  48. def load_gateway_csv(path: str) -> List[GatewayDef]:
  49. """
  50. Alias compatibile per vecchie versioni.
  51. """
  52. return load_gateway_features_csv(path)