@page "/Service/{ServiceName}/Manage"
@using LibSystemdCli.Models
@using LibSystemdCli
@using System.Text.RegularExpressions
@using ArcaneLibs.Extensions
@using SystemdCtl.Client.Abstractions
@using System.Diagnostics.Metrics
@using System.Text.Json
@* @attribute [StreamRendering] *@
@rendermode InteractiveWebAssembly
@inject NavigationManager NavigationManager
Manage @ServiceName
Managing @ServiceName (@ServiceInfo?.Status)
Actions
@if (ServiceInfo.IsRunning) {
Stop
Restart
Kill
}
else {
Start
}
@* //simple log view *@
Logs
@foreach (var line in LogLines) {
@line.Exe.Split('/').Last() |
@line.Message |
}
@code {
[Parameter]
public string ServiceName { get; set; } = "";
private static bool IsClient => !Environment.CommandLine.Contains("/");
private List LogLines { get; set; } = new();
private SystemdServiceData? ServiceInfo { get; set; } = new();
protected override async Task OnInitializedAsync() {
Console.WriteLine("OnInitializedAsync");
await Run();
}
private async Task Run() {
if (!IsClient) return;
int history = 100;
LogLines.Clear();
GetServiceDataTask();
var Http = new StreamingHttpClient() { BaseAddress = new Uri(NavigationManager.BaseUri) };
var jso = new JsonSerializerOptions() {
DefaultBufferSize = 1,
AllowTrailingCommas = true
};
var _items = Http.GetAsyncEnumerableFromJsonAsync($"/api/unit/{ServiceName}/logs?contextLines={history}", jso);
await foreach (var item in _items) {
// LogLines.RemoveAll(x=>x.SystemdInvocationId != item.SystemdInvocationId);
LogLines.Add(item);
if (LogLines.Count > history) {
LogLines.RemoveAt(0);
}
StateHasChanged();
}
}
private async Task GetServiceDataTask() {
if (!IsClient) return;
var Http = new StreamingHttpClient() { BaseAddress = new Uri(NavigationManager.BaseUri) };
while (true) {
ServiceInfo = await Http.GetFromJsonAsync($"/api/unit/{ServiceName}/data");
StateHasChanged();
await Task.Delay(TimeSpan.FromSeconds(5));
}
}
private string Capitalize(string input) {
return input switch {
null => throw new ArgumentNullException(nameof(input)),
"" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
_ => input.First().ToString().ToUpper() + input[1..]
};
}
private async Task Start() {
var Http = new StreamingHttpClient() { BaseAddress = new Uri(NavigationManager.BaseUri) };
await Http.GetAsync($"/api/unit/{ServiceName}/start", null);
}
private async Task Stop() {
var Http = new StreamingHttpClient() { BaseAddress = new Uri(NavigationManager.BaseUri) };
await Http.GetAsync($"/api/unit/{ServiceName}/stop", null);
}
private async Task Restart() {
var Http = new StreamingHttpClient() { BaseAddress = new Uri(NavigationManager.BaseUri) };
await Http.GetAsync($"/api/unit/{ServiceName}/restart", null);
}
private async Task Kill() {
var Http = new StreamingHttpClient() { BaseAddress = new Uri(NavigationManager.BaseUri) };
await Http.GetAsync($"/api/unit/{ServiceName}/kill", null);
}
}