summary refs log tree commit diff
path: root/LibSystemdCli/SystemdExecutor.cs
blob: ead11fdc08bca6f32bbca798f99a771c522db12f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System.Text.Json;
using System.Text.Json.Nodes;
using LibSystemdCli.Models;

namespace LibSystemdCli;

public class SystemdExecutor {
    public static async IAsyncEnumerable<SystemdUnitListItem> GetUnits() {
        var output = await CommandExecutor.ExecuteCommand("systemctl", "list-units --all --no-legend --no-pager --no-legend -o json-pretty");

        var data = JsonSerializer.Deserialize<List<SystemdUnitListItem>>(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<SystemdJournalLogItem> 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<SystemdJournalLogItem>(line)!;
        }
    }

    public static async Task<SystemdServiceData> 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!;
    }
}