@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 @using ArcaneLibs @using SystemdCtl.Client.Pages.Graphs @* @attribute [StreamRendering] *@ @rendermode InteractiveWebAssembly @inject NavigationManager NavigationManager Manage @ServiceName

Managing @ServiceName (@ServiceInfo?.Status)

Actions

@if (ServiceInfo.IsRunning) { Stop Restart Kill } else { Start }

Statistics

CPU usage: @ServiceInfo?.CpuUsagePercent.ToString("P2")

Memory usage: @Util.SI_BytesToString(ServiceInfo?.MemoryCurrent ?? 0) (peak: @Util.SI_BytesToString(ServiceInfo?.MemoryPeak ?? 0))

@* //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; GetServiceDataTask(); GetLogs(); } private JsonSerializerOptions jso = new() { DefaultBufferSize = 1, AllowTrailingCommas = true }; private async Task GetLogs() { int history = 100; var Http = new StreamingHttpClient() { BaseAddress = new Uri(NavigationManager.BaseUri) }; LogLines.Clear(); var _items = Http.GetAsyncEnumerableFromJsonAsync($"/api/unit/{ServiceName}/logs?contextLines={history}", jso); await foreach (var item in _items) { 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) }; var stream = Http.GetAsyncEnumerableFromJsonAsync($"/api/unit/{ServiceName}/dataStream", jso); await foreach (var item in stream) { ServiceInfo = item; CpuUsageHistory.Add(ServiceInfo.Timestamp, ServiceInfo.CpuUsagePercent); MemoryUsageHistory.Add(ServiceInfo.Timestamp, ServiceInfo.MemoryCurrent); CpuUsageHistory = CpuUsageHistory.Where((x, y) => x.Key > DateTime.Now.AddMinutes(-1)) .OrderBy(x => x.Key).ToDictionary(); MemoryUsageHistory = MemoryUsageHistory.Where((x, y) => x.Key > DateTime.Now.AddMinutes(-1)).OrderBy(x => x.Key).ToDictionary(); StateHasChanged(); } } 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); } public Dictionary CpuUsageHistory { get; set; } = []; public Dictionary MemoryUsageHistory { get; set; } = []; }