diff --git a/extensions/Servers/Proxmox/views/overview.blade.php b/extensions/Servers/Proxmox/views/overview.blade.php index e68e6b6f9..c55be98d0 100644 --- a/extensions/Servers/Proxmox/views/overview.blade.php +++ b/extensions/Servers/Proxmox/views/overview.blade.php @@ -20,6 +20,191 @@ @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 @@ -28,6 +213,838 @@ $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; @@ -662,8 +1679,13 @@ +<<<<<<< HEAD +======= + + +>>>>>>> c5530e923149080e7d739823785456eb3267393f @once