diff --git a/extensions/Servers/Proxmox/Livewire/Firewall.php b/extensions/Servers/Proxmox/Livewire/Firewall.php index 8a7e92090..3db741fe9 100644 --- a/extensions/Servers/Proxmox/Livewire/Firewall.php +++ b/extensions/Servers/Proxmox/Livewire/Firewall.php @@ -923,6 +923,9 @@ class Firewall extends Component } } + // Group similar logs + $this->firewallLogs = $this->groupSimilarLogs($this->firewallLogs); + \Log::debug('Firewall logs processing complete', [ 'raw_logs_count' => count($rawLogs), 'parsed_logs_count' => count($this->firewallLogs), @@ -957,6 +960,76 @@ class Firewall extends Component } } + /** + * Group similar log entries together + */ + protected function groupSimilarLogs(array $logs): array + { + if (empty($logs)) { + return []; + } + + $grouped = []; + $groups = []; + + foreach ($logs as $log) { + // Create a signature for grouping: action + protocol + source + destination + dest_port + $signature = sprintf( + '%s|%s|%s|%s|%s', + $log['action'] ?? '', + $log['protocol'] ?? '', + $log['source'] ?? '', + $log['destination'] ?? '', + $log['destination_port'] ?? '' + ); + + if (!isset($groups[$signature])) { + $groups[$signature] = [ + 'signature' => $signature, + 'count' => 0, + 'first_log' => $log, + 'last_timestamp' => $log['timestamp_iso'] ?? null, + 'first_timestamp' => $log['timestamp_iso'] ?? null, + 'logs' => [], + ]; + } + + $groups[$signature]['count']++; + $groups[$signature]['logs'][] = $log; + + // Update timestamps + if ($log['timestamp_iso']) { + if (!$groups[$signature]['first_timestamp'] || $log['timestamp_iso'] < $groups[$signature]['first_timestamp']) { + $groups[$signature]['first_timestamp'] = $log['timestamp_iso']; + } + if (!$groups[$signature]['last_timestamp'] || $log['timestamp_iso'] > $groups[$signature]['last_timestamp']) { + $groups[$signature]['last_timestamp'] = $log['timestamp_iso']; + } + } + } + + // Convert groups to array and add group metadata + foreach ($groups as $group) { + $firstLog = $group['first_log']; + $firstLog['is_group'] = $group['count'] > 1; + $firstLog['group_count'] = $group['count']; + $firstLog['grouped_logs'] = $group['logs']; + $firstLog['group_first_timestamp'] = $group['first_timestamp']; + $firstLog['group_last_timestamp'] = $group['last_timestamp']; + + $grouped[] = $firstLog; + } + + // Sort by most recent timestamp + usort($grouped, function($a, $b) { + $aTime = $a['group_last_timestamp'] ?? $a['timestamp_iso'] ?? ''; + $bTime = $b['group_last_timestamp'] ?? $b['timestamp_iso'] ?? ''; + return strcmp($bTime, $aTime); // Descending order (most recent first) + }); + + return $grouped; + } + protected function parseFirewallLog(string $logText): array { $result = [ diff --git a/extensions/Servers/Proxmox/views/firewall.blade.php b/extensions/Servers/Proxmox/views/firewall.blade.php index bda14b224..de64847f1 100644 --- a/extensions/Servers/Proxmox/views/firewall.blade.php +++ b/extensions/Servers/Proxmox/views/firewall.blade.php @@ -452,14 +452,68 @@