diff --git a/extensions/Servers/Proxmox/views/overview.blade.php b/extensions/Servers/Proxmox/views/overview.blade.php index c55be98d0..31f1e4608 100644 --- a/extensions/Servers/Proxmox/views/overview.blade.php +++ b/extensions/Servers/Proxmox/views/overview.blade.php @@ -6,7 +6,6 @@ :status-polling-interval="'2s'" > @if(!$status) - {{-- Error state when status cannot be loaded --}} Unable to Load Server Status

Could not retrieve status from hypervisor:

@@ -20,1031 +19,14 @@
@else -<<<<<<< HEAD -======= - - -
-
-
- -
-
-

Cloud-init Configuration Notice

- -
-
-

- Hostname, password, and networking settings are configured automatically via cloud-init. - This applies to standard operating system installations that support cloud-init. However, if you are: -

-
    -
  • Installing from an ISO image
  • -
  • Configuring the operating system manually during installation
  • -
  • Using Windows (which does not support cloud-init)
  • -
-

- You will need to manually configure networking, security settings, and hostname within the operating system, as cloud-init will not be available in these scenarios. -

-
-
-
-
- -
- - - -

- Complete overview of your virtual machine including real-time resource usage, server status, network configuration, and DNS information. -

-
-
-
- - - -
-
-

Status

-

Power state with real-time updates every 2-30 seconds.

-
-
-
-
- - - -
-
-

Resources

-

CPU, memory usage, and uptime statistics from the hypervisor.

-
-
-
-
- - - -
-
-

Network

-

IPv4/IPv6 addresses and DNS configuration for your VM.

-
-
-
-
-
-
- ->>>>>>> c5530e923149080e7d739823785456eb3267393f @php - // Calculate resource metrics + // Resource calculations $cpuCores = max(1, (int)($status->cpus ?? 1)); $cpuUsagePercent = round(max(0, ($status->cpu ?? 0) * 100), 1); $memoryTotal = (int)($status->maxmem ?? 0); $memoryUsed = (int)($status->mem ?? 0); $memoryPercent = $memoryTotal > 0 ? round(($memoryUsed / $memoryTotal) * 100, 1) : 0; -<<<<<<< HEAD -======= - $manualSnapshotLimit = 5; - $manualSnapshotUsed = $server->statistics()->where('is_automatic', false)->count(); - $manualSnapshotPercent = $manualSnapshotLimit > 0 - ? round(($manualSnapshotUsed / $manualSnapshotLimit) * 100, 1) - : 0; - - $badgeForPercent = function (float $value) { - if ($value >= 100) { - return ['label' => 'Over entitlement', 'class' => 'text-red-600 bg-red-100 dark:text-red-400 dark:bg-red-900']; - } - - if ($value >= 85) { - return ['label' => 'Watchlist', 'class' => 'text-amber-600 bg-amber-100 dark:text-amber-400 dark:bg-amber-900']; - } - - return ['label' => 'Healthy', 'class' => 'text-emerald-600 bg-emerald-100 dark:text-emerald-400 dark:bg-emerald-900']; - }; - - $cpuBadge = $badgeForPercent($cpuUsagePercent); - $memoryBadge = $badgeForPercent($memoryPercent); - $reportedUptime = $this->status && isset($this->status->uptime) - ? $this->formatSeconds($this->status->uptime) - : 'N/A'; - - $powerStats = $this->powerEventStats ?? [ - 'starts' => 0, - 'shutdowns' => 0, - 'reboots' => 0, - 'uptime_percent' => 0, - 'samples' => 0, - ]; - - $resourceAllocations = [ - [ - 'label' => 'CPU Allocation', - 'used_percent' => $cpuUsagePercent, - 'usage_summary' => number_format(($status->cpu ?? 0) * $cpuCores, 2) . ' / ' . $cpuCores . ' vCPU', - 'entitlement_label' => $cpuCores . ' vCPU entitlement', - 'description' => 'Live hypervisor usage sampled directly from the cluster.', - 'gradient' => 'linear-gradient(90deg, #38bdf8 0%, #6366f1 100%)', - 'badge' => $cpuBadge, - ], - [ - 'label' => 'Memory Allocation', - 'used_percent' => $memoryPercent, - 'usage_summary' => ($memoryTotal > 0 - ? \Illuminate\Support\Number::fileSize(bytes: $memoryUsed) . ' / ' . \Illuminate\Support\Number::fileSize(bytes: $memoryTotal) - : \Illuminate\Support\Number::fileSize(bytes: $memoryUsed) . ' / N/A'), - 'entitlement_label' => $memoryTotal > 0 - ? \Illuminate\Support\Number::fileSize(bytes: $memoryTotal) . ' entitlement' - : 'Entitlement unavailable', - 'description' => 'Calculated from the VPS\'s provisioned RAM.', - 'gradient' => 'linear-gradient(90deg, #34d399 0%, #10b981 100%)', - 'badge' => $memoryBadge, - ], - [ - 'label' => 'Hypervisor Uptime', - 'used_percent' => null, - 'usage_summary' => $reportedUptime, - 'entitlement_label' => ($powerStats['starts'] ?? 0) . ' starts • ' . ($powerStats['shutdowns'] ?? 0) . ' shutdowns • ' . ($powerStats['reboots'] ?? 0) . ' reboots', - 'description' => 'Shows the live uptime reported by the hypervisor plus counts from the task history.', - 'gradient' => 'linear-gradient(90deg, #a855f7 0%, #ec4899 100%)', - 'badge' => ['label' => 'Live', 'class' => 'text-blue-600 bg-blue-100 dark:text-blue-400 dark:bg-blue-900'], - ], - ]; - - $networkRates = $this->networkRateStats ?? ['in_rate' => 0, 'out_rate' => 0]; - $formatRate = function ($bytesPerSecond) { - if ($bytesPerSecond >= 1073741824) { - return number_format($bytesPerSecond / 1073741824, 2) . ' GiB/s'; - } - if ($bytesPerSecond >= 1048576) { - return number_format($bytesPerSecond / 1048576, 2) . ' MiB/s'; - } - if ($bytesPerSecond >= 1024) { - return number_format($bytesPerSecond / 1024, 2) . ' KiB/s'; - } - - return number_format($bytesPerSecond, 0) . ' B/s'; - }; - $rateScale = 5 * 1024 * 1024; // 5 MiB/s caps the bar width - $aggregateRate = ($networkRates['in_rate'] ?? 0) + ($networkRates['out_rate'] ?? 0); - $totalNetworkBytes = (int) (($status->netin ?? 0) + ($status->netout ?? 0)); - $totalNetworkFormatted = number_format($totalNetworkBytes / 1024 / 1024, 2); - $lastSampleTimestamp = now()->toIso8601String(); - @endphp - - -
- @foreach($resourceAllocations as $index => $resource) -
-
-

