diff --git a/extensions/Servers/Proxmox/Livewire/Firewall.php b/extensions/Servers/Proxmox/Livewire/Firewall.php index 32a227e1e..4d7d1075e 100644 --- a/extensions/Servers/Proxmox/Livewire/Firewall.php +++ b/extensions/Servers/Proxmox/Livewire/Firewall.php @@ -1152,6 +1152,49 @@ class Firewall extends Component return $result; } + /** + * Fetch IP location data from ip-api.com + */ + public function fetchIPLocation(string $ip): array + { + try { + // Validate IP address + if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { + return [ + 'status' => 'fail', + 'message' => 'Invalid or private IP address' + ]; + } + + // Fetch location data from ip-api.com (HTTP endpoint) + $response = Http::timeout(5)->get("http://ip-api.com/json/{$ip}"); + + if ($response->successful()) { + $data = $response->json(); + + // Check if the API returned success + if (isset($data['status']) && $data['status'] === 'success') { + return $data; + } else { + return [ + 'status' => 'fail', + 'message' => $data['message'] ?? 'Unable to fetch location data' + ]; + } + } + + return [ + 'status' => 'fail', + 'message' => 'Failed to fetch location data (HTTP ' . $response->status() . ')' + ]; + } catch (\Exception $e) { + return [ + 'status' => 'fail', + 'message' => 'Error: ' . $e->getMessage() + ]; + } + } + public function render() { return view('proxmox::firewall')->layoutData([ diff --git a/extensions/Servers/Proxmox/views/firewall.blade.php b/extensions/Servers/Proxmox/views/firewall.blade.php index ac7d5c8f7..0f688e845 100644 --- a/extensions/Servers/Proxmox/views/firewall.blade.php +++ b/extensions/Servers/Proxmox/views/firewall.blade.php @@ -537,18 +537,350 @@ @@ -854,4 +1186,198 @@ @endif +@script + +@endscript +