diff --git a/src/opnsense/mvc/app/controllers/OPNsense/DHCPv6/Api/LeasesController.php b/src/opnsense/mvc/app/controllers/OPNsense/DHCPv6/Api/LeasesController.php index 3861894d5..88e596af3 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/DHCPv6/Api/LeasesController.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/DHCPv6/Api/LeasesController.php @@ -60,7 +60,6 @@ class LeasesController extends ApiControllerBase /* set defaults */ $lease = []; $lease['type'] = 'dynamic'; - $lease['status'] = 'offline'; $lease['lease_type'] = $raw_lease['lease_type']; $lease['iaid'] = $raw_lease['iaid']; $lease['duid'] = $raw_lease['duid']; @@ -84,8 +83,7 @@ class LeasesController extends ApiControllerBase } $lease['address'] = $seg['iaaddr']; - $lease['online'] = in_array(strtolower($seg['iaaddr']), $online) ? 'online' : 'offline'; - + $lease['status'] = in_array(strtolower($lease['address']), $online) ? 'online' : 'offline'; $leases[] = $lease; } @@ -111,7 +109,7 @@ class LeasesController extends ApiControllerBase $leases = array_merge($leases, $statics); $mac_man = json_decode($backend->configdRun('interface list macdb json'), true); - $interfaces = []; + $lease_interfaces = []; /* fetch interfaces ranges so we can match leases to interfaces */ $if_ranges = []; @@ -122,9 +120,15 @@ class LeasesController extends ApiControllerBase } } + $raw_intfs = []; + foreach ($config->interfaces->children() as $if => $if_props) { + $raw_intfs[(string)$if_props->if] = (string)$if_props->descr ?: strtoupper($if); + } + foreach ($leases as $idx => $lease) { $leases[$idx]['man'] = ''; $leases[$idx]['mac'] = ''; + $done = false; /* We infer the MAC from NDP data if available, otherwise we extract it out * of the DUID. However, RFC8415 section 11 states that an attempt to parse * a DUID to obtain a client's link-layer addresss is unreliable, as there is no @@ -138,11 +142,21 @@ class LeasesController extends ApiControllerBase if ($ndp['ip'] == $lease['address']) { $leases[$idx]['mac'] = $ndp['mac']; $leases[$idx]['man'] = empty($ndp['manufacturer']) ? '' : $ndp['manufacturer']; + $leases[$idx]['if'] = $ndp['intf']; + $leases[$idx]['if_descr'] = $raw_intfs[$ndp['intf']]; + if (!empty($leases[$idx]['if_descr'])) { + $lease_interfaces[$leases[$idx]['if']] = $leases[$idx]['if_descr']; + } + $done = true; break; } } + if ($done) { + continue; + } } + /* include MAC */ if (!empty($lease['duid'])) { $mac = ''; $duid_type = substr($lease['duid'], 0, 5); @@ -164,19 +178,14 @@ class LeasesController extends ApiControllerBase } /* include interface */ - $intf = ''; - $intf_descr = ''; if (!empty($lease['if'])) { - $if = $config->interfaces->{$lease['if']}; - if (!empty((string)$if->ipaddrv6) && Util::isIpAddress((string)$if->ipaddrv6)) { - $intf = $lease['if']; - $intf_descr = (string)$if->descr ?: strtoupper($intf); - } + $intf = $lease['if']; + $intf_descr = $raw_intfs[$lease['if']]; } else { foreach ($if_ranges as $if_name => $if_range) { if (!empty($lease['address']) && Util::isIPInCIDR($lease['address'], $if_range)) { $intf = $if_name; - $intf_descr = (string)$config->interfaces->$if_name->descr ?: strtoupper($if_name); + $intf_descr = $raw_intfs[$if_name]; break; } } @@ -185,8 +194,8 @@ class LeasesController extends ApiControllerBase $leases[$idx]['if'] = $intf; $leases[$idx]['if_descr'] = $intf_descr; - if (!empty($intf_descr) && !array_key_exists($intf, $interfaces)) { - $interfaces[$intf] = $intf_descr; + if (!empty($intf_descr) && !array_key_exists($intf, $lease_interfaces)) { + $lease_interfaces[$intf] = $intf_descr; } } @@ -198,7 +207,7 @@ class LeasesController extends ApiControllerBase return false; }, SORT_REGULAR); - $response['interfaces'] = $interfaces; + $response['interfaces'] = $lease_interfaces; return $response; } diff --git a/src/opnsense/mvc/app/views/OPNsense/DHCPv4/leases.volt b/src/opnsense/mvc/app/views/OPNsense/DHCPv4/leases.volt index 3b5d81de9..202447d3a 100644 --- a/src/opnsense/mvc/app/views/OPNsense/DHCPv4/leases.volt +++ b/src/opnsense/mvc/app/views/OPNsense/DHCPv4/leases.volt @@ -91,7 +91,7 @@ return row.mac; }, "statusformatter": function (column, row) { - let connected = row.status == 'offline' ? 'text-danger' : 'text-success'; + let connected = row.status == 'online' ? 'text-success' : 'text-danger'; return '' }, "commands": function (column, row) { diff --git a/src/opnsense/mvc/app/views/OPNsense/DHCPv6/leases.volt b/src/opnsense/mvc/app/views/OPNsense/DHCPv6/leases.volt index 1abdcbc09..f63ef1248 100644 --- a/src/opnsense/mvc/app/views/OPNsense/DHCPv6/leases.volt +++ b/src/opnsense/mvc/app/views/OPNsense/DHCPv6/leases.volt @@ -92,7 +92,7 @@ return row.mac; }, "statusformatter": function (column, row) { - let connected = row.status == 'offline' ? 'text-danger' : 'text-success'; + let connected = row.status == 'online' ? 'text-success' : 'text-danger'; return '' }, "commands": function (column, row) {