using System.Text.Json; using System.Text.Json.Nodes; using LibSystemdCli.Models; namespace LibSystemdCli; public class SystemdExecutor { public static async IAsyncEnumerable GetUnits() { var output = await CommandExecutor.ExecuteCommand("systemctl", "list-units --all --no-legend --no-pager --no-legend -o json-pretty"); var data = JsonSerializer.Deserialize>(output); foreach (var unit in data) { try { var fragmentOutput = await CommandExecutor.ExecuteCommand("systemctl", $"show -P FragmentPath --no-pager --no-legend -- {unit.Unit} "); // Console.WriteLine(fragmentOutput); unit.FragmentPaths = fragmentOutput.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToList(); } catch { } yield return unit; // await Task.Delay(100); } } public static async IAsyncEnumerable GetUnitLogs(string serviceName, int contextLines = 100) { await foreach (var line in CommandExecutor.ExecuteCommandAsync("journalctl", $"--catalog --all --pager-end --output=json --follow --lines={contextLines} --unit={serviceName}")) { yield return JsonSerializer.Deserialize(line)!; } } public static async Task GetUnitData(string serviceName) { var output = await CommandExecutor.ExecuteCommand("systemctl", $"show --no-pager --no-legend -- {serviceName} "); var data = new SystemdServiceData(); foreach (var line in output.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) { var parts = line.Split('=', 2); var key = parts[0]; var value = parts[1]; data.AddData(key, value); } return data; } private class TypeDef { public bool IsList { get; set; } public string Type { get; set; } = null!; } }