Implemented console. Fixed streaming bugs. Added server command sending. Added reset and router back

This commit is contained in:
Marcel Baumgartner 2024-02-03 12:18:06 +01:00
parent 9e515d9ed7
commit 955946d0a6
13 changed files with 129 additions and 21 deletions

View file

@ -0,0 +1,20 @@
@{
var route = "/" + (Router.Route ?? "");
}
@if (route == Path)
{
@ChildContent
}
@code
{
[CascadingParameter]
public SmartRouter Router { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
[Parameter]
public string Path { get; set; }
}

View file

@ -0,0 +1,12 @@
<CascadingValue TValue="SmartRouter" Value="@this">
@ChildContent
</CascadingValue>
@code
{
[Parameter]
public string? Route { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
}

View file

@ -1,4 +1,5 @@
using Moonlight.Features.Servers.UI.Layouts;
using Moonlight.Features.Servers.UI.UserViews;
using Moonlight.Features.ServiceManagement.Models.Abstractions;
using Console = Moonlight.Features.Servers.UI.UserViews.Console;
@ -14,6 +15,7 @@ public class ServerServiceDefinition : ServiceDefinition
context.Layout = typeof(UserLayout);
await context.AddPage<Console>("Console", "/console", "bx bx-sm bxs-terminal");
await context.AddPage<Reset>("Reset", "/reset", "bx bx-sm bx-revision");
}
public override Task BuildAdminView(ServiceViewContext context)

View file

@ -1,4 +1,4 @@
namespace Moonlight.Features.Servers.Models.Packets;
namespace Moonlight.Features.Servers.Api.Packets;
public class ServerOutputMessage
{

View file

@ -1,6 +1,6 @@
using Moonlight.Features.Servers.Models.Enums;
namespace Moonlight.Features.Servers.Models.Packets;
namespace Moonlight.Features.Servers.Api.Packets;
public class ServerStateUpdate
{

View file

@ -0,0 +1,6 @@
namespace Moonlight.Features.Servers.Api.Requests;
public class EnterCommand
{
public string Command { get; set; }
}

View file

@ -1,9 +1,9 @@
using System.Net.WebSockets;
using Microsoft.AspNetCore.Mvc;
using MoonCore.Helpers;
using Moonlight.Features.Servers.Api.Packets;
using Moonlight.Features.Servers.Entities;
using Moonlight.Features.Servers.Extensions.Attributes;
using Moonlight.Features.Servers.Models.Packets;
using Moonlight.Features.Servers.Services;
namespace Moonlight.Features.Servers.Http.Controllers;
@ -82,8 +82,6 @@ public class NodeController : Controller
{
lock (meta.ConsoleMessages)
meta.ConsoleMessages.Add(serverOutputMessage.Message);
meta.LastChangeTimestamp = DateTime.UtcNow;
});
await (await ServerService.Meta.Get(serverOutputMessage.Id)).OnConsoleMessage.Invoke(serverOutputMessage

View file

@ -2,8 +2,7 @@ using Microsoft.EntityFrameworkCore;
using MoonCore.Abstractions;
using MoonCore.Attributes;
using MoonCore.Helpers;
using Moonlight.Features.Servers.Api.Requests;
using Moonlight.Features.Servers.Entities;
using Moonlight.Features.Servers.Exceptions;
using Moonlight.Features.Servers.Helpers;
@ -47,6 +46,16 @@ public class ServerService
await httpClient.Post($"servers/{server.Id}/subscribe");
}
public async Task SendCommand(Server server, string command)
{
using var httpClient = CreateHttpClient(server);
await httpClient.Post($"servers/{server.Id}/command", new EnterCommand()
{
Command = command
});
}
private HttpApiClient<NodeException> CreateHttpClient(Server server)
{
using var scope = ServiceProvider.CreateScope();

View file

@ -5,7 +5,7 @@
@inject ClipboardService ClipboardService
@inject ToastService ToastService
<Xterm @ref="Term" Options="Options" AddonIds="AddonIds" OnFirstRender="OnFirstRender" />
<Xterm @ref="Term" Options="Options" OnFirstRender="OnFirstRender" />
@code
{
@ -25,13 +25,6 @@
FontFamily = "monospace"
};
private readonly string[] AddonIds = new[]
{
"xterm-addon-fit",
"xterm-addon-web-links",
"xterm-addon-search"
};
private bool HasBeenRendered = false;
private readonly List<string> UnRenderedMessageCache = new();

View file

@ -1,5 +1,9 @@
@using Moonlight.Features.Servers.Models.Abstractions
@using Moonlight.Features.Servers.Services
@using Moonlight.Features.Servers.UI.Components
@using Moonlight.Features.Servers.Entities
@inject ServerService ServerService
@implements IDisposable
@ -7,8 +11,8 @@
<Terminal @ref="Terminal" />
<div class="mt-3">
<div class="input-group">
<input class="form-control form-control-transparent text-white" placeholder="Enter command"/>
<button class="btn btn-secondary rounded-start">Execute</button>
<input @bind="CommandInput" class="form-control form-control-transparent text-white" placeholder="Enter command"/>
<WButton CssClasses="btn btn-secondary rounded-start" Text="Execute" OnClick="SendCommand" />
</div>
</div>
</div>
@ -17,8 +21,12 @@
{
[CascadingParameter]
public ServerMeta Meta { get; set; }
[CascadingParameter]
public Server Server { get; set; }
private Terminal Terminal;
private string CommandInput = "";
protected override async Task OnAfterRenderAsync(bool firstRender)
{
@ -40,10 +48,19 @@
{
await Terminal.WriteLine(message);
}
private async Task SendCommand()
{
await ServerService.SendCommand(Server, CommandInput);
CommandInput = "";
await InvokeAsync(StateHasChanged);
}
public void Dispose()
{
if(Meta != null)
Meta.OnConsoleMessage -= OnConsoleMessage;
}
}

View file

@ -0,0 +1,53 @@
@using Moonlight.Features.Servers.Entities
@using Moonlight.Features.Servers.Models.Abstractions
@using Moonlight.Features.Servers.Models.Enums
@using Moonlight.Features.Servers.Services
@implements IDisposable
@inject ServerService ServerService
<div class="card card-body">
@if (Meta.State == ServerState.Offline)
{
<ConfirmButton OnClick="ResetServer" CssClasses="btn btn-danger" Text="Reset server" />
}
else
{
<button class="btn btn-danger disabled" disabled="">Reset server</button>
}
</div>
@code
{
[CascadingParameter]
public Server Server { get; set; }
[CascadingParameter]
public ServerMeta Meta { get; set; }
protected override Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
Meta.OnStateChanged += OnStateChanged;
}
return Task.CompletedTask;
}
private async Task ResetServer()
{
await ServerService.SendPowerAction(Server, PowerAction.Install);
}
private async Task OnStateChanged()
{
await InvokeAsync(StateHasChanged);
}
public void Dispose()
{
Meta.OnStateChanged -= OnStateChanged;
}
}

View file

@ -34,6 +34,7 @@
<Folder Include="Features\Dummy\Services\" />
<Folder Include="Features\Dummy\UI\Components\" />
<Folder Include="Features\Dummy\UI\Views\" />
<Folder Include="Features\Servers\Api\Resources\" />
<Folder Include="Features\Servers\Configuration\" />
<Folder Include="Features\Servers\Http\Requests\" />
<Folder Include="Features\Servers\Http\Resources\" />
@ -56,7 +57,7 @@
<PackageReference Include="MoonCoreUI" Version="1.0.1" />
<PackageReference Include="Otp.NET" Version="1.3.0" />
<PackageReference Include="QRCoder" Version="1.4.3" />
<PackageReference Include="XtermBlazor" Version="1.10.0" />
<PackageReference Include="XtermBlazor" Version="1.10.1" />
</ItemGroup>
<ItemGroup>

View file

@ -60,9 +60,6 @@
<script src="/js/ckeditor.js"></script>
<script src="/_content/XtermBlazor/XtermBlazor.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-web-links@0.9.0/lib/xterm-addon-web-links.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-search@0.13.0/lib/xterm-addon-search.min.js"></script>
@foreach (var theme in themes)
{