{{ $resource['label'] }}

- @if(isset($resource['badge'])) - - {{ $resource['badge']['label'] }} - - @endif -
-
-
{{ $resource['usage_summary'] }}
-

{{ $resource['entitlement_label'] }}

-
- @if($resource['used_percent'] !== null) -
-
-
-
-
- {{ number_format($resource['used_percent'], 1) }}% - @if($resource['used_percent'] > 100) - Over entitlement - @endif -
-
- @endif -
- @endforeach -
- - -
- -
-
-
- -

Server Information

-
-
-
-
- -
-
- - Status -
-
- @if ($status && $status->status === 'running') - - - Running - - @else - - - Stopped - - @endif -
-
- -
-
- - Operating System -
- {{ $server->os->name }} -
- -
-
- - Hostname -
-
- {{ $server->hostname ?? $status->name ?? 'N/A' }} - -
- - - - -
- - - @if($server->primaryIpv4) -
-
- - IPv4 Address -
-
- {{ $server->primaryIpv4->ip }} - -
-
- @endif - - - @if($server->primaryIpv6) -
-
- - IPv6 Address -
-
- {{ $server->primaryIpv6->ip }} - -
-
- @endif - - -
-
- - Root Password -
-
- - @if(isset($server->password) && $server->password) - •••••••• - @else - Emailed - @endif - - @if(isset($server->password) && $server->password) - - @endif - -
- - - - - - - - -
-
-
-
- - Cancel - - - Save - - - Save & Apply - -
-
-
- - - - -
-
- Reinstall Server -

Data permanently deleted. Irreversible.

-
- -
- - - -
-
-
-
- -

DNS Configuration

-
- - - -
-
- -
-
Primary IPv6: {{ $server->primaryIpv6->ip }}
- - -
-
- Virtnet Internal - {{ str_replace(':', '-', $server->primaryIpv6->ip) . '.virtnet.host' }} -
-
- -
-
- - -
-
- nip.io (Public) - {{ str_replace(':', '-', $server->primaryIpv6->ip) . '.nip.io' }} -
-
- -
-
- - -
-
- sslip.io (Public) - {{ str_replace(':', '-', $server->primaryIpv6->ip) . '.sslip.io' }} -
-
- -
-
- - -
-
- backname.io (Public) - {{ str_replace(':', '-', $server->primaryIpv6->ip) . '.backname.io' }} -
-
- -
-
-
-
-
-

