using System.Runtime.InteropServices; using System.Text; using ArcaneLibs.Extensions; using ArcaneLibs.Extensions.Streams; using LibSystemdCli; using LibSystemdCli.Models; using Microsoft.AspNetCore.Mvc; namespace SystemdCtl.Controllers; [ApiController] [Route("/api/")] public class UnitController : ControllerBase { [HttpGet("listUnits")] public async IAsyncEnumerable GetUnits() { await foreach (var unit in SystemdExecutor.GetUnits()) { yield return unit; await Response.Body.FlushAsync(); } } // [HttpGet("unit/{serviceName}/logs")] // public async IAsyncEnumerable GetUnitLogs(string serviceName, [FromQuery] int contextLines = 100) // { // await foreach (var log in SystemdExecutor.GetUnitLogs(serviceName, contextLines: contextLines)) // { // Console.WriteLine(log.Message); // yield return log; // await Response.Body.FlushAsync(); // } // } [HttpGet("unit/{serviceName}/logs")] public async Task GetUnitLogs(string serviceName, [FromQuery] int contextLines = 100) { Response.ContentType = "application/json"; await Response.StartAsync(); await Response.Body.WriteAsync("[\n"u8.ToArray()); await foreach (var log in SystemdExecutor.GetUnitLogs(serviceName, contextLines: contextLines)) { Console.WriteLine(log.Message); var bytes = Encoding.UTF8.GetBytes($" {log.ToJson(indent: false)},\n"); await Response.Body.WriteAsync(bytes); await Response.Body.FlushAsync(); } await Response.Body.WriteAsync("]\n"u8.ToArray()); await Response.Body.FlushAsync(); await Response.CompleteAsync(); } [HttpGet("unit/{serviceName}/dataStream")] public async Task GetUnitDataStream(string serviceName, [FromQuery] int contextLines = 100) { Response.ContentType = "application/json"; await Response.StartAsync(); await Response.Body.WriteAsync("[\n"u8.ToArray()); var oldData = await SystemdExecutor.GetUnitData(serviceName); while(true) { var data = await SystemdExecutor.GetUnitData(serviceName); data.SetOldData(oldData); var bytes = Encoding.UTF8.GetBytes($" {data.ToJson(indent: false)},\n"); await Response.Body.WriteAsync(bytes); await Response.Body.FlushAsync(); oldData = data; await Task.Delay(1000); } await Response.Body.WriteAsync("]\n"u8.ToArray()); await Response.Body.FlushAsync(); await Response.CompleteAsync(); } [HttpGet("unit/{serviceName}/data")] public Task GetUnitData(string serviceName) => SystemdExecutor.GetUnitData(serviceName); [HttpGet("unit/{serviceName}/start")] public Task StartUnit(string serviceName) => CommandExecutor.ExecuteCommand("systemctl", $"start {serviceName}"); [HttpGet("unit/{serviceName}/stop")] public Task StopUnit(string serviceName) => CommandExecutor.ExecuteCommand("systemctl", $"stop {serviceName}"); [HttpGet("unit/{serviceName}/restart")] public Task RestartUnit(string serviceName) => CommandExecutor.ExecuteCommand("systemctl", $"restart {serviceName}"); [HttpGet("unit/{serviceName}/reload")] public Task ReloadUnit(string serviceName) => CommandExecutor.ExecuteCommand("systemctl", $"reload {serviceName}"); [HttpGet("unit/{serviceName}/enable")] public Task EnableUnit(string serviceName) => CommandExecutor.ExecuteCommand("systemctl", $"enable {serviceName}"); [HttpGet("unit/{serviceName}/disable")] public Task DisableUnit(string serviceName) => CommandExecutor.ExecuteCommand("systemctl", $"disable {serviceName}"); }