using Insight.Agent.Extensions; using Insight.Domain.Network.Agent.Messages; using Microsoft.Extensions.Logging; using System.Text.RegularExpressions; namespace Insight.Agent.Services; public partial class CollectorService { public OperationSystem? GetOperatingSystem() { Logger.LogTrace("GetOperatingSystem"); var os = new OperationSystem(); // get uptime var output = string.Empty; // read file using var stream = File.OpenText(@"/proc/uptime"); output = stream.ReadToEnd(); // clean output var clean = CleanRegex().Replace(output .Trim() .Replace("\t", " "), " "); var elements = clean.Split(Array.Empty(), StringSplitOptions.RemoveEmptyEntries); // assign values //os.Uptime = DateTime.Now - TimeSpan.FromSeconds(double.Parse(elements.ElementAt(0))); // request data with process output = "hostnamectl".Bash(); // linebreak list conversion var lines = new List(output .Split(separator, StringSplitOptions.RemoveEmptyEntries)) .Select(l => { return CleanRegex().Replace(l .Trim() .Replace("\t", " "), " "); }) .ToList(); // assign values os.Virtual = lines .Any(l => l .StartsWith("Virtualization:")) && !string.IsNullOrEmpty(lines .Where(l => l .StartsWith("Virtualization:")) .First() .Split("Virtualization:")[1] .Trim()); // OS // request data with process output = "hostnamectl".Bash(); // linebreak list conversion lines = new List(output .Split(separator, StringSplitOptions.RemoveEmptyEntries)) .Select(l => { return CleanRegex().Replace(l .Trim() .Replace("\t", " "), " "); }) .ToList(); // assign values os.Name = lines .Any(l => l .StartsWith("Operating System:")) ? lines .Where(l => l .StartsWith("Operating System:")) .First() .Split("Operating System:")[1] .Trim() : string.Empty; os.Version = lines .Any(l => l .StartsWith("Kernel:")) ? lines .Where(l => l .StartsWith("Kernel:")) .First() .Split("Kernel:")[1] .Trim() : string.Empty; var architecture = lines .Any(l => l .StartsWith("Architecture:")) ? lines .Where(l => l .StartsWith("Architecture:")) .First() .Split("Architecture:")[1] .Trim() : string.Empty; return os; } private static readonly string[] separator = ["\n", "\r\n"]; [GeneratedRegex(@"[ ]{2,}")] private static partial Regex CleanRegex(); }