- - DNS Resolution -

-

- @ = root domain → {{ $server->primaryIpv6->ip }} | *.@ = wildcard subdomains → same IP -

-

- rDNS PTR: No PTR records via RIR systems except direct contract customers. -

-
-
- - @if(stripos($server->os->name, 'Windows') !== false) -
-
-
-
- -

Windows Server

-
- - - -
-
- -
-
- -
-

IPv4/IPv6 Setup

-

Configure addresses manually within Windows Network Configuration.

-
-
-
- -
-

Licensing Compliance

-

You're responsible for maintaining valid Windows licensing for your installation.

-
-
-
- -
-

Audit Risks

-

Non-compliant installations may be suspended after verification audits.

-
-
-
-
-
- @endif - - - -
-
-
-
- -

Notes

-
- - - -
- (Markdown • Cleared on reinstall) -
- -
- - - - - -
- @if($isEditingNotes) -
- - @if($notesError) -
- - {{ $notesError }} -
- @endif -
- - -
-
- @else -
-
- @if($notes) - {!! \Illuminate\Support\Str::markdown(e($notes), [ - 'allow_unsafe_links' => false, - 'renderer' => ['soft_break' => "
"] - ]) !!} - @else -

No notes yet. Click Edit to add some.

- @endif -
- -
- @endif -
-
-
- - - @php - // Gather comprehensive server information ->>>>>>> c5530e923149080e7d739823785456eb3267393f $diskTotal = (int)($status->maxdisk ?? 0); $diskUsed = (int)($status->disk ?? 0); $diskPercent = $diskTotal > 0 ? round(($diskUsed / $diskTotal) * 100, 1) : 0; @@ -1055,13 +37,9 @@ : 'N/A'; // Power stats - $powerStats = $this->powerEventStats ?? [ - 'starts' => 0, - 'shutdowns' => 0, - 'reboots' => 0, - ]; + $powerStats = $this->powerEventStats ?? ['starts' => 0, 'shutdowns' => 0, 'reboots' => 0]; - // Network + // Network totals $totalNetIn = (int)($status->netin ?? 0); $totalNetOut = (int)($status->netout ?? 0); @@ -1071,7 +49,6 @@ $allocatedMemoryMiB = $productSettings->where('key', 'memory')->first()?->value ?? 0; $allocatedDiskGiB = $productSettings->where('key', 'disk')->first()?->value ?? 0; $allocatedBackups = $productSettings->where('key', 'backups')->first()?->value ?? 0; - $servicePlan = $server->service?->plan; $serviceExpires = $server->service?->expires_at; $serviceStatus = $server->service?->status ?? 'unknown'; $productName = $server->service?->product?->name ?? 'Unknown Product'; @@ -1079,59 +56,47 @@ $nodeName = $server->node?->name ?? 'Unknown'; // Badge helper - $badgeForPercent = function (float $value) { - if ($value >= 100) return ['label' => 'Critical', 'class' => 'bg-error/15 text-error']; - if ($value >= 85) return ['label' => 'Warning', 'class' => 'bg-warning/15 text-warning']; + $getBadge = function($percent) { + if ($percent >= 90) return ['label' => 'Critical', 'class' => 'bg-error/15 text-error']; + if ($percent >= 75) return ['label' => 'Warning', 'class' => 'bg-warning/15 text-warning']; return ['label' => 'Healthy', 'class' => 'bg-success/15 text-success']; }; - $cpuBadge = $badgeForPercent($cpuUsagePercent); - $memoryBadge = $badgeForPercent($memoryPercent); @endphp -
+
-
+
-

- The Server Overview provides a comprehensive real-time dashboard of your virtual machine's status, resource utilization, and configuration details. +

+ The Server Overview provides a comprehensive dashboard of your virtual machine's status, resource utilization, and configuration.

-
-

- Resource Metrics: Live CPU, memory, and storage utilization with health indicators. -

-

- Server Details: Operating system, hostname, IP addresses, and credentials. -

-

- DNS Configuration: Available hostname resolution options for your server. -

-

- Infrastructure: Datacenter location, billing cycle, and service information. -

+
+

Resource Metrics: Live CPU, memory utilization with health indicators.

+

Server Details: OS, hostname, IP addresses, and credentials.

+

DNS Configuration: Automatic hostname resolution options.

- -
-
- -

Resource Metrics

- - @if($status && $status->status === 'running') + +
+
+
+ +

Resource Metrics

+
+ + @if($status->status === 'running') Running @else @@ -1141,7 +106,7 @@
-
+
@@ -1149,12 +114,12 @@
- CPU + CPU
- {{ $cpuBadge['label'] }} + {{ $getBadge($cpuUsagePercent)['label'] }}
{{ $cpuUsagePercent }}%
-

{{ number_format(($status->cpu ?? 0) * $cpuCores, 2) }} / {{ $cpuCores }} vCPU

+

{{ $cpuCores }} vCPU allocated

@@ -1164,17 +129,17 @@
-
- +
+
- Memory + Memory
- {{ $memoryBadge['label'] }} + {{ $getBadge($memoryPercent)['label'] }}
{{ $memoryPercent }}%
-

{{ \Illuminate\Support\Number::fileSize(bytes: $memoryUsed) }} / {{ \Illuminate\Support\Number::fileSize(bytes: $memoryTotal) }}

+

{{ \Illuminate\Support\Number::fileSize($memoryUsed) }} / {{ \Illuminate\Support\Number::fileSize($memoryTotal) }}

-
+
@@ -1182,65 +147,62 @@
-
- +
+
- Uptime + Uptime
Live
{{ $reportedUptime }}
-

{{ $powerStats['starts'] }} starts • {{ $powerStats['shutdowns'] }} shutdowns • {{ $powerStats['reboots'] }} reboots

+

{{ $powerStats['starts'] }} starts • {{ $powerStats['shutdowns'] }} stops • {{ $powerStats['reboots'] }} reboots

- +
- -
-
+ +
+

Server Details

-
+
-
+
Status - - @if($status && $status->status === 'running') + + @if($status->status === 'running') - Running - @else - Stopped @endif + {{ ucfirst($status->status) }}
- -
+ +
Operating System - {{ $server->os->name }} + {{ $server->os->name ?? 'Unknown' }}
-
+
Hostname
{{ $server->hostname ?? $status->name ?? 'N/A' }} -
- + @if($server->primaryIpv4) -
+
IPv4 Address
{{ $server->primaryIpv4->ip }} @@ -1252,12 +214,12 @@
@endif - + @if($server->primaryIpv6) -
+
IPv6 Address
- {{ $server->primaryIpv6->ip }} + {{ $server->primaryIpv6->ip }}
@endif - -
+ +
Root Password
- @if(isset($server->password) && $server->password) + @if($server->password) •••••••• - @else Emailed @endif -
- +
Reinstall Server -

Data permanently deleted. Irreversible.

+

Permanently deletes all data

- -
-
+ +
+

DNS Configuration

- -

- DNS hostnames that automatically resolve to your server's IP address. These work without any configuration. -

-
-

- Note: DNS is configured via cloud-init. For Windows or manual configuration, configure DNS directly within the guest OS. -

-
-
@if($server->primaryIpv6) @php $ipv6Dashed = str_replace(':', '-', $server->primaryIpv6->ip); - $dnsProviders = [ - ['name' => 'Virtnet Internal', 'domain' => $ipv6Dashed . '.virtnet.host', 'badge' => 'Internal'], - ['name' => 'nip.io', 'domain' => $ipv6Dashed . '.nip.io', 'badge' => 'Public'], - ['name' => 'sslip.io', 'domain' => $ipv6Dashed . '.sslip.io', 'badge' => 'Public'], - ['name' => 'backname.io', 'domain' => $ipv6Dashed . '.backname.io', 'badge' => 'Public'], + $dnsOptions = [ + ['name' => 'Virtnet Internal', 'domain' => $ipv6Dashed . '.virtnet.host', 'type' => 'Internal'], + ['name' => 'nip.io', 'domain' => $ipv6Dashed . '.nip.io', 'type' => 'Public'], + ['name' => 'sslip.io', 'domain' => $ipv6Dashed . '.sslip.io', 'type' => 'Public'], ]; @endphp - @foreach($dnsProviders as $provider) + @foreach($dnsOptions as $dns)
- {{ $provider['name'] }} - {{ $provider['badge'] }} + {{ $dns['name'] }} + {{ $dns['type'] }}
- {{ $provider['domain'] }} + {{ $dns['domain'] }}
- @@ -1352,231 +299,124 @@

- @ = root domain • *.@ = wildcard subdomains + These hostnames automatically resolve to your server's IP address.

- -
+ +
+
+ +

Notes

+ (Markdown supported) +
- -
-
- -

Notes

- (Markdown supported) -
- +
+ @if($isEditingNotes) +
+ + @if($notesError) +

{{ $notesError }}

+ @endif +
+ + +
-
- -
- @if($isEditingNotes) -
- - @if($notesError) -

- - {{ $notesError }} -

+ @else +
+
+ @if($notes) + {!! \Illuminate\Support\Str::markdown(e($notes), ['allow_unsafe_links' => false]) !!} + @else +

No notes yet. Click Edit to add some.

@endif -
- - -
- @else -
-
- @if($notes) - {!! \Illuminate\Support\Str::markdown(e($notes), ['allow_unsafe_links' => false, 'renderer' => ['soft_break' => "
"]]) !!} - @else -

No notes yet. Click Edit to add some.

- @endif -
- -
- @endif -
- - -
-
-
-
- -
-
- -
-

Export Error

-
-

No notes available to export. Add some notes first.

-
-
-
+ @endif +
+
- - @if(stripos($server->os->name, 'Windows') !== false) -
-
- -

Windows Configuration

-
- -
-

- Windows doesn't support cloud-init for automated configuration. You'll need to manually configure networking, hostname, and system settings. -

- -
-
- -
-

Network Setup

-

Configure IP addresses manually in Windows Network Settings.

-
-
-
- -
-

Licensing

-

You must maintain valid Windows licensing.

-
-
-
- -
-

Compliance

-

Non-compliant installations may be suspended.

-
-
-
-
-
- @endif -
- - -
-
+ +
+

Server Information

-
+
+
-
-
- +
+
+

Specifications

- vCPU Cores + vCPU {{ $allocatedCores }} cores
Memory - - @if($allocatedMemoryMiB > 0) - {{ number_format($allocatedMemoryMiB / 1024, 1) }} GiB - @else - {{ \Illuminate\Support\Number::fileSize(bytes: $memoryTotal) }} - @endif - + {{ $allocatedMemoryMiB > 0 ? number_format($allocatedMemoryMiB / 1024, 1) . ' GiB' : \Illuminate\Support\Number::fileSize($memoryTotal) }}
Storage - - @if($allocatedDiskGiB > 0) - {{ $allocatedDiskGiB }} GiB - @elseif($diskTotal > 0) - {{ number_format($diskTotal / 1024 / 1024 / 1024, 0) }} GiB - @else - N/A - @endif - -
-
- Backups - {{ $allocatedBackups > 0 ? $allocatedBackups . ' slots' : 'Disabled' }} + {{ $allocatedDiskGiB > 0 ? $allocatedDiskGiB . ' GiB' : ($diskTotal > 0 ? number_format($diskTotal / 1073741824, 0) . ' GiB' : 'N/A') }}
-
-
- +
+
+

Network Transfer

Inbound - {{ \Illuminate\Support\Number::fileSize(bytes: $totalNetIn) }} + {{ \Illuminate\Support\Number::fileSize($totalNetIn) }}
Outbound - {{ \Illuminate\Support\Number::fileSize(bytes: $totalNetOut) }} + {{ \Illuminate\Support\Number::fileSize($totalNetOut) }}
Total - {{ \Illuminate\Support\Number::fileSize(bytes: $totalNetIn + $totalNetOut) }} + {{ \Illuminate\Support\Number::fileSize($totalNetIn + $totalNetOut) }}
-
-
- +
+
+

Billing

Product - {{ $productName }} + {{ $productName }}
Status @@ -1584,16 +424,16 @@
Renewal - {{ $serviceExpires ? $serviceExpires->format('M d, Y') : 'N/A' }} + {{ $serviceExpires?->format('M d, Y') ?? 'N/A' }}
-
-
- +
+
+

Infrastructure

@@ -1615,9 +455,9 @@
-
-
- +
+
+

Identifiers

@@ -1637,11 +477,11 @@
- +
-
-
- +
+
+

Live Usage

@@ -1652,16 +492,16 @@
- {{ $cpuUsagePercent }}% + {{ $cpuUsagePercent }}%
Memory
-
+
- {{ $memoryPercent }}% + {{ $memoryPercent }}%
@if($diskTotal > 0) @@ -1669,9 +509,9 @@ Disk
-
+
- {{ $diskPercent }}% + {{ $diskPercent }}%
@endif @@ -1679,60 +519,49 @@
-<<<<<<< HEAD
-======= -
-
->>>>>>> c5530e923149080e7d739823785456eb3267393f + + @if($server->os && stripos($server->os->name, 'Windows') !== false) +
+
+ +

Windows Configuration

+
+ +
+

+ Windows doesn't support cloud-init. You'll need to manually configure networking and system settings. +

+
+
+ +
+

Network

+

Configure IP manually

+
+
+
+ +
+

Licensing

+

You provide license

+
+
+
+ +
+

Compliance

+

Subject to audits

+
+
+
+
+
+ @endif +
- - @once - - @endonce @endif