@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); } }