fix: get_interfaces_ip() uses overview/export statt addresses/export

Das /api/interfaces/addresses/export Endpoint existiert nicht auf allen
OPNsense-Versionen. Stattdessen wird /api/interfaces/overview/export
genutzt (gleiche Quelle wie get_interfaces()), um addr4/addr6 zu parsen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Christian Manivong
2026-06-06 15:00:38 +02:00
co-authored by Claude Sonnet 4.6
parent 4434d4195f
commit 908024345e
+38 -9
View File
@@ -230,7 +230,7 @@ class OPNsenseDriver(FirewallDriver):
def get_interfaces_ip(self) -> Dict[str, Dict[str, Any]]: def get_interfaces_ip(self) -> Dict[str, Dict[str, Any]]:
"""Return IP addresses grouped by interface name. """Return IP addresses grouped by interface name.
Calls ``GET /api/interfaces/addresses/export``. Uses ``GET /api/interfaces/overview/export`` (same source as get_interfaces).
Structure:: Structure::
@@ -241,17 +241,46 @@ class OPNsenseDriver(FirewallDriver):
} }
} }
""" """
data = self._get("/api/interfaces/addresses/export") import ipaddress
data = self._get("/api/interfaces/overview/export")
items: list = data if isinstance(data, list) else data.get("interfaces", [])
result: Dict[str, Dict[str, Any]] = {} result: Dict[str, Dict[str, Any]] = {}
for item in data.get("items", []): def _add(ifname: str, cidr: str, family: str) -> None:
ifname: str = item["interface"] try:
ip: str = item["address"] iface_obj = ipaddress.ip_interface(cidr)
prefix: int = int(item["prefix"]) ip = str(iface_obj.ip)
family = "ipv6" if ":" in ip else "ipv4" prefix = iface_obj.network.prefixlen
result.setdefault(ifname, {"ipv4": {}, "ipv6": {}})
result[ifname][family][ip] = {"prefix_length": prefix}
except ValueError:
pass
result.setdefault(ifname, {"ipv4": {}, "ipv6": {}}) for iface in items:
result[ifname][family][ip] = {"prefix_length": prefix} name: str = iface.get("device") or iface.get("name", "")
if not name:
continue
addr4: str = iface.get("addr4", "")
addr6: str = iface.get("addr6", "")
if addr4:
_add(name, addr4, "ipv4")
if addr6:
_add(name, addr6, "ipv6")
if not addr4:
for entry in iface.get("ipv4") or []:
ip_field = entry.get("ipaddr") or entry.get("ip", "")
subnet = entry.get("subnetbits") or entry.get("prefix_length")
cidr = f"{ip_field}/{subnet}" if subnet and "/" not in ip_field else ip_field
if cidr:
_add(name, cidr, "ipv4")
if not addr6:
for entry in iface.get("ipv6") or []:
ip_field = entry.get("ipaddr") or entry.get("ip", "")
prefix = entry.get("prefixlen") or entry.get("prefix_length")
cidr = f"{ip_field}/{prefix}" if prefix and "/" not in ip_field else ip_field
if cidr:
_add(name, cidr, "ipv6")
return result return result