From 43e06f4b1b7ead9f8cc97fe547eb49d51f341486 Mon Sep 17 00:00:00 2001 From: Rory& Date: Sat, 20 Jan 2024 08:34:32 +0100 Subject: Initial commit --- LibSystemdCli/CommandExecutor.cs | 59 ++++++++++++++++++++++++++++++++++++++ LibSystemdCli/LibSystemdCli.csproj | 13 +++++++++ LibSystemdCli/SystemdExecutor.cs | 31 ++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 LibSystemdCli/CommandExecutor.cs create mode 100644 LibSystemdCli/LibSystemdCli.csproj create mode 100644 LibSystemdCli/SystemdExecutor.cs (limited to 'LibSystemdCli') diff --git a/LibSystemdCli/CommandExecutor.cs b/LibSystemdCli/CommandExecutor.cs new file mode 100644 index 0000000..096f1c1 --- /dev/null +++ b/LibSystemdCli/CommandExecutor.cs @@ -0,0 +1,59 @@ +using System.Diagnostics; + +namespace LibSystemdCli; + +public class CommandExecutor +{ + public static async Task ExecuteCommand(string command, string args) + { + Console.WriteLine($"[{DateTime.Now:O}] Executing command: {command} {args}"); + var process = new Process + { + StartInfo = + { + FileName = command, + Arguments = args, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false + } + }; + process.Start(); + var output = await process.StandardOutput.ReadToEndAsync(); + var error = await process.StandardError.ReadToEndAsync(); + await process.WaitForExitAsync(); + if (process.ExitCode != 0) + { + throw new Exception($"Command {command} {args} failed with exit code {process.ExitCode} and error: {error}"); + } + + return output; + } + + public static async IAsyncEnumerable ExecuteCommandAsync(string command, string args) + { + Console.WriteLine($"[{DateTime.Now:O}] Executing command asynchronously: {command} {args}"); + var process = new Process + { + StartInfo = + { + FileName = command, + Arguments = args, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false + } + }; + process.Start(); + while (!process.StandardOutput.EndOfStream) + { + var line = await process.StandardOutput.ReadLineAsync(); + yield return line; + } + await process.WaitForExitAsync(); + if (process.ExitCode != 0) + { + throw new Exception($"Command {command} {args} failed with exit code {process.ExitCode}"); + } + } +} \ No newline at end of file diff --git a/LibSystemdCli/LibSystemdCli.csproj b/LibSystemdCli/LibSystemdCli.csproj new file mode 100644 index 0000000..1d1bffa --- /dev/null +++ b/LibSystemdCli/LibSystemdCli.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/LibSystemdCli/SystemdExecutor.cs b/LibSystemdCli/SystemdExecutor.cs new file mode 100644 index 0000000..eb6dfc9 --- /dev/null +++ b/LibSystemdCli/SystemdExecutor.cs @@ -0,0 +1,31 @@ +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); + } + } +} \ No newline at end of file -- cgit 1.5.1