Track LAN client connection time

This commit is contained in:
seo
2026-07-20 23:29:37 +09:00
parent 7425148af8
commit 2261d3ebe4
4 changed files with 62 additions and 34 deletions
+30 -24
View File
@@ -2739,7 +2739,7 @@ function lan_client_rows(array $leases, array $aliases, string $iface = 'eth1'):
'tx_bitrate_source' => 'lan',
'rx_bitrate_source' => 'lan',
'connected_time' => 'N/A',
'inactive_time' => 'N/A',
'inactive_time' => '-',
'rx_bytes' => 0,
'tx_bytes' => 0,
'rx_packets' => 0,
@@ -2908,47 +2908,53 @@ function wifi_valid_mac(string $mac): bool
return preg_match('/^[0-9a-f]{2}(?::[0-9a-f]{2}){5}$/', strtolower($mac)) === 1;
}
function prune_observed_wifi_sessions(PDO $pdo, array $visibleMacs): void
function prune_observed_wifi_sessions(PDO $pdo, array $visibleMacsByBand): void
{
$visibleMacs = array_values(array_unique(array_filter(
array_map(static fn($mac) => strtolower((string)$mac), $visibleMacs),
static fn($mac) => wifi_valid_mac($mac)
)));
foreach (['5G', 'LAN'] as $band) {
$visibleMacs = array_values(array_unique(array_filter(
array_map(static fn($mac) => strtolower((string)$mac), $visibleMacsByBand[$band] ?? []),
static fn($mac) => wifi_valid_mac($mac)
)));
if ($visibleMacs === []) {
$pdo->exec("DELETE FROM wifi_observed_sessions WHERE band = '5G'");
return;
if ($visibleMacs === []) {
$stmt = $pdo->prepare("DELETE FROM wifi_observed_sessions WHERE band = ?");
$stmt->execute([$band]);
continue;
}
$placeholders = implode(',', array_fill(0, count($visibleMacs), '?'));
$stmt = $pdo->prepare("
DELETE FROM wifi_observed_sessions
WHERE band = ?
AND mac NOT IN ($placeholders)
");
$stmt->execute(array_merge([$band], $visibleMacs));
}
$placeholders = implode(',', array_fill(0, count($visibleMacs), '?'));
$stmt = $pdo->prepare("
DELETE FROM wifi_observed_sessions
WHERE band = '5G'
AND mac NOT IN ($placeholders)
");
$stmt->execute($visibleMacs);
}
function observed_wifi_duration_seconds(array $clients): array
{
$targets = [];
$visible5gMacs = [];
$visibleMacsByBand = [
'5G' => [],
'LAN' => [],
];
foreach ($clients as $client) {
$band = (string)($client['band'] ?? '');
$mac = strtolower((string)($client['mac'] ?? ''));
if ($band !== '5G' || !wifi_valid_mac($mac)) {
if (!in_array($band, ['5G', 'LAN'], true) || !wifi_valid_mac($mac)) {
continue;
}
$visible5gMacs[] = $mac;
$visibleMacsByBand[$band][] = $mac;
if (!wifi_connected_time_missing($client['connected_time'] ?? null)) {
continue;
}
$targets[$mac] = [
$targets[$band . ':' . $mac] = [
'mac' => $mac,
'band' => $band,
'iface' => (string)($client['iface'] ?? ''),
@@ -2960,7 +2966,7 @@ function observed_wifi_duration_seconds(array $clients): array
try {
$pdo = db();
$pdo->beginTransaction();
prune_observed_wifi_sessions($pdo, $visible5gMacs);
prune_observed_wifi_sessions($pdo, $visibleMacsByBand);
if ($targets === []) {
$pdo->commit();
@@ -2998,7 +3004,7 @@ function observed_wifi_duration_seconds(array $clients): array
FROM wifi_observed_sessions
WHERE mac IN ($placeholders)
");
$stmt->execute(array_keys($targets));
$stmt->execute(array_values(array_unique(array_column($targets, 'mac'))));
$rows = $stmt->fetchAll();
$pdo->commit();
@@ -3029,7 +3035,7 @@ function apply_observed_wifi_connected_time(array $clients): array
foreach ($clients as &$client) {
$mac = strtolower((string)($client['mac'] ?? ''));
if (($client['band'] ?? '') !== '5G'
if (!in_array((string)($client['band'] ?? ''), ['5G', 'LAN'], true)
|| !wifi_connected_time_missing($client['connected_time'] ?? null)
|| !array_key_exists($mac, $observedSeconds)
) {
+19 -2
View File
@@ -1346,6 +1346,23 @@
return formatDhms(parseWifiDurationSeconds(value)) || value;
}
function wifiCellValue(row, key) {
const value = row?.[key];
const text = String(value ?? '').trim();
if (row?.band === 'LAN' && (text === '' || text.toUpperCase() === 'N/A')) {
return '-';
}
return text || '-';
}
function wifiConnectedCellValue(row) {
if (row?.band === 'LAN' && wifiCellValue(row, 'connected_time') === '-') {
return '-';
}
return wifiConnectedTime(row?.connected_time);
}
function eventStateText(eventState, activeKey, normalKey, recoveringKey, repeatedKey, seenKey, notSeenKey) {
if (!eventState || eventState.available === false) {
return t('na');
@@ -1415,8 +1432,8 @@
${wifiMetricCell(row, 'signal')}
${wifiMetricCell(row, 'tx_bitrate')}
${wifiMetricCell(row, 'rx_bitrate')}
${td(wifiConnectedTime(row.connected_time))}
${td(row.inactive_time)}
${td(wifiConnectedCellValue(row))}
${td(wifiCellValue(row, 'inactive_time'))}
</tr>
`).join('')
: `<tr><td colspan="9">${escapeHtml(t('noWifiClients'))}</td></tr>`;