mirror of
https://github.com/chylex/Minecraft-Phantom-Panel.git
synced 2026-01-12 17:58:15 +01:00
132 lines
4.3 KiB
Plaintext
132 lines
4.3 KiB
Plaintext
@page "/agents"
|
|
@using System.Collections.Immutable
|
|
@using Phantom.Common.Data.Web.Agent
|
|
@using Phantom.Common.Data.Web.Users
|
|
@using Phantom.Utils.Collections
|
|
@using Phantom.Utils.Cryptography
|
|
@using Phantom.Web.Services.Agents
|
|
@using Phantom.Web.Services.Authorization
|
|
@inherits PhantomComponent
|
|
@inject AgentManager AgentManager
|
|
|
|
<h1>Agents</h1>
|
|
|
|
<PermissionView Permission="Permission.ManageAllAgents">
|
|
<a href="agents/create" class="btn btn-primary" role="button">New Agent</a>
|
|
</PermissionView>
|
|
|
|
<Table Items="agentTable">
|
|
<HeaderRow>
|
|
<Column Width="50%">Name</Column>
|
|
<Column Class="text-end" Width="24%" MinWidth="90px">Instances</Column>
|
|
<Column Class="text-end" Width="26%" MinWidth="145px">Memory</Column>
|
|
<Column>Version</Column>
|
|
<Column Class="text-center">Status</Column>
|
|
<Column Class="text-end" MinWidth="200px">Last Ping</Column>
|
|
<Column>Actions</Column>
|
|
</HeaderRow>
|
|
<ItemRow Context="agent">
|
|
@{
|
|
var connectionKey = TokenGenerator.EncodeBytes(agent.ConnectionKey.AsSpan());
|
|
var runtimeInfo = agent.RuntimeInfo;
|
|
var usedInstances = agent.Stats?.RunningInstanceCount;
|
|
var usedMemory = agent.Stats?.RunningInstanceMemory.InMegabytes;
|
|
}
|
|
<Cell>
|
|
<p class="fw-semibold">@agent.Configuration.AgentName</p>
|
|
<small class="font-monospace text-uppercase">@agent.AgentGuid.ToString()</small>
|
|
</Cell>
|
|
<Cell class="text-end">
|
|
<ProgressBar Value="@(usedInstances ?? 0)" Maximum="@(runtimeInfo.MaxInstances ?? 0)">
|
|
@if (runtimeInfo.MaxInstances is {} maxInstances) {
|
|
<text>@(usedInstances?.ToString() ?? "?") / @maxInstances.ToString()</text>
|
|
}
|
|
else {
|
|
@:N/A
|
|
}
|
|
</ProgressBar>
|
|
</Cell>
|
|
<Cell class="text-end">
|
|
<ProgressBar Value="@(usedMemory ?? 0)" Maximum="@(runtimeInfo.MaxMemory?.InMegabytes ?? 0)">
|
|
@if (runtimeInfo.MaxMemory is {} maxMemory) {
|
|
<text>@(usedMemory?.ToString() ?? "?") / @maxMemory.InMegabytes MB</text>
|
|
}
|
|
else {
|
|
@:N/A
|
|
}
|
|
</ProgressBar>
|
|
</Cell>
|
|
@if (runtimeInfo.VersionInfo is {} versionInfo) {
|
|
<Cell class="text-condensed">
|
|
Build: <span class="font-monospace">@versionInfo.BuildVersion</span>
|
|
<br>
|
|
Protocol: <span class="font-monospace">v@(versionInfo.ProtocolVersion.ToString())</span>
|
|
</Cell>
|
|
}
|
|
else {
|
|
<Cell>
|
|
N/A
|
|
</Cell>
|
|
}
|
|
@switch (agent.ConnectionStatus) {
|
|
case AgentIsOnline:
|
|
<Cell class="fw-semibold text-center text-success">Online</Cell>
|
|
<Cell class="text-end">-</Cell>
|
|
break;
|
|
|
|
case AgentIsOffline:
|
|
<Cell class="fw-semibold text-center">Offline</Cell>
|
|
<Cell class="text-end">N/A</Cell>
|
|
break;
|
|
|
|
case AgentIsDisconnected status:
|
|
<Cell class="fw-semibold text-center">Offline</Cell>
|
|
<Cell class="text-end">
|
|
<TimeWithOffset Time="status.LastPingTime" />
|
|
</Cell>
|
|
break;
|
|
|
|
default:
|
|
<Cell class="fw-semibold text-center">N/A</Cell>
|
|
break;
|
|
}
|
|
<Cell>
|
|
<PermissionView Permission="Permission.ManageAllAgents">
|
|
<a href="agents/@agent.AgentGuid/edit" type="button" class="btn btn-primary btn-sm">Edit Agent</a>
|
|
<button type="button" class="btn btn-warning btn-sm" data-clipboard="@connectionKey" onclick="copyToClipboard(this);">Copy Agent Key</button>
|
|
</PermissionView>
|
|
</Cell>
|
|
</ItemRow>
|
|
<NoItemsRow>
|
|
No agents found.
|
|
</NoItemsRow>
|
|
</Table>
|
|
|
|
@code {
|
|
|
|
private TableData<Agent, Guid>? agentTable;
|
|
|
|
protected override async Task OnInitializedAsync() {
|
|
var authenticatedUser = await GetAuthenticatedUser();
|
|
if (authenticatedUser == null) {
|
|
return;
|
|
}
|
|
|
|
AgentManager.AgentsChanged.Subscribe(this, agents => {
|
|
var sortedAgents = agents.Values
|
|
.Where(agent => authenticatedUser.Info.HasAccessToAgent(agent.AgentGuid))
|
|
.OrderBy(static agent => agent.Configuration.AgentName)
|
|
.ToImmutableArray();
|
|
|
|
agentTable ??= new TableData<Agent, Guid>();
|
|
agentTable.UpdateFrom(sortedAgents, static agent => agent.AgentGuid, static agent => agent, static (agent, _) => agent);
|
|
InvokeAsync(StateHasChanged);
|
|
});
|
|
}
|
|
|
|
protected override void OnDisposed() {
|
|
AgentManager.AgentsChanged.Unsubscribe(this);
|
|
}
|
|
|
|
}
|