2603.18 - frequenet added since parameter

This commit is contained in:
2026-03-16 10:22:43 -04:00
parent 4281c75631
commit 5d4242dcb4
3 changed files with 34 additions and 7 deletions

View File

@@ -11,7 +11,9 @@
* - ?token=<TRIGGER_TOKEN> * - ?token=<TRIGGER_TOKEN>
* *
* Optional query parameters: * Optional query parameters:
* threshold int Override the configured minimum connection count * threshold int Override the configured minimum connection count
* since string YYYYMMDDHHmmss (e.g. "20260315000000"); only IPs
* with a last_seen >= this value are returned
*/ */
require_once __DIR__ . '/../includes/auth.php'; require_once __DIR__ . '/../includes/auth.php';
@@ -55,11 +57,23 @@ $threshold = isset($_GET['threshold'])
? max(1, (int)$_GET['threshold']) ? max(1, (int)$_GET['threshold'])
: $configured_threshold; : $configured_threshold;
$rows = frequent_ips($threshold); $since = null;
if (isset($_GET['since']) && $_GET['since'] !== '') {
$dt = DateTime::createFromFormat('YmdHis', $_GET['since']);
if ($dt === false) {
http_response_code(400);
echo json_encode(['error' => 'Invalid since parameter; expected YYYYMMDDHHmmss e.g. 20260315000000']);
exit;
}
$since = $dt->format('Y-m-d H:i:s');
}
$rows = frequent_ips($threshold, $since);
echo json_encode([ echo json_encode([
'threshold' => $threshold, 'threshold' => $threshold,
'configured_threshold' => $configured_threshold, 'configured_threshold' => $configured_threshold,
'since' => $since,
'count' => count($rows), 'count' => count($rows),
'ips' => array_map(fn($r) => [ 'ips' => array_map(fn($r) => [
'src_ip' => $r['src_ip'], 'src_ip' => $r['src_ip'],

View File

@@ -203,19 +203,32 @@ function set_setting(string $key, string $value): void {
/** /**
* Return all IPs with a total connection count >= $min_connections, sorted * Return all IPs with a total connection count >= $min_connections, sorted
* highest-count first. Includes first and last seen timestamps. * highest-count first. Includes first and last seen timestamps.
*
* @param int $min_connections Minimum number of connections to include.
* @param string|null $since Optional ISO datetime; only IPs whose
* most-recent connection is >= this value
* are returned.
*/ */
function frequent_ips(int $min_connections): array { function frequent_ips(int $min_connections, ?string $since = null): array {
$having = 'total_connections >= ?';
$params = [$min_connections];
if ($since !== null) {
$having .= ' AND last_seen >= ?';
$params[] = $since;
}
$s = db()->prepare( $s = db()->prepare(
'SELECT src_ip, 'SELECT src_ip,
COUNT(*) AS total_connections, COUNT(*) AS total_connections,
MIN(occurred_at) AS first_seen, MIN(occurred_at) AS first_seen,
MAX(occurred_at) AS last_seen MAX(occurred_at) AS last_seen
FROM connections FROM connections
GROUP BY src_ip GROUP BY src_ip
HAVING total_connections >= ? HAVING ' . $having . '
ORDER BY total_connections DESC' ORDER BY total_connections DESC'
); );
$s->execute([$min_connections]); $s->execute($params);
return $s->fetchAll(); return $s->fetchAll();
} }

View File

@@ -1,2 +1,2 @@
<?php <?php
define('APP_VERSION', '2603.15'); define('APP_VERSION', '2603.18');