Track LAN client connection time
This commit is contained in:
+30
-24
@@ -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)
|
||||
) {
|
||||
|
||||
Reference in New Issue
Block a user