From 1e05d4576d9f48fcded8eef04f8146ede60cef93 Mon Sep 17 00:00:00 2001 From: Kevin Kai Berthold Date: Fri, 22 Sep 2023 22:16:56 +0200 Subject: [PATCH] syntax updates --- dotnetcore.csproj | 8 - .../Insight.Agent/Constants/Appsettings.cs | 15 +- src/Agent/Insight.Agent/Constants/Deploy.cs | 33 +- .../Insight.Agent/Extensions/Configuration.cs | 15 +- src/Agent/Insight.Agent/Extensions/Linux.cs | 41 +- .../Insight.Agent/Internals/Extensions.cs | 111 ++- src/Agent/Insight.Agent/Internals/Helpers.cs | 61 +- src/Agent/Insight.Agent/Models/Config.cs | 9 +- .../Services/CollectorService.cs | 19 +- .../Insight.Agent/Services/Configurator.cs | 159 ++-- src/Api/Insight.Api/Constants/Locations.cs | 9 +- .../Controllers/AccountController.cs | 117 ++- .../Controllers/AgentController.cs | 59 +- .../Controllers/CustomerController.cs | 59 +- .../Insight.Api/Controllers/HostController.cs | 59 +- .../Controllers/InventoryController.cs | 103 ++- .../Controllers/SetupController.cs | 39 +- .../Controllers/TokenController.cs | 129 ++- .../Controllers/UpdateController.cs | 145 ++-- .../Extensions/ServiceExtensions.cs | 93 +- .../Insight.Api/Models/RegistrationModel.cs | 31 +- src/Api/Insight.Api/Program.cs | 153 ++-- .../Constants/Appsettings.cs | 23 +- .../Constants/Monitoring.cs | 11 +- .../Constants/Settings.cs | 9 +- .../Insight.Infrastructure/Entities/Agent.cs | 105 ++- .../Entities/AgentLog.cs | 45 +- .../Entities/Customer.cs | 33 +- .../Insight.Infrastructure/Entities/Host.cs | 45 +- .../Entities/HostApplication.cs | 49 +- .../Entities/HostDrive.cs | 65 +- .../Entities/HostHypervisor.cs | 249 +++--- .../Entities/HostInterface.cs | 299 ++++--- .../Entities/HostLog.cs | 45 +- .../Entities/HostLogMonitoring.cs | 53 +- .../Entities/HostMainboard.cs | 49 +- .../Entities/HostMemory.cs | 73 +- .../Insight.Infrastructure/Entities/HostOs.cs | 49 +- .../Entities/HostPrinter.cs | 49 +- .../Entities/HostProcessor.cs | 89 +- .../Entities/HostService.cs | 69 +- .../Entities/HostSession.cs | 49 +- .../Entities/HostStoragePool.cs | 277 +++--- .../Entities/HostSystem.cs | 41 +- .../Entities/HostUpdate.cs | 77 +- .../Entities/HostUser.cs | 161 ++-- .../Entities/HostVideocard.cs | 49 +- .../Entities/HostVolume.cs | 97 ++- .../Entities/Identity.cs | 132 ++- .../Extensions/HttpRequestExtensions.cs | 59 +- .../Extensions/HttpResponseExtensions.cs | 15 +- .../Extensions/MongoCollectionExtensions.cs | 119 ++- .../Extensions/MongoDatabaseExtensions.cs | 93 +- .../Extensions/ServiceExtensions.cs | 451 +++++----- .../Models/Pagination.cs | 71 +- .../Models/TokenOptions.cs | 29 +- .../Services/AccountService.cs | 51 +- .../Services/AgentService.cs | 51 +- .../Services/AuthenticatorService.cs | 187 ++-- .../Services/CustomerService.cs | 51 +- .../Services/HostService.cs | 51 +- .../Services/IdentityService.cs | 221 +++-- .../Services/InventoryService.cs | 51 +- .../Services/TokenService.cs | 251 +++--- .../Insight.Server/Constants/Appsettings.cs | 23 +- src/Server/Insight.Server/Extensions/Async.cs | 71 +- .../Extensions/ConfigurationExtensions.cs | 15 +- .../Insight.Setup.Windows/Constants/Deploy.cs | 75 +- src/Setup/Insight.Setup.Windows/Program.cs | 81 +- .../Services/Deployment.cs | 811 +++++++++--------- .../Services/SetupService.cs | 457 +++++----- .../Insight.Updater/Constants/Deploy.cs | 33 +- src/Updater/Insight.Updater/Program.cs | 77 +- .../Insight.Updater/Services/UpdateService.cs | 571 ++++++------ src/Web/Insight.Web/Program.cs | 2 +- 75 files changed, 3821 insertions(+), 3905 deletions(-) delete mode 100644 dotnetcore.csproj diff --git a/dotnetcore.csproj b/dotnetcore.csproj deleted file mode 100644 index 120e38c..0000000 --- a/dotnetcore.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - Exe - net7.0 - - - diff --git a/src/Agent/Insight.Agent/Constants/Appsettings.cs b/src/Agent/Insight.Agent/Constants/Appsettings.cs index 9a45fe7..074d6b8 100644 --- a/src/Agent/Insight.Agent/Constants/Appsettings.cs +++ b/src/Agent/Insight.Agent/Constants/Appsettings.cs @@ -1,10 +1,9 @@ -namespace Insight.Agent +namespace Insight.Agent; + +public static class Appsettings { - public static class Appsettings - { - public const string Api = "api"; - public const string ServerHost = "server.host"; - public const string ServerPort = "server.port"; - public const string TrapPort = "trap.port"; - } + public const string Api = "api"; + public const string ServerHost = "server.host"; + public const string ServerPort = "server.port"; + public const string TrapPort = "trap.port"; } \ No newline at end of file diff --git a/src/Agent/Insight.Agent/Constants/Deploy.cs b/src/Agent/Insight.Agent/Constants/Deploy.cs index 35aa19b..ded093c 100644 --- a/src/Agent/Insight.Agent/Constants/Deploy.cs +++ b/src/Agent/Insight.Agent/Constants/Deploy.cs @@ -1,21 +1,20 @@ -namespace Insight.Agent.Constants +namespace Insight.Agent.Constants; + +public static class Deploy { - public static class Deploy + public static class Updater { - public static class Updater - { - public const string Name = "Updater"; - public const string ServiceName = "insight_updater"; - public const string Description = "Insight Updater"; - } - - public static DirectoryInfo GetAppDirectory(string appName) - => new($"{Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)}/Webmatic/Insight/{appName}"); - - public static FileInfo GetAppExecutable(string appName) - => new($"{GetAppDirectory(appName).FullName}/{appName.ToLower()}.exe"); - - public static Uri GetUpdateHref(Uri api, string appName) - => new($"{api.AbsoluteUri}/update/{appName.ToLower()}/windows"); + public const string Name = "Updater"; + public const string ServiceName = "insight_updater"; + public const string Description = "Insight Updater"; } + + public static DirectoryInfo GetAppDirectory(string appName) + => new($"{Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)}/Webmatic/Insight/{appName}"); + + public static FileInfo GetAppExecutable(string appName) + => new($"{GetAppDirectory(appName).FullName}/{appName.ToLower()}.exe"); + + public static Uri GetUpdateHref(Uri api, string appName) + => new($"{api.AbsoluteUri}/update/{appName.ToLower()}/windows"); } \ No newline at end of file diff --git a/src/Agent/Insight.Agent/Extensions/Configuration.cs b/src/Agent/Insight.Agent/Extensions/Configuration.cs index c5df5da..8646d47 100644 --- a/src/Agent/Insight.Agent/Extensions/Configuration.cs +++ b/src/Agent/Insight.Agent/Extensions/Configuration.cs @@ -1,14 +1,13 @@ using Microsoft.Extensions.Configuration; -namespace Insight.Agent.Extensions +namespace Insight.Agent.Extensions; + +public static class ConfigurationExtensions { - public static class ConfigurationExtensions + public static IConfigurationBuilder Defaults(this IConfigurationBuilder configuration) { - public static IConfigurationBuilder Defaults(this IConfigurationBuilder configuration) - { - configuration.Sources.Clear(); - configuration.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); - return configuration.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true); - } + configuration.Sources.Clear(); + configuration.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); + return configuration.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true); } } \ No newline at end of file diff --git a/src/Agent/Insight.Agent/Extensions/Linux.cs b/src/Agent/Insight.Agent/Extensions/Linux.cs index da4f85a..0574954 100644 --- a/src/Agent/Insight.Agent/Extensions/Linux.cs +++ b/src/Agent/Insight.Agent/Extensions/Linux.cs @@ -1,32 +1,31 @@ using System.Diagnostics; using System.Runtime.Versioning; -namespace Insight.Agent.Extensions +namespace Insight.Agent.Extensions; + +public static class Linux { - public static class Linux + [SupportedOSPlatform("linux")] + public static string Bash(this string cmd) { - [SupportedOSPlatform("linux")] - public static string Bash(this string cmd) + var escaped = cmd.Replace("\"", "\\\""); + + using var proc = new Process() { - var escaped = cmd.Replace("\"", "\\\""); - - using var proc = new Process() + StartInfo = new ProcessStartInfo { - StartInfo = new ProcessStartInfo - { - FileName = "/bin/bash", - Arguments = $"-c \"{escaped}\"", - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true, - } - }; + FileName = "/bin/bash", + Arguments = $"-c \"{escaped}\"", + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true, + } + }; - proc.Start(); - var result = proc.StandardOutput.ReadToEnd(); - proc.WaitForExit(); + proc.Start(); + var result = proc.StandardOutput.ReadToEnd(); + proc.WaitForExit(); - return result; - } + return result; } } \ No newline at end of file diff --git a/src/Agent/Insight.Agent/Internals/Extensions.cs b/src/Agent/Insight.Agent/Internals/Extensions.cs index 9699249..a9380f8 100644 --- a/src/Agent/Insight.Agent/Internals/Extensions.cs +++ b/src/Agent/Insight.Agent/Internals/Extensions.cs @@ -1,69 +1,68 @@ using System.Management; using System.Runtime.Versioning; -namespace Insight.Agent +namespace Insight.Agent; + +public static class ManagmentExtensions { - public static class ManagmentExtensions + [SupportedOSPlatform("windows")] + public static HashSet GetPropertyHashes(this ManagementBaseObject @object) { - [SupportedOSPlatform("windows")] - public static HashSet GetPropertyHashes(this ManagementBaseObject @object) + var properties = new HashSet(); + + foreach (var property in @object.Properties) { - var properties = new HashSet(); - - foreach (var property in @object.Properties) - { - properties.Add(property.Name); - } - - return properties; + properties.Add(property.Name); } - [SupportedOSPlatform("windows")] - internal static bool TryGet(this ManagementObjectSearcher searcher, out ManagementObjectCollection collection) + return properties; + } + + [SupportedOSPlatform("windows")] + internal static bool TryGet(this ManagementObjectSearcher searcher, out ManagementObjectCollection collection) + { + collection = searcher.Get(); + + try { - collection = searcher.Get(); - - try - { - _ = collection.Count; - return true; - } - catch (ManagementException) - { - collection.Dispose(); - return false; - } - } - - [SupportedOSPlatform("windows")] - internal static T? GetValue(this ManagementObject @object, HashSet properties, string key) - { - if (@object is null || properties is null || key is null) return default; - if (properties.Contains(key, StringComparer.OrdinalIgnoreCase) is false) return default; - - if (@object[key] is not T obj) - { - return default; - } - - return obj; - } - - [SupportedOSPlatform("windows")] - internal static bool TryGetValue(this ManagementBaseObject @object, HashSet properties, string key, out T? value) - { - value = default; - - if (@object is null || properties is null || key is null) return default; - if (properties.Contains(key, StringComparer.OrdinalIgnoreCase) is false) return false; - - if (@object[key] is not T obj) - { - return false; - } - - value = obj; + _ = collection.Count; return true; } + catch (ManagementException) + { + collection.Dispose(); + return false; + } + } + + [SupportedOSPlatform("windows")] + internal static T? GetValue(this ManagementObject @object, HashSet properties, string key) + { + if (@object is null || properties is null || key is null) return default; + if (properties.Contains(key, StringComparer.OrdinalIgnoreCase) is false) return default; + + if (@object[key] is not T obj) + { + return default; + } + + return obj; + } + + [SupportedOSPlatform("windows")] + internal static bool TryGetValue(this ManagementBaseObject @object, HashSet properties, string key, out T? value) + { + value = default; + + if (@object is null || properties is null || key is null) return default; + if (properties.Contains(key, StringComparer.OrdinalIgnoreCase) is false) return false; + + if (@object[key] is not T obj) + { + return false; + } + + value = obj; + return true; } } \ No newline at end of file diff --git a/src/Agent/Insight.Agent/Internals/Helpers.cs b/src/Agent/Insight.Agent/Internals/Helpers.cs index 93d7e62..e0a0a23 100644 --- a/src/Agent/Insight.Agent/Internals/Helpers.cs +++ b/src/Agent/Insight.Agent/Internals/Helpers.cs @@ -2,43 +2,42 @@ using System.ServiceProcess; using System.Text; -namespace Insight.Agent +namespace Insight.Agent; + +internal class Helpers { - internal class Helpers + internal static string? EscapeWql(string text) { - internal static string? EscapeWql(string text) - { - if (text == null) return null; + if (text == null) return null; - var sb = new StringBuilder(text.Length); - foreach (var c in text) + var sb = new StringBuilder(text.Length); + foreach (var c in text) + { + if (c == '\\' || c == '\'' || c == '"') { - if (c == '\\' || c == '\'' || c == '"') - { - sb.Append('\\'); - } - sb.Append(c); + sb.Append('\\'); } - return sb.ToString(); + sb.Append(c); + } + return sb.ToString(); + } + + [SupportedOSPlatform("windows")] + internal static bool ForceWinRmStart() + { + var winRm = ServiceController + .GetServices() + .First(x => x.ServiceName + .ToLower() + .Equals("winrm", StringComparison.Ordinal)); + + if (winRm.Status is not ServiceControllerStatus.Running) + { + winRm.Start(); + winRm.WaitForStatus(ServiceControllerStatus.Running); } - [SupportedOSPlatform("windows")] - internal static bool ForceWinRmStart() - { - var winRm = ServiceController - .GetServices() - .First(x => x.ServiceName - .ToLower() - .Equals("winrm", StringComparison.Ordinal)); - - if (winRm.Status is not ServiceControllerStatus.Running) - { - winRm.Start(); - winRm.WaitForStatus(ServiceControllerStatus.Running); - } - - if (winRm.Status != ServiceControllerStatus.Running) return false; - return true; - } + if (winRm.Status != ServiceControllerStatus.Running) return false; + return true; } } \ No newline at end of file diff --git a/src/Agent/Insight.Agent/Models/Config.cs b/src/Agent/Insight.Agent/Models/Config.cs index 4be9391..4fdd2ae 100644 --- a/src/Agent/Insight.Agent/Models/Config.cs +++ b/src/Agent/Insight.Agent/Models/Config.cs @@ -1,7 +1,6 @@ -namespace Insight.Agent.Models +namespace Insight.Agent.Models; + +public class Config { - public class Config - { - public Guid? Serial { get; set; } - } + public Guid? Serial { get; set; } } \ No newline at end of file diff --git a/src/Agent/Insight.Agent/Services/CollectorService.cs b/src/Agent/Insight.Agent/Services/CollectorService.cs index 6b8d224..03ac923 100644 --- a/src/Agent/Insight.Agent/Services/CollectorService.cs +++ b/src/Agent/Insight.Agent/Services/CollectorService.cs @@ -2,16 +2,15 @@ using Microsoft.Extensions.Logging.Abstractions; using System.Runtime.Versioning; -namespace Insight.Agent.Services -{ - [SupportedOSPlatform("linux")] - public partial class CollectorService - { - public ILogger Logger { get; } +namespace Insight.Agent.Services; - public CollectorService(ILogger? logger = null) - { - Logger = logger ?? NullLogger.Instance; - } +[SupportedOSPlatform("linux")] +public partial class CollectorService +{ + public ILogger Logger { get; } + + public CollectorService(ILogger? logger = null) + { + Logger = logger ?? NullLogger.Instance; } } \ No newline at end of file diff --git a/src/Agent/Insight.Agent/Services/Configurator.cs b/src/Agent/Insight.Agent/Services/Configurator.cs index 0778ac2..3dbfa76 100644 --- a/src/Agent/Insight.Agent/Services/Configurator.cs +++ b/src/Agent/Insight.Agent/Services/Configurator.cs @@ -1,97 +1,96 @@ using System.Text.Json; -namespace Insight.Agent.Services +namespace Insight.Agent.Services; + +public static class Configurator { - public static class Configurator + public static async ValueTask ReadAsync(string file, CancellationToken cancellationToken = default) + where TConfig : class { - public static async ValueTask ReadAsync(string file, CancellationToken cancellationToken = default) - where TConfig : class + var json = await File.ReadAllTextAsync(file, cancellationToken); + + if (JsonSerializer.Deserialize(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true, WriteIndented = true }) is not TConfig config) { - var json = await File.ReadAllTextAsync(file, cancellationToken); - - if (JsonSerializer.Deserialize(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true, WriteIndented = true }) is not TConfig config) - { - throw new InvalidDataException($"Failed to deserialize ({file})"); - } - - return config; - } - public static async ValueTask ReadJsonAsync(string file, CancellationToken cancellationToken = default) - { - var json = await File.ReadAllTextAsync(file, cancellationToken); - - if (JsonDocument.Parse(json) is not JsonDocument doc) - { - throw new InvalidDataException($"Failed to deserialize ({file})"); - } - - return doc; - } - public static async ValueTask> ReadDictionaryAsync(string file, CancellationToken cancellationToken = default) - { - var json = await File.ReadAllTextAsync(file, cancellationToken); - - if (JsonSerializer.Deserialize>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true, WriteIndented = true }) is not IDictionary config) - { - throw new InvalidDataException($"Failed to deserialize ({file})"); - } - - return config; + throw new InvalidDataException($"Failed to deserialize ({file})"); } - public static async ValueTask WriteAsync(TConfig config, string file, CancellationToken cancellationToken) where TConfig : class + return config; + } + public static async ValueTask ReadJsonAsync(string file, CancellationToken cancellationToken = default) + { + var json = await File.ReadAllTextAsync(file, cancellationToken); + + if (JsonDocument.Parse(json) is not JsonDocument doc) { - await WriteToFileAsync(config, file, cancellationToken); - } - public static async ValueTask WriteAsync(JsonDocument config, string file, CancellationToken cancellationToken) - { - await WriteToFileAsync(config, file, cancellationToken); - } - public static async ValueTask WriteAsync(IDictionary config, string file, CancellationToken cancellationToken) - { - await WriteToFileAsync(config, file, cancellationToken); + throw new InvalidDataException($"Failed to deserialize ({file})"); } - public static async ValueTask AddOrUpdateAsync(KeyValuePair data, string file, CancellationToken cancellationToken) + return doc; + } + public static async ValueTask> ReadDictionaryAsync(string file, CancellationToken cancellationToken = default) + { + var json = await File.ReadAllTextAsync(file, cancellationToken); + + if (JsonSerializer.Deserialize>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true, WriteIndented = true }) is not IDictionary config) { - var readData = await ReadDictionaryAsync(file, cancellationToken); - - var key = readData.Keys.FirstOrDefault(dic => string.Compare(dic, data.Key, StringComparison.OrdinalIgnoreCase) == 0); - - if (key is null) - { - readData.Add(data.Key, data.Value); - } - else - { - readData[key] = data.Value; - } - - await WriteToFileAsync(readData, file, cancellationToken); - } - public static async ValueTask RemoveAsync(string data, string file, CancellationToken cancellationToken) - { - var readData = await ReadDictionaryAsync(file, cancellationToken); - - var key = readData.Keys.FirstOrDefault(dic => string.Compare(dic, data, StringComparison.OrdinalIgnoreCase) == 0); - - if (key is null) - { - return; - } - else - { - readData.Remove(key); - } - - await WriteToFileAsync(readData, file, cancellationToken); + throw new InvalidDataException($"Failed to deserialize ({file})"); } - private static async ValueTask WriteToFileAsync(TData data, string file, CancellationToken cancellationToken) - { - var json = JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = true }); + return config; + } - await File.WriteAllTextAsync(file, json, cancellationToken); + public static async ValueTask WriteAsync(TConfig config, string file, CancellationToken cancellationToken) where TConfig : class + { + await WriteToFileAsync(config, file, cancellationToken); + } + public static async ValueTask WriteAsync(JsonDocument config, string file, CancellationToken cancellationToken) + { + await WriteToFileAsync(config, file, cancellationToken); + } + public static async ValueTask WriteAsync(IDictionary config, string file, CancellationToken cancellationToken) + { + await WriteToFileAsync(config, file, cancellationToken); + } + + public static async ValueTask AddOrUpdateAsync(KeyValuePair data, string file, CancellationToken cancellationToken) + { + var readData = await ReadDictionaryAsync(file, cancellationToken); + + var key = readData.Keys.FirstOrDefault(dic => string.Compare(dic, data.Key, StringComparison.OrdinalIgnoreCase) == 0); + + if (key is null) + { + readData.Add(data.Key, data.Value); } + else + { + readData[key] = data.Value; + } + + await WriteToFileAsync(readData, file, cancellationToken); + } + public static async ValueTask RemoveAsync(string data, string file, CancellationToken cancellationToken) + { + var readData = await ReadDictionaryAsync(file, cancellationToken); + + var key = readData.Keys.FirstOrDefault(dic => string.Compare(dic, data, StringComparison.OrdinalIgnoreCase) == 0); + + if (key is null) + { + return; + } + else + { + readData.Remove(key); + } + + await WriteToFileAsync(readData, file, cancellationToken); + } + + private static async ValueTask WriteToFileAsync(TData data, string file, CancellationToken cancellationToken) + { + var json = JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = true }); + + await File.WriteAllTextAsync(file, json, cancellationToken); } } \ No newline at end of file diff --git a/src/Api/Insight.Api/Constants/Locations.cs b/src/Api/Insight.Api/Constants/Locations.cs index 8db6a8f..94d66e7 100644 --- a/src/Api/Insight.Api/Constants/Locations.cs +++ b/src/Api/Insight.Api/Constants/Locations.cs @@ -1,9 +1,8 @@ using Insight.Domain.Constants; -namespace Insight.Api +namespace Insight.Api; + +public static class Locations { - public static class Locations - { - public static DirectoryInfo UpdatesPath { get; } = new DirectoryInfo($"{Configuration.AppDirectory?.FullName}/files/updates"); - } + public static DirectoryInfo UpdatesPath { get; } = new DirectoryInfo($"{Configuration.AppDirectory?.FullName}/files/updates"); } \ No newline at end of file diff --git a/src/Api/Insight.Api/Controllers/AccountController.cs b/src/Api/Insight.Api/Controllers/AccountController.cs index 21756f3..3510438 100644 --- a/src/Api/Insight.Api/Controllers/AccountController.cs +++ b/src/Api/Insight.Api/Controllers/AccountController.cs @@ -4,73 +4,72 @@ using Insight.Infrastructure.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Insight.Api.Controllers +namespace Insight.Api.Controllers; + +[ApiController, Route("api/accounts")] +public class AccountController : ControllerBase { - [ApiController, Route("api/accounts")] - public class AccountController : ControllerBase + private readonly IdentityService _identityService; + private readonly AccountService _accountService; + private readonly ILogger _logger; + + public AccountController(IdentityService identityService, AccountService accountService, ILogger logger) { - private readonly IdentityService _identityService; - private readonly AccountService _accountService; - private readonly ILogger _logger; + _identityService = identityService; + _accountService = accountService; + _logger = logger; + } - public AccountController(IdentityService identityService, AccountService accountService, ILogger logger) + [HttpGet, Authorize] + public async Task Get([FromQuery] PagedDataRequest request, CancellationToken cancellationToken) + { + try { - _identityService = identityService; - _accountService = accountService; - _logger = logger; + var result = await _accountService.GetAsync( + offset: request.Offset, + limit: request.Limit, + request: Request, + response: Response, + cancellationToken: cancellationToken).ConfigureAwait(false); + + return Ok(result); } - - [HttpGet, Authorize] - public async Task Get([FromQuery] PagedDataRequest request, CancellationToken cancellationToken) + catch (UnauthorizedAccessException ex) { - try - { - var result = await _accountService.GetAsync( - offset: request.Offset, - limit: request.Limit, - request: Request, - response: Response, - cancellationToken: cancellationToken).ConfigureAwait(false); - - return Ok(result); - } - catch (UnauthorizedAccessException ex) - { - return Unauthorized(ex.ToString()); - } - catch (Exception ex) - { - return BadRequest(ex.Message); - } + return Unauthorized(ex.ToString()); } - - [HttpPost("register"), Authorize] - public async Task Register([FromBody] RegistrationModel model) + catch (Exception ex) { - if (string.IsNullOrWhiteSpace(model.Email)) return BadRequest("Email Required"); - if (string.IsNullOrWhiteSpace(model.Password)) return BadRequest("Password Required"); - if (string.IsNullOrWhiteSpace(model.ConfirmPassword)) return BadRequest("Password Confirmation Required"); - - if (model.Password != model.ConfirmPassword) return BadRequest("Passwords do not match"); - - try - { - var result = await _identityService.CreateUserAsync(model.Email, model.Password).ConfigureAwait(false); - - if (result.Succeeded is false) return BadRequest(result.Errors); - } - catch (UnauthorizedAccessException ex) - { - return Unauthorized(ex.Message); - } - catch (Exception ex) - { - return BadRequest(ex.Message); - } - - //await _userManager.AddToRoleAsync(user, "Visitor"); - - return Ok(model.Email); + return BadRequest(ex.Message); } } + + [HttpPost("register"), Authorize] + public async Task Register([FromBody] RegistrationModel model) + { + if (string.IsNullOrWhiteSpace(model.Email)) return BadRequest("Email Required"); + if (string.IsNullOrWhiteSpace(model.Password)) return BadRequest("Password Required"); + if (string.IsNullOrWhiteSpace(model.ConfirmPassword)) return BadRequest("Password Confirmation Required"); + + if (model.Password != model.ConfirmPassword) return BadRequest("Passwords do not match"); + + try + { + var result = await _identityService.CreateUserAsync(model.Email, model.Password).ConfigureAwait(false); + + if (result.Succeeded is false) return BadRequest(result.Errors); + } + catch (UnauthorizedAccessException ex) + { + return Unauthorized(ex.Message); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + + //await _userManager.AddToRoleAsync(user, "Visitor"); + + return Ok(model.Email); + } } \ No newline at end of file diff --git a/src/Api/Insight.Api/Controllers/AgentController.cs b/src/Api/Insight.Api/Controllers/AgentController.cs index cc0f6b1..0a1e5b9 100644 --- a/src/Api/Insight.Api/Controllers/AgentController.cs +++ b/src/Api/Insight.Api/Controllers/AgentController.cs @@ -3,42 +3,41 @@ using Insight.Infrastructure.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Insight.Api.Controllers +namespace Insight.Api.Controllers; + +[ApiController, Route("api/agents")] +public class AgentController : ControllerBase { - [ApiController, Route("api/agents")] - public class AgentController : ControllerBase + private readonly AgentService _agentService; + private readonly ILogger _logger; + + public AgentController(AgentService agentService, ILogger logger) { - private readonly AgentService _agentService; - private readonly ILogger _logger; + _agentService = agentService; + _logger = logger; + } - public AgentController(AgentService agentService, ILogger logger) + [HttpGet, Authorize] + public async Task Get([FromQuery] PagedDataRequest request, CancellationToken cancellationToken) + { + try { - _agentService = agentService; - _logger = logger; + var result = await _agentService.GetAsync( + offset: request.Offset, + limit: request.Limit, + request: Request, + response: Response, + cancellationToken: cancellationToken).ConfigureAwait(false); + + return Ok(result); } - - [HttpGet, Authorize] - public async Task Get([FromQuery] PagedDataRequest request, CancellationToken cancellationToken) + catch (UnauthorizedAccessException ex) { - try - { - var result = await _agentService.GetAsync( - offset: request.Offset, - limit: request.Limit, - request: Request, - response: Response, - cancellationToken: cancellationToken).ConfigureAwait(false); - - return Ok(result); - } - catch (UnauthorizedAccessException ex) - { - return Unauthorized(ex.ToString()); - } - catch (Exception ex) - { - return BadRequest(ex.Message); - } + return Unauthorized(ex.ToString()); + } + catch (Exception ex) + { + return BadRequest(ex.Message); } } } \ No newline at end of file diff --git a/src/Api/Insight.Api/Controllers/CustomerController.cs b/src/Api/Insight.Api/Controllers/CustomerController.cs index 6733f81..4aedc19 100644 --- a/src/Api/Insight.Api/Controllers/CustomerController.cs +++ b/src/Api/Insight.Api/Controllers/CustomerController.cs @@ -3,42 +3,41 @@ using Insight.Infrastructure.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Insight.Api.Controllers +namespace Insight.Api.Controllers; + +[ApiController, Route("api/customers")] +public class CustomerController : ControllerBase { - [ApiController, Route("api/customers")] - public class CustomerController : ControllerBase + private readonly CustomerService _customerService; + private readonly ILogger _logger; + + public CustomerController(CustomerService customerService, ILogger logger) { - private readonly CustomerService _customerService; - private readonly ILogger _logger; + _customerService = customerService; + _logger = logger; + } - public CustomerController(CustomerService customerService, ILogger logger) + [HttpGet, Authorize] + public async Task Get([FromQuery] PagedDataRequest request, CancellationToken cancellationToken) + { + try { - _customerService = customerService; - _logger = logger; + var result = await _customerService.GetAsync( + offset: request.Offset, + limit: request.Limit, + request: Request, + response: Response, + cancellationToken: cancellationToken).ConfigureAwait(false); + + return Ok(result); } - - [HttpGet, Authorize] - public async Task Get([FromQuery] PagedDataRequest request, CancellationToken cancellationToken) + catch (UnauthorizedAccessException ex) { - try - { - var result = await _customerService.GetAsync( - offset: request.Offset, - limit: request.Limit, - request: Request, - response: Response, - cancellationToken: cancellationToken).ConfigureAwait(false); - - return Ok(result); - } - catch (UnauthorizedAccessException ex) - { - return Unauthorized(ex.ToString()); - } - catch (Exception ex) - { - return BadRequest(ex.Message); - } + return Unauthorized(ex.ToString()); + } + catch (Exception ex) + { + return BadRequest(ex.Message); } } } \ No newline at end of file diff --git a/src/Api/Insight.Api/Controllers/HostController.cs b/src/Api/Insight.Api/Controllers/HostController.cs index bd42dac..d8eb5c5 100644 --- a/src/Api/Insight.Api/Controllers/HostController.cs +++ b/src/Api/Insight.Api/Controllers/HostController.cs @@ -3,42 +3,41 @@ using Insight.Infrastructure.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Insight.Api.Controllers +namespace Insight.Api.Controllers; + +[ApiController, Route("api/hosts")] +public class HostController : ControllerBase { - [ApiController, Route("api/hosts")] - public class HostController : ControllerBase + private readonly HostService _hostService; + private readonly ILogger _logger; + + public HostController(HostService hostService, ILogger logger) { - private readonly HostService _hostService; - private readonly ILogger _logger; + _hostService = hostService; + _logger = logger; + } - public HostController(HostService hostService, ILogger logger) + [HttpGet, Authorize] + public async Task Get([FromQuery] PagedDataRequest request, CancellationToken cancellationToken) + { + try { - _hostService = hostService; - _logger = logger; + var result = await _hostService.GetAsync( + offset: request.Offset, + limit: request.Limit, + request: Request, + response: Response, + cancellationToken: cancellationToken).ConfigureAwait(false); + + return Ok(result); } - - [HttpGet, Authorize] - public async Task Get([FromQuery] PagedDataRequest request, CancellationToken cancellationToken) + catch (UnauthorizedAccessException ex) { - try - { - var result = await _hostService.GetAsync( - offset: request.Offset, - limit: request.Limit, - request: Request, - response: Response, - cancellationToken: cancellationToken).ConfigureAwait(false); - - return Ok(result); - } - catch (UnauthorizedAccessException ex) - { - return Unauthorized(ex.ToString()); - } - catch (Exception ex) - { - return BadRequest(ex.Message); - } + return Unauthorized(ex.ToString()); + } + catch (Exception ex) + { + return BadRequest(ex.Message); } } } \ No newline at end of file diff --git a/src/Api/Insight.Api/Controllers/InventoryController.cs b/src/Api/Insight.Api/Controllers/InventoryController.cs index 2a47dff..4327843 100644 --- a/src/Api/Insight.Api/Controllers/InventoryController.cs +++ b/src/Api/Insight.Api/Controllers/InventoryController.cs @@ -8,66 +8,65 @@ using MongoDB.Driver; using System.Text.Json.Serialization; using System.Text.RegularExpressions; -namespace Insight.Api.Controllers +namespace Insight.Api.Controllers; + +[ApiController, Route("api/inventory")] +public class InventoryController : ControllerBase { - [ApiController, Route("api/inventory")] - public class InventoryController : ControllerBase + private readonly InventoryService _inventoryService; + private readonly ILogger _logger; + + public InventoryController(InventoryService inventoryService, ILogger logger) { - private readonly InventoryService _inventoryService; - private readonly ILogger _logger; + _inventoryService = inventoryService; + _logger = logger; + } - public InventoryController(InventoryService inventoryService, ILogger logger) + [HttpGet, Authorize] + public async Task Get([FromQuery] HostApplicationEntity request, [FromQuery] PagedDataRequest meta, CancellationToken cancellationToken) + { + try { - _inventoryService = inventoryService; - _logger = logger; + var filter = Builders.Filter.Empty; + + if (request.Id is not null) + filter &= Builders.Filter.Eq(p => p.Id, request.Id); + + if (request.Host is not null) + filter &= Builders.Filter.Eq(p => p.Host, request.Host); + + if (request.Name is not null) + filter &= Builders.Filter.Regex(p => p.Name, new BsonRegularExpression(new Regex(request.Name, RegexOptions.IgnoreCase))); + + var result = await _inventoryService.GetAsync( + filter: filter, + offset: meta.Offset, + limit: meta.Limit, + request: Request, + response: Response, + cancellationToken: cancellationToken).ConfigureAwait(false); + + return Ok(result); } - - [HttpGet, Authorize] - public async Task Get([FromQuery] HostApplicationEntity request, [FromQuery] PagedDataRequest meta, CancellationToken cancellationToken) + catch (UnauthorizedAccessException ex) { - try - { - var filter = Builders.Filter.Empty; - - if (request.Id is not null) - filter &= Builders.Filter.Eq(p => p.Id, request.Id); - - if (request.Host is not null) - filter &= Builders.Filter.Eq(p => p.Host, request.Host); - - if (request.Name is not null) - filter &= Builders.Filter.Regex(p => p.Name, new BsonRegularExpression(new Regex(request.Name, RegexOptions.IgnoreCase))); - - var result = await _inventoryService.GetAsync( - filter: filter, - offset: meta.Offset, - limit: meta.Limit, - request: Request, - response: Response, - cancellationToken: cancellationToken).ConfigureAwait(false); - - return Ok(result); - } - catch (UnauthorizedAccessException ex) - { - return Unauthorized(ex.ToString()); - } - catch (Exception ex) - { - return BadRequest(ex.Message); - } + return Unauthorized(ex.ToString()); } - - public class ApplicationRequest + catch (Exception ex) { - [JsonPropertyName("id")] - public string? Id { get; set; } - - [JsonPropertyName("host")] - public string? Host { get; set; } - - [JsonPropertyName("name")] - public string? Name { get; set; } + return BadRequest(ex.Message); } } + + public class ApplicationRequest + { + [JsonPropertyName("id")] + public string? Id { get; set; } + + [JsonPropertyName("host")] + public string? Host { get; set; } + + [JsonPropertyName("name")] + public string? Name { get; set; } + } } \ No newline at end of file diff --git a/src/Api/Insight.Api/Controllers/SetupController.cs b/src/Api/Insight.Api/Controllers/SetupController.cs index 913e294..831a922 100644 --- a/src/Api/Insight.Api/Controllers/SetupController.cs +++ b/src/Api/Insight.Api/Controllers/SetupController.cs @@ -1,30 +1,29 @@ using Microsoft.AspNetCore.Mvc; -namespace Insight.Server.Controllers +namespace Insight.Server.Controllers; + +[ApiController, Route("api/setup")] +public class SetupController : ControllerBase { - [ApiController, Route("api/setup")] - public class SetupController : ControllerBase + private readonly ILogger _logger; + + public SetupController(ILogger logger) { - private readonly ILogger _logger; + _logger = logger; + } - public SetupController(ILogger logger) + [HttpGet("windows")] + public async Task GetAsync(CancellationToken cancellationToken) + { + _logger.LogInformation("[{method}] {route} => {ep}", Request.Method, Request.HttpContext.Request.Path, Request.HttpContext.Connection.RemoteIpAddress); + + var files = new DirectoryInfo($"{Domain.Constants.Configuration.AppDirectory?.FullName}/files/setup").GetFiles(); + + if (files.Length == 0) { - _logger = logger; + return NotFound(); } - [HttpGet("windows")] - public async Task GetAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("[{method}] {route} => {ep}", Request.Method, Request.HttpContext.Request.Path, Request.HttpContext.Connection.RemoteIpAddress); - - var files = new DirectoryInfo($"{Domain.Constants.Configuration.AppDirectory?.FullName}/files/setup").GetFiles(); - - if (files.Length == 0) - { - return NotFound(); - } - - return File(await System.IO.File.ReadAllBytesAsync(files.OrderBy(p => p.LastWriteTime).First().FullName, cancellationToken), "application/zip", "setup-win64.zip"); - } + return File(await System.IO.File.ReadAllBytesAsync(files.OrderBy(p => p.LastWriteTime).First().FullName, cancellationToken), "application/zip", "setup-win64.zip"); } } \ No newline at end of file diff --git a/src/Api/Insight.Api/Controllers/TokenController.cs b/src/Api/Insight.Api/Controllers/TokenController.cs index 372a066..9c36083 100644 --- a/src/Api/Insight.Api/Controllers/TokenController.cs +++ b/src/Api/Insight.Api/Controllers/TokenController.cs @@ -3,83 +3,82 @@ using Insight.Infrastructure.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Insight.Api.Controllers +namespace Insight.Api.Controllers; + +[ApiController, Route("api/token", Order = 0)] +public class TokenController : ControllerBase { - [ApiController, Route("api/token", Order = 0)] - public class TokenController : ControllerBase + private readonly TokenService _tokenService; + + public TokenController(TokenService tokenService) { - private readonly TokenService _tokenService; + _tokenService = tokenService; + } - public TokenController(TokenService tokenService) + /// + /// Access Token Request + /// + [HttpPost, AllowAnonymous] + public async Task Authentication([FromBody] TokenRequest request) + { + try { - _tokenService = tokenService; + var result = await _tokenService.GetAsync(request.Username, request.Password, request.Code, HttpContext.Connection.RemoteIpAddress).ConfigureAwait(false); + return Ok(result); } - - /// - /// Access Token Request - /// - [HttpPost, AllowAnonymous] - public async Task Authentication([FromBody] TokenRequest request) + catch (UnauthorizedAccessException ex) { - try - { - var result = await _tokenService.GetAsync(request.Username, request.Password, request.Code, HttpContext.Connection.RemoteIpAddress).ConfigureAwait(false); - return Ok(result); - } - catch (UnauthorizedAccessException ex) - { - return Unauthorized(ex.Message); - } - catch (Exception ex) - { - return BadRequest(ex.Message); - } + return Unauthorized(ex.Message); } - - /// - /// Refresh Token Request - /// - [HttpPost("refresh"), AllowAnonymous] - public async Task Refresh([FromBody] TokenRefreshRequest request) + catch (Exception ex) { - if (string.IsNullOrWhiteSpace(request.Token)) return BadRequest("Refresh Token Required"); - - try - { - var result = await _tokenService.RefreshAsync(request.Token, HttpContext.Connection.RemoteIpAddress).ConfigureAwait(false); - return Ok(result); - } - catch (UnauthorizedAccessException ex) - { - return Unauthorized(ex.Message); - } - catch (Exception ex) - { - return BadRequest(ex.Message); - } + return BadRequest(ex.Message); } + } - /// - /// Revoke Token Request - /// - [HttpPost("revoke"), AllowAnonymous] - public async Task Revoke([FromBody] TokenRevokeRequest request) + /// + /// Refresh Token Request + /// + [HttpPost("refresh"), AllowAnonymous] + public async Task Refresh([FromBody] TokenRefreshRequest request) + { + if (string.IsNullOrWhiteSpace(request.Token)) return BadRequest("Refresh Token Required"); + + try { - if (string.IsNullOrWhiteSpace(request.Token)) return BadRequest("Refresh Token Required"); + var result = await _tokenService.RefreshAsync(request.Token, HttpContext.Connection.RemoteIpAddress).ConfigureAwait(false); + return Ok(result); + } + catch (UnauthorizedAccessException ex) + { + return Unauthorized(ex.Message); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } - try - { - await _tokenService.RevokeAsync(request.Token, request.Reason ?? "revoked by user", HttpContext.Connection.RemoteIpAddress).ConfigureAwait(false); - return Ok(); - } - catch (UnauthorizedAccessException ex) - { - return Unauthorized(ex.Message); - } - catch (Exception ex) - { - return BadRequest(ex.Message); - } + /// + /// Revoke Token Request + /// + [HttpPost("revoke"), AllowAnonymous] + public async Task Revoke([FromBody] TokenRevokeRequest request) + { + if (string.IsNullOrWhiteSpace(request.Token)) return BadRequest("Refresh Token Required"); + + try + { + await _tokenService.RevokeAsync(request.Token, request.Reason ?? "revoked by user", HttpContext.Connection.RemoteIpAddress).ConfigureAwait(false); + return Ok(); + } + catch (UnauthorizedAccessException ex) + { + return Unauthorized(ex.Message); + } + catch (Exception ex) + { + return BadRequest(ex.Message); } } } \ No newline at end of file diff --git a/src/Api/Insight.Api/Controllers/UpdateController.cs b/src/Api/Insight.Api/Controllers/UpdateController.cs index 6ff09df..173a636 100644 --- a/src/Api/Insight.Api/Controllers/UpdateController.cs +++ b/src/Api/Insight.Api/Controllers/UpdateController.cs @@ -2,92 +2,91 @@ using Insight.Domain.Models; using Microsoft.AspNetCore.Mvc; -namespace Insight.Server.Controllers +namespace Insight.Server.Controllers; + +[ApiController, Route("api/update")] +public class UpdateController : ControllerBase { - [ApiController, Route("api/update")] - public class UpdateController : ControllerBase + private readonly ILogger _logger; + + public UpdateController(ILogger logger) { - private readonly ILogger _logger; + _logger = logger; + } - public UpdateController(ILogger logger) + [HttpGet("updater/windows")] + public IActionResult UpdaterWindows() + { + _logger.LogInformation("[{method}] {route} => {ep}", Request.Method, Request.HttpContext.Request.Path, Request.HttpContext.Connection.RemoteIpAddress); + + var updateDir = new DirectoryInfo($"{Locations.UpdatesPath}/updater/windows"); + + if (updateDir.Exists is false) { - _logger = logger; + return NotFound(); } - [HttpGet("updater/windows")] - public IActionResult UpdaterWindows() + var updateLock = new FileInfo($"{updateDir.FullName}/.lock"); + + if (updateLock.Exists) { - _logger.LogInformation("[{method}] {route} => {ep}", Request.Method, Request.HttpContext.Request.Path, Request.HttpContext.Connection.RemoteIpAddress); - - var updateDir = new DirectoryInfo($"{Locations.UpdatesPath}/updater/windows"); - - if (updateDir.Exists is false) - { - return NotFound(); - } - - var updateLock = new FileInfo($"{updateDir.FullName}/.lock"); - - if (updateLock.Exists) - { - return NotFound("locked"); - } - - var versions = updateDir.GetFiles("*.zip", SearchOption.TopDirectoryOnly); - - if (versions is null || versions.Any() is false) return NotFound(); - - var latest = versions.OrderBy(x => x.Name).FirstOrDefault(); - - if (latest is null) return NotFound(); - - var relPath = $"{Path.GetRelativePath($"{Domain.Constants.Configuration.AppDirectory?.FullName}", latest.FullName)}"; - - if (Version.TryParse(Path.GetFileNameWithoutExtension(latest.Name), out var fileversion) is false) return NotFound(); - - return Ok(new UpdateResponse - { - Version = fileversion, - Uri = new Uri($"{Request.Scheme}://{Request.Host}/api/{relPath}") - }); + return NotFound("locked"); } - [HttpGet("agent/windows")] - public IActionResult AgentWindows() + var versions = updateDir.GetFiles("*.zip", SearchOption.TopDirectoryOnly); + + if (versions is null || versions.Any() is false) return NotFound(); + + var latest = versions.OrderBy(x => x.Name).FirstOrDefault(); + + if (latest is null) return NotFound(); + + var relPath = $"{Path.GetRelativePath($"{Domain.Constants.Configuration.AppDirectory?.FullName}", latest.FullName)}"; + + if (Version.TryParse(Path.GetFileNameWithoutExtension(latest.Name), out var fileversion) is false) return NotFound(); + + return Ok(new UpdateResponse { - _logger.LogInformation("[{method}] {route} => {ep}", Request.Method, Request.HttpContext.Request.Path, Request.HttpContext.Connection.RemoteIpAddress); + Version = fileversion, + Uri = new Uri($"{Request.Scheme}://{Request.Host}/api/{relPath}") + }); + } - var updateDir = new DirectoryInfo($"{Locations.UpdatesPath}/agent/windows"); + [HttpGet("agent/windows")] + public IActionResult AgentWindows() + { + _logger.LogInformation("[{method}] {route} => {ep}", Request.Method, Request.HttpContext.Request.Path, Request.HttpContext.Connection.RemoteIpAddress); - if (updateDir.Exists is false) - { - return NotFound(); - } + var updateDir = new DirectoryInfo($"{Locations.UpdatesPath}/agent/windows"); - var updateLock = new FileInfo($"{updateDir.FullName}/.lock"); - - if (updateLock.Exists) - { - return NotFound("locked"); - } - - var versions = updateDir.GetFiles("*.zip", SearchOption.TopDirectoryOnly); - - if (versions is null || versions.Any() is false) return NotFound(); - - var latest = versions.OrderBy(x => x.Name).FirstOrDefault(); - - if (latest is null) return NotFound(); - - var relPath = $"{Path.GetRelativePath($"{Domain.Constants.Configuration.AppDirectory?.FullName}", latest.FullName)}"; - - if (Version.TryParse(Path.GetFileNameWithoutExtension(latest.Name), out var fileversion) is false) return NotFound(); - - return Ok(new UpdateResponse - { - Version = fileversion, - Uri = new Uri($"{Request.Scheme}://{Request.Host}/api/{relPath}") - }); + if (updateDir.Exists is false) + { + return NotFound(); } + + var updateLock = new FileInfo($"{updateDir.FullName}/.lock"); + + if (updateLock.Exists) + { + return NotFound("locked"); + } + + var versions = updateDir.GetFiles("*.zip", SearchOption.TopDirectoryOnly); + + if (versions is null || versions.Any() is false) return NotFound(); + + var latest = versions.OrderBy(x => x.Name).FirstOrDefault(); + + if (latest is null) return NotFound(); + + var relPath = $"{Path.GetRelativePath($"{Domain.Constants.Configuration.AppDirectory?.FullName}", latest.FullName)}"; + + if (Version.TryParse(Path.GetFileNameWithoutExtension(latest.Name), out var fileversion) is false) return NotFound(); + + return Ok(new UpdateResponse + { + Version = fileversion, + Uri = new Uri($"{Request.Scheme}://{Request.Host}/api/{relPath}") + }); } } \ No newline at end of file diff --git a/src/Api/Insight.Api/Extensions/ServiceExtensions.cs b/src/Api/Insight.Api/Extensions/ServiceExtensions.cs index 46b91a7..afd32de 100644 --- a/src/Api/Insight.Api/Extensions/ServiceExtensions.cs +++ b/src/Api/Insight.Api/Extensions/ServiceExtensions.cs @@ -2,58 +2,57 @@ using Microsoft.OpenApi.Models; using System.Reflection; -namespace Insight.Api.Hosting +namespace Insight.Api.Hosting; + +public static class ServiceExtensions { - public static class ServiceExtensions + internal static IServiceCollection AddSwaggerServices(this IServiceCollection services, IConfiguration configuration) { - internal static IServiceCollection AddSwaggerServices(this IServiceCollection services, IConfiguration configuration) + services.AddEndpointsApiExplorer(); + services.AddSwaggerGen(options => { - services.AddEndpointsApiExplorer(); - services.AddSwaggerGen(options => + options.SwaggerDoc("v1", new OpenApiInfo { - options.SwaggerDoc("v1", new OpenApiInfo - { - Title = "Insight API", - Version = "v1" - }); - - options.AddSecurityDefinition(name: "Bearer", securityScheme: new OpenApiSecurityScheme - { - Name = "Authorization", - Description = "Enter the Bearer Authorization string as following: `Bearer Generated-JWT-Token`", - In = ParameterLocation.Header, - Type = SecuritySchemeType.ApiKey, - Scheme = "Bearer", - BearerFormat = "JWT", - - Reference = new OpenApiReference - { - Id = JwtBearerDefaults.AuthenticationScheme, - Type = ReferenceType.SecurityScheme - } - }); - - options.AddSecurityRequirement(new OpenApiSecurityRequirement - { - { - new OpenApiSecurityScheme - { - In = ParameterLocation.Header, - Reference = new OpenApiReference - { - Id = "Bearer", - Type = ReferenceType.SecurityScheme - } - }, - new List() - } - }); - - var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; - options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); + Title = "Insight API", + Version = "v1" }); - return services; - } + options.AddSecurityDefinition(name: "Bearer", securityScheme: new OpenApiSecurityScheme + { + Name = "Authorization", + Description = "Enter the Bearer Authorization string as following: `Bearer Generated-JWT-Token`", + In = ParameterLocation.Header, + Type = SecuritySchemeType.ApiKey, + Scheme = "Bearer", + BearerFormat = "JWT", + + Reference = new OpenApiReference + { + Id = JwtBearerDefaults.AuthenticationScheme, + Type = ReferenceType.SecurityScheme + } + }); + + options.AddSecurityRequirement(new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + In = ParameterLocation.Header, + Reference = new OpenApiReference + { + Id = "Bearer", + Type = ReferenceType.SecurityScheme + } + }, + new List() + } + }); + + var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; + options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); + }); + + return services; } } \ No newline at end of file diff --git a/src/Api/Insight.Api/Models/RegistrationModel.cs b/src/Api/Insight.Api/Models/RegistrationModel.cs index 206b2dc..0794854 100644 --- a/src/Api/Insight.Api/Models/RegistrationModel.cs +++ b/src/Api/Insight.Api/Models/RegistrationModel.cs @@ -1,23 +1,22 @@ using System.ComponentModel.DataAnnotations; -namespace Insight.Api.Models +namespace Insight.Api.Models; + +public class RegistrationModel { - public class RegistrationModel - { - public string? FirstName { get; set; } - public string? LastName { get; set; } + public string? FirstName { get; set; } + public string? LastName { get; set; } - [Required(ErrorMessage = "Email is required")] - [EmailAddress] - public string? Email { get; set; } + [Required(ErrorMessage = "Email is required")] + [EmailAddress] + public string? Email { get; set; } - [Required(ErrorMessage = "Password is required")] - [DataType(DataType.Password)] - public string? Password { get; set; } + [Required(ErrorMessage = "Password is required")] + [DataType(DataType.Password)] + public string? Password { get; set; } - [Required(ErrorMessage = "Password is required")] - [DataType(DataType.Password)] - [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] - public string? ConfirmPassword { get; set; } - } + [Required(ErrorMessage = "Password is required")] + [DataType(DataType.Password)] + [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] + public string? ConfirmPassword { get; set; } } diff --git a/src/Api/Insight.Api/Program.cs b/src/Api/Insight.Api/Program.cs index 0c9e95f..8e2b778 100644 --- a/src/Api/Insight.Api/Program.cs +++ b/src/Api/Insight.Api/Program.cs @@ -3,97 +3,96 @@ using Insight.Domain.Constants; using Insight.Infrastructure; using Microsoft.Extensions.FileProviders; -namespace Insight.Api +namespace Insight.Api; + +internal class Program { - public class Program + public static async Task Main(string[] args) { - public static async Task Main(string[] args) + var builder = WebApplication.CreateBuilder(args); + builder.Host.UseWindowsService(); + builder.Host.UseSystemd(); + + // LOGGER + builder.Logging.ClearProviders(); + builder.Logging.SetMinimumLevel(LogLevel.Trace); + builder.Logging.AddFilter("Microsoft.AspNetCore", LogLevel.Warning); + + builder.Logging.AddSimpleConsole(options => { - var builder = WebApplication.CreateBuilder(args); - builder.Host.UseWindowsService(); - builder.Host.UseSystemd(); + options.IncludeScopes = true; + options.SingleLine = true; + options.TimestampFormat = "yyyy-MM-dd HH:mm:ss.fff "; + }); - // LOGGER - builder.Logging.ClearProviders(); - builder.Logging.SetMinimumLevel(LogLevel.Trace); - builder.Logging.AddFilter("Microsoft.AspNetCore", LogLevel.Warning); + builder.Logging.AddFile($"{Configuration.AppDirectory?.FullName}/" + "logs/api_{Date}.log", LogLevel.Trace, fileSizeLimitBytes: 104857600, retainedFileCountLimit: 10, outputTemplate: "{Timestamp:o} [{Level:u3}] {Message} {NewLine}{Exception}"); - builder.Logging.AddSimpleConsole(options => - { - options.IncludeScopes = true; - options.SingleLine = true; - options.TimestampFormat = "yyyy-MM-dd HH:mm:ss.fff "; - }); + // INFRASTRUCTURE + builder.Services.AddDatabase(builder.Configuration); + builder.Services.AddInfrastructureServices(); - builder.Logging.AddFile($"{Configuration.AppDirectory?.FullName}/" + "logs/api_{Date}.log", LogLevel.Trace, fileSizeLimitBytes: 104857600, retainedFileCountLimit: 10, outputTemplate: "{Timestamp:o} [{Level:u3}] {Message} {NewLine}{Exception}"); + // IDENTITY + builder.Services.AddIdentityServices(builder.Configuration); + builder.Services.AddBearerAuthentication(builder.Configuration); + builder.Services.AddTokenServices(builder.Configuration); - // INFRASTRUCTURE - builder.Services.AddDatabase(builder.Configuration); - builder.Services.AddInfrastructureServices(); + // SECURITY + builder.Services.AddAuthorization(); - // IDENTITY - builder.Services.AddIdentityServices(builder.Configuration); - builder.Services.AddBearerAuthentication(builder.Configuration); - builder.Services.AddTokenServices(builder.Configuration); + // WEBSERVICES + builder.Services.AddProxyServices(builder.Configuration); + builder.Services.AddRoutingServices(builder.Configuration); + builder.Services.AddControllers(); - // SECURITY - builder.Services.AddAuthorization(); + // SWAGGER + builder.Services.AddSwaggerServices(builder.Configuration); - // WEBSERVICES - builder.Services.AddProxyServices(builder.Configuration); - builder.Services.AddRoutingServices(builder.Configuration); - builder.Services.AddControllers(); + //builder.Services.AddControllers(); + //builder.Services.AddEndpointsApiExplorer(); + //builder.Services.AddSwaggerGen(); - // SWAGGER - builder.Services.AddSwaggerServices(builder.Configuration); + var app = builder.Build(); - //builder.Services.AddControllers(); - //builder.Services.AddEndpointsApiExplorer(); - //builder.Services.AddSwaggerGen(); + // Configure the HTTP request pipeline. + app.UseForwardedHeaders(); - var app = builder.Build(); + if (app.Environment.IsDevelopment()) + { - // Configure the HTTP request pipeline. - app.UseForwardedHeaders(); - - if (app.Environment.IsDevelopment()) - { - - } - - app.UseSwagger(options => - { - options.RouteTemplate = "api/swagger/{documentName}/swagger.json"; - }); - - app.UseSwaggerUI(options => - { - options.DefaultModelsExpandDepth(-1); - options.SwaggerEndpoint("/api/swagger/v1/swagger.json", "v1"); - options.RoutePrefix = "api/swagger"; - }); - - app.UseCors(x => x - .AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader()); - - app.UseAuthorization(); - - app.MapControllers(); - - // STATIC FILES (UPDATES) - var files = new DirectoryInfo($"{Domain.Constants.Configuration.AppDirectory?.FullName}/files"); - files.Create(); - - app.UseStaticFiles(new StaticFileOptions - { - FileProvider = new PhysicalFileProvider(files.FullName), - RequestPath = "/api/files", - ServeUnknownFileTypes = true - }); - - await app.RunAsync(); } + + app.UseSwagger(options => + { + options.RouteTemplate = "api/swagger/{documentName}/swagger.json"; + }); + + app.UseSwaggerUI(options => + { + options.DefaultModelsExpandDepth(-1); + options.SwaggerEndpoint("/api/swagger/v1/swagger.json", "v1"); + options.RoutePrefix = "api/swagger"; + }); + + app.UseCors(x => x + .AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader()); + + app.UseAuthorization(); + + app.MapControllers(); + + // STATIC FILES (UPDATES) + var files = new DirectoryInfo($"{Domain.Constants.Configuration.AppDirectory?.FullName}/files"); + files.Create(); + + app.UseStaticFiles(new StaticFileOptions + { + FileProvider = new PhysicalFileProvider(files.FullName), + RequestPath = "/api/files", + ServeUnknownFileTypes = true + }); + + await app.RunAsync(); } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Constants/Appsettings.cs b/src/Core/Insight.Infrastructure/Constants/Appsettings.cs index d85fd32..2d45d12 100644 --- a/src/Core/Insight.Infrastructure/Constants/Appsettings.cs +++ b/src/Core/Insight.Infrastructure/Constants/Appsettings.cs @@ -1,14 +1,13 @@ -namespace Insight.Infrastructure -{ - public class Appsettings - { - public const string Database = "database"; - public const string JwtKey = "jwt.key"; - public const string JwtAudience = "jwt.audience"; - public const string JwtIssuer = "jwt.issuer"; - public const string JwtExp = "jwt.exp"; +namespace Insight.Infrastructure; - public const string ServerHost = "server.host"; - public const string ServerPort = "server.port"; - } +public class Appsettings +{ + public const string Database = "database"; + public const string JwtKey = "jwt.key"; + public const string JwtAudience = "jwt.audience"; + public const string JwtIssuer = "jwt.issuer"; + public const string JwtExp = "jwt.exp"; + + public const string ServerHost = "server.host"; + public const string ServerPort = "server.port"; } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Constants/Monitoring.cs b/src/Core/Insight.Infrastructure/Constants/Monitoring.cs index eb6c355..f88284b 100644 --- a/src/Core/Insight.Infrastructure/Constants/Monitoring.cs +++ b/src/Core/Insight.Infrastructure/Constants/Monitoring.cs @@ -1,8 +1,7 @@ -namespace Insight.Infrastructure +namespace Insight.Infrastructure; + +public static class Monitoring { - public static class Monitoring - { - public static readonly Uri StatusUri = new("https://admin.webmatic.de/monitoring/computer/send/status"); - public static readonly Uri LogUri = new("https://admin.webmatic.de/monitoring/computer/send/log"); - } + public static readonly Uri StatusUri = new("https://admin.webmatic.de/monitoring/computer/send/status"); + public static readonly Uri LogUri = new("https://admin.webmatic.de/monitoring/computer/send/log"); } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Constants/Settings.cs b/src/Core/Insight.Infrastructure/Constants/Settings.cs index b667086..ec9bec6 100644 --- a/src/Core/Insight.Infrastructure/Constants/Settings.cs +++ b/src/Core/Insight.Infrastructure/Constants/Settings.cs @@ -1,7 +1,6 @@ -namespace Insight.Infrastructure +namespace Insight.Infrastructure; + +public class Settings { - public class Settings - { - public const string Database = "insight"; - } + public const string Database = "insight"; } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/Agent.cs b/src/Core/Insight.Infrastructure/Entities/Agent.cs index d538498..1f4109e 100644 --- a/src/Core/Insight.Infrastructure/Entities/Agent.cs +++ b/src/Core/Insight.Infrastructure/Entities/Agent.cs @@ -3,60 +3,59 @@ using MongoDB.Bson.Serialization.Attributes; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class AgentEntity { - [BsonIgnoreExtraElements] - public class AgentEntity + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } + + [BsonElement("insert")] + public DateTime? Insert { get; set; } + + [BsonElement("update")] + public DateTime? Update { get; set; } + + [BsonElement("serial"), Required] + public string? Serial { get; set; } + + [BsonElement("hostname")] + public string? Hostname { get; set; } + + [BsonElement("version"), BsonRepresentation(BsonType.String)] + public Version? Version { get; set; } + + [BsonElement("endpoint"), BsonRepresentation(BsonType.String)] + public string? Endpoint { get; set; } + + [BsonElement("connected")] + public DateTime? Connected { get; set; } + + [BsonElement("activity")] + public DateTime? Activity { get; set; } + + [BsonElement("bytes_sent")] + public long SentBytes { get; set; } + + [BsonElement("bytes_received")] + public long ReceivedBytes { get; set; } + + [BsonElement("packets_sent")] + public long SentPackets { get; set; } + + [BsonElement("packets_received")] + public long ReceivedPackets { get; set; } + + //[BsonElement("latency")] + //public TimeSpan? Latency { get; set; } + + [BsonIgnoreIfNull, JsonIgnore] + public List? Hosts { get; set; } + + public bool GetOnlineState() { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } - - [BsonElement("insert")] - public DateTime? Insert { get; set; } - - [BsonElement("update")] - public DateTime? Update { get; set; } - - [BsonElement("serial"), Required] - public string? Serial { get; set; } - - [BsonElement("hostname")] - public string? Hostname { get; set; } - - [BsonElement("version"), BsonRepresentation(BsonType.String)] - public Version? Version { get; set; } - - [BsonElement("endpoint"), BsonRepresentation(BsonType.String)] - public string? Endpoint { get; set; } - - [BsonElement("connected")] - public DateTime? Connected { get; set; } - - [BsonElement("activity")] - public DateTime? Activity { get; set; } - - [BsonElement("bytes_sent")] - public long SentBytes { get; set; } - - [BsonElement("bytes_received")] - public long ReceivedBytes { get; set; } - - [BsonElement("packets_sent")] - public long SentPackets { get; set; } - - [BsonElement("packets_received")] - public long ReceivedPackets { get; set; } - - //[BsonElement("latency")] - //public TimeSpan? Latency { get; set; } - - [BsonIgnoreIfNull, JsonIgnore] - public List? Hosts { get; set; } - - public bool GetOnlineState() - { - if (Activity is null) return false; - return Activity.Value.ToLocalTime().Add(TimeSpan.FromSeconds(60)).Subtract(DateTime.Now).Seconds > 0; - } + if (Activity is null) return false; + return Activity.Value.ToLocalTime().Add(TimeSpan.FromSeconds(60)).Subtract(DateTime.Now).Seconds > 0; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/AgentLog.cs b/src/Core/Insight.Infrastructure/Entities/AgentLog.cs index 8c32884..9cbd8cb 100644 --- a/src/Core/Insight.Infrastructure/Entities/AgentLog.cs +++ b/src/Core/Insight.Infrastructure/Entities/AgentLog.cs @@ -2,36 +2,35 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class AgentLogEntity { - [BsonIgnoreExtraElements] - public class AgentLogEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_agent"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("agent")] - public string? Agent { get; set; } + [BsonElement("_agent"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("agent")] + public string? Agent { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("eventid")] - public string? EventId { get; set; } + [BsonElement("eventid")] + public string? EventId { get; set; } - [BsonElement("status")] - public string? Status { get; set; } + [BsonElement("status")] + public string? Status { get; set; } - [BsonElement("source")] - public string? Source { get; set; } + [BsonElement("source")] + public string? Source { get; set; } - [BsonElement("category")] - public string? Category { get; set; } + [BsonElement("category")] + public string? Category { get; set; } - [BsonElement("message")] - public string? Message { get; set; } + [BsonElement("message")] + public string? Message { get; set; } - [BsonElement("timestamp")] - public DateTime? Timestamp { get; set; } - } + [BsonElement("timestamp")] + public DateTime? Timestamp { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/Customer.cs b/src/Core/Insight.Infrastructure/Entities/Customer.cs index 983715e..e6a23fe 100644 --- a/src/Core/Insight.Infrastructure/Entities/Customer.cs +++ b/src/Core/Insight.Infrastructure/Entities/Customer.cs @@ -3,27 +3,26 @@ using MongoDB.Bson.Serialization.Attributes; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class CustomerEntity { - [BsonIgnoreExtraElements] - public class CustomerEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("name"), Required] - public string? Name { get; set; } + [BsonElement("name"), Required] + public string? Name { get; set; } - [BsonElement("tag")] - public string? Tag { get; set; } + [BsonElement("tag")] + public string? Tag { get; set; } - [BsonIgnoreIfNull, JsonIgnore] - public List? Hosts { get; set; } - } + [BsonIgnoreIfNull, JsonIgnore] + public List? Hosts { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/Host.cs b/src/Core/Insight.Infrastructure/Entities/Host.cs index 9297e78..1766708 100644 --- a/src/Core/Insight.Infrastructure/Entities/Host.cs +++ b/src/Core/Insight.Infrastructure/Entities/Host.cs @@ -3,36 +3,35 @@ using MongoDB.Bson.Serialization.Attributes; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostEntity { - [BsonIgnoreExtraElements] - public class HostEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_customer"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("customer")] - public string? Customer { get; set; } + [BsonElement("_customer"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("customer")] + public string? Customer { get; set; } - [BsonElement("_agent"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("agent")] - public string? Agent { get; set; } + [BsonElement("_agent"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("agent")] + public string? Agent { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("name"), Required] - public string? Name { get; set; } + [BsonElement("name"), Required] + public string? Name { get; set; } - [BsonElement("description")] - public string? Description { get; set; } + [BsonElement("description")] + public string? Description { get; set; } - [BsonIgnoreIfNull, JsonIgnore] - public List? Customers { get; set; } + [BsonIgnoreIfNull, JsonIgnore] + public List? Customers { get; set; } - [BsonIgnoreIfNull, JsonIgnore] - public List? Agents { get; set; } - } + [BsonIgnoreIfNull, JsonIgnore] + public List? Agents { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostApplication.cs b/src/Core/Insight.Infrastructure/Entities/HostApplication.cs index 473f383..8d1b52b 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostApplication.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostApplication.cs @@ -2,39 +2,38 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostApplicationEntity { - [BsonIgnoreExtraElements] - public class HostApplicationEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("company")] - public string? Company { get; set; } + [BsonElement("company")] + public string? Company { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("architecture")] - public string? Architecture { get; set; } + [BsonElement("architecture")] + public string? Architecture { get; set; } - [BsonElement("version")] - public string? Version { get; set; } + [BsonElement("version")] + public string? Version { get; set; } - [BsonElement("installdate")] - public DateTime? InstallDate { get; set; } - } + [BsonElement("installdate")] + public DateTime? InstallDate { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostDrive.cs b/src/Core/Insight.Infrastructure/Entities/HostDrive.cs index f8cde99..2e77a64 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostDrive.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostDrive.cs @@ -2,51 +2,50 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostDriveEntity { - [BsonIgnoreExtraElements] - public class HostDriveEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("index")] - public uint? Index { get; set; } + [BsonElement("index")] + public uint? Index { get; set; } - [BsonElement("company")] - public string? Company { get; set; } + [BsonElement("company")] + public string? Company { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("size")] - public ulong? Size { get; set; } + [BsonElement("size")] + public ulong? Size { get; set; } - [BsonElement("type")] - public string? Type { get; set; } + [BsonElement("type")] + public string? Type { get; set; } - [BsonElement("serial")] - public string? Serial { get; set; } + [BsonElement("serial")] + public string? Serial { get; set; } - [BsonElement("firmware")] - public string? Firmware { get; set; } + [BsonElement("firmware")] + public string? Firmware { get; set; } - [BsonElement("status")] - public string? Status { get; set; } + [BsonElement("status")] + public string? Status { get; set; } - [BsonElement("pnp")] - public string? Pnp { get; set; } - } + [BsonElement("pnp")] + public string? Pnp { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostHypervisor.cs b/src/Core/Insight.Infrastructure/Entities/HostHypervisor.cs index a51b202..abbdf4b 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostHypervisor.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostHypervisor.cs @@ -2,187 +2,186 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostHypervisorVirtualMaschineEntity { - [BsonIgnoreExtraElements] - public class HostHypervisorVirtualMaschineEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("uniqueid")] - public string? UniqueId { get; set; } + [BsonElement("uniqueid")] + public string? UniqueId { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("notes")] - public string? Notes { get; set; } + [BsonElement("notes")] + public string? Notes { get; set; } - [BsonElement("enabled")] - public string? Enabled { get; set; } + [BsonElement("enabled")] + public string? Enabled { get; set; } - [BsonElement("enabled_default")] - public string? EnabledDefault { get; set; } + [BsonElement("enabled_default")] + public string? EnabledDefault { get; set; } - [BsonElement("health")] - public string? Health { get; set; } + [BsonElement("health")] + public string? Health { get; set; } - [BsonElement("status")] - public string? Status { get; set; } + [BsonElement("status")] + public string? Status { get; set; } - [BsonElement("ontime")] - public ulong? OnTime { get; set; } + [BsonElement("ontime")] + public ulong? OnTime { get; set; } - [BsonElement("replication_state")] - public string? ReplicationState { get; set; } + [BsonElement("replication_state")] + public string? ReplicationState { get; set; } - [BsonElement("replication_health")] - public string? ReplicationHealth { get; set; } + [BsonElement("replication_health")] + public string? ReplicationHealth { get; set; } - [BsonElement("version_configuration")] - public string? ConfigurationVersion { get; set; } + [BsonElement("version_configuration")] + public string? ConfigurationVersion { get; set; } - [BsonElement("version_integrated_services")] - public string? IntegrationServicesVersionState { get; set; } + [BsonElement("version_integrated_services")] + public string? IntegrationServicesVersionState { get; set; } - [BsonElement("processid")] - public uint? ProcessId { get; set; } + [BsonElement("processid")] + public uint? ProcessId { get; set; } - [BsonElement("processor_count")] - public uint? NumberOfProcessors { get; set; } + [BsonElement("processor_count")] + public uint? NumberOfProcessors { get; set; } - [BsonElement("processor_load")] - public uint? ProcessorLoad { get; set; } + [BsonElement("processor_load")] + public uint? ProcessorLoad { get; set; } - [BsonElement("memory_available")] - public int? MemoryAvailable { get; set; } + [BsonElement("memory_available")] + public int? MemoryAvailable { get; set; } - [BsonElement("memory_usage")] - public ulong? MemoryUsage { get; set; } + [BsonElement("memory_usage")] + public ulong? MemoryUsage { get; set; } - [BsonElement("installdate")] - public DateTime? InstallDate { get; set; } + [BsonElement("installdate")] + public DateTime? InstallDate { get; set; } - [BsonElement("configuration_changed")] - public DateTime? TimeOfLastConfigurationChange { get; set; } + [BsonElement("configuration_changed")] + public DateTime? TimeOfLastConfigurationChange { get; set; } - [BsonElement("state_changed")] - public DateTime? TimeOfLastStateChange { get; set; } + [BsonElement("state_changed")] + public DateTime? TimeOfLastStateChange { get; set; } - [BsonElement("replication_last")] - public DateTime? LastReplicationTime { get; set; } + [BsonElement("replication_last")] + public DateTime? LastReplicationTime { get; set; } - [BsonElement("guest_os")] - public string? Os { get; set; } + [BsonElement("guest_os")] + public string? Os { get; set; } - [BsonIgnoreIfNull, JsonIgnore] - public List? Configs { get; set; } - } + [BsonIgnoreIfNull, JsonIgnore] + public List? Configs { get; set; } +} - [BsonIgnoreExtraElements] - public class HostHypervisorVirtualMaschineConfigEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[BsonIgnoreExtraElements] +public class HostHypervisorVirtualMaschineConfigEntity +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("virtualmaschine"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("virtualmaschine")] - public string? VirtualMaschine { get; set; } + [BsonElement("virtualmaschine"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("virtualmaschine")] + public string? VirtualMaschine { get; set; } - [BsonElement("batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("uniqueid")] - public string? UniqueId { get; set; } + [BsonElement("uniqueid")] + public string? UniqueId { get; set; } - [BsonElement("parentid")] - public string? ParentId { get; set; } + [BsonElement("parentid")] + public string? ParentId { get; set; } - [BsonElement("type")] - public string? Type { get; set; } + [BsonElement("type")] + public string? Type { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("notes")] - public string? Notes { get; set; } + [BsonElement("notes")] + public string? Notes { get; set; } - [BsonElement("creationtime")] - public DateTime? CreationTime { get; set; } + [BsonElement("creationtime")] + public DateTime? CreationTime { get; set; } - [BsonElement("generation")] - public string? Generation { get; set; } + [BsonElement("generation")] + public string? Generation { get; set; } - [BsonElement("architecture")] - public string? Architecture { get; set; } + [BsonElement("architecture")] + public string? Architecture { get; set; } - [BsonElement("secureboot")] - public bool? SecureBootEnabled { get; set; } + [BsonElement("secureboot")] + public bool? SecureBootEnabled { get; set; } - [BsonElement("automatic_snapshot")] - public bool? IsAutomaticSnapshot { get; set; } + [BsonElement("automatic_snapshot")] + public bool? IsAutomaticSnapshot { get; set; } - [BsonElement("action_start")] - public string? AutomaticStartupAction { get; set; } + [BsonElement("action_start")] + public string? AutomaticStartupAction { get; set; } - [BsonElement("action_shutdown")] - public string? AutomaticShutdownAction { get; set; } + [BsonElement("action_shutdown")] + public string? AutomaticShutdownAction { get; set; } - [BsonElement("action_recovery")] - public string? AutomaticRecoveryAction { get; set; } + [BsonElement("action_recovery")] + public string? AutomaticRecoveryAction { get; set; } - [BsonElement("auto_snapshots")] - public bool? AutomaticSnapshotsEnabled { get; set; } + [BsonElement("auto_snapshots")] + public bool? AutomaticSnapshotsEnabled { get; set; } - [BsonElement("serial_mainboard")] - public string? BaseBoardSerialNumber { get; set; } + [BsonElement("serial_mainboard")] + public string? BaseBoardSerialNumber { get; set; } - [BsonElement("serial_bios")] - public string? BIOSSerialNumber { get; set; } + [BsonElement("serial_bios")] + public string? BIOSSerialNumber { get; set; } - [BsonElement("bios_guid")] - public string? BIOSGUID { get; set; } + [BsonElement("bios_guid")] + public string? BIOSGUID { get; set; } - [BsonElement("data_root")] - public string? ConfigurationDataRoot { get; set; } + [BsonElement("data_root")] + public string? ConfigurationDataRoot { get; set; } - [BsonElement("file")] - public string? ConfigurationFile { get; set; } + [BsonElement("file")] + public string? ConfigurationFile { get; set; } - [BsonElement("guest_data_root")] - public string? GuestStateDataRoot { get; set; } + [BsonElement("guest_data_root")] + public string? GuestStateDataRoot { get; set; } - [BsonElement("guest_state_file")] - public string? GuestStateFile { get; set; } + [BsonElement("guest_state_file")] + public string? GuestStateFile { get; set; } - [BsonElement("snapshot_data_root")] - public string? SnapshotDataRoot { get; set; } + [BsonElement("snapshot_data_root")] + public string? SnapshotDataRoot { get; set; } - [BsonElement("suspend_data_root")] - public string? SuspendDataRoot { get; set; } + [BsonElement("suspend_data_root")] + public string? SuspendDataRoot { get; set; } - [BsonElement("swap_data_root")] - public string? SwapFileDataRoot { get; set; } - } + [BsonElement("swap_data_root")] + public string? SwapFileDataRoot { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostInterface.cs b/src/Core/Insight.Infrastructure/Entities/HostInterface.cs index 2b18c18..4761f12 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostInterface.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostInterface.cs @@ -2,217 +2,216 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostInterfaceEntity { - [BsonIgnoreExtraElements] - public class HostInterfaceEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("index")] - public uint? Index { get; set; } + [BsonElement("index")] + public uint? Index { get; set; } - [BsonElement("mac")] - public string? Mac { get; set; } + [BsonElement("mac")] + public string? Mac { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("description")] - public string? Description { get; set; } + [BsonElement("description")] + public string? Description { get; set; } - [BsonElement("physical")] - public bool? Physical { get; set; } + [BsonElement("physical")] + public bool? Physical { get; set; } - [BsonElement("status")] - public string? Status { get; set; } + [BsonElement("status")] + public string? Status { get; set; } - [BsonElement("suffix")] - public string? Suffix { get; set; } + [BsonElement("suffix")] + public string? Suffix { get; set; } - [BsonElement("speed")] - public long? Speed { get; set; } + [BsonElement("speed")] + public long? Speed { get; set; } - [BsonElement("ipv4_mtu")] - public long? Ipv4Mtu { get; set; } + [BsonElement("ipv4_mtu")] + public long? Ipv4Mtu { get; set; } - [BsonElement("ipv4_dhcp")] - public bool? Ipv4Dhcp { get; set; } + [BsonElement("ipv4_dhcp")] + public bool? Ipv4Dhcp { get; set; } - [BsonElement("ipv4_forwarding")] - public bool? Ipv4Forwarding { get; set; } + [BsonElement("ipv4_forwarding")] + public bool? Ipv4Forwarding { get; set; } - [BsonElement("ipv6_mtu")] - public long? Ipv6Mtu { get; set; } + [BsonElement("ipv6_mtu")] + public long? Ipv6Mtu { get; set; } - [BsonElement("sent")] - public long? Sent { get; set; } + [BsonElement("sent")] + public long? Sent { get; set; } - [BsonElement("received")] - public long? Received { get; set; } + [BsonElement("received")] + public long? Received { get; set; } - [BsonElement("packets_incoming_discarded")] - public long? IncomingPacketsDiscarded { get; set; } + [BsonElement("packets_incoming_discarded")] + public long? IncomingPacketsDiscarded { get; set; } - [BsonElement("packets_incoming_errors")] - public long? IncomingPacketsWithErrors { get; set; } + [BsonElement("packets_incoming_errors")] + public long? IncomingPacketsWithErrors { get; set; } - [BsonElement("packets_incoming_unknown")] - public long? IncomingUnknownProtocolPackets { get; set; } + [BsonElement("packets_incoming_unknown")] + public long? IncomingUnknownProtocolPackets { get; set; } - [BsonElement("packets_outgoing_discarded")] - public long? OutgoingPacketsDiscarded { get; set; } + [BsonElement("packets_outgoing_discarded")] + public long? OutgoingPacketsDiscarded { get; set; } - [BsonElement("packets_outgoing_errors")] - public long? OutgoingPacketsWithErrors { get; set; } - } + [BsonElement("packets_outgoing_errors")] + public long? OutgoingPacketsWithErrors { get; set; } +} - [BsonIgnoreExtraElements] - public class HostInterfaceAddressEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[BsonIgnoreExtraElements] +public class HostInterfaceAddressEntity +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_interface"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("interface")] - public string? Interface { get; set; } + [BsonElement("_interface"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("interface")] + public string? Interface { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("address")] - public string? Address { get; set; } + [BsonElement("address")] + public string? Address { get; set; } - [BsonElement("mask")] - public string? Mask { get; set; } + [BsonElement("mask")] + public string? Mask { get; set; } - //public string? State { get; set; } - //public long? PreferredLifetime { get; set; } - //public long? ValidLifetime { get; set; } - //public long? LeaseLifetime { get; set; } - //public int? PrefixLength { get; set; } + //public string? State { get; set; } + //public long? PreferredLifetime { get; set; } + //public long? ValidLifetime { get; set; } + //public long? LeaseLifetime { get; set; } + //public int? PrefixLength { get; set; } - [BsonIgnoreIfNull, JsonIgnore] - public List? Interfaces { get; set; } - } + [BsonIgnoreIfNull, JsonIgnore] + public List? Interfaces { get; set; } +} - [BsonIgnoreExtraElements] - public class HostInterfaceGatewayEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[BsonIgnoreExtraElements] +public class HostInterfaceGatewayEntity +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_interface"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("interface")] - public string? Interface { get; set; } + [BsonElement("_interface"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("interface")] + public string? Interface { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("address")] - public string? Address { get; set; } + [BsonElement("address")] + public string? Address { get; set; } - [BsonElement("mask")] - public string? Mask { get; set; } + [BsonElement("mask")] + public string? Mask { get; set; } - [BsonIgnoreIfNull, JsonIgnore] - public List? Interfaces { get; set; } - } + [BsonIgnoreIfNull, JsonIgnore] + public List? Interfaces { get; set; } +} - [BsonIgnoreExtraElements] - public class HostInterfaceNameserverEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[BsonIgnoreExtraElements] +public class HostInterfaceNameserverEntity +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_interface"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("interface")] - public string? Interface { get; set; } + [BsonElement("_interface"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("interface")] + public string? Interface { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("address")] - public string? Address { get; set; } + [BsonElement("address")] + public string? Address { get; set; } - [BsonElement("mask")] - public string? Mask { get; set; } + [BsonElement("mask")] + public string? Mask { get; set; } - [BsonIgnoreIfNull, JsonIgnore] - public List? Interfaces { get; set; } - } + [BsonIgnoreIfNull, JsonIgnore] + public List? Interfaces { get; set; } +} - [BsonIgnoreExtraElements] - public class HostInterfaceRouteEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[BsonIgnoreExtraElements] +public class HostInterfaceRouteEntity +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_interface"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("interface")] - public string? Interface { get; set; } + [BsonElement("_interface"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("interface")] + public string? Interface { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("destination")] - public string? Destination { get; set; } + [BsonElement("destination")] + public string? Destination { get; set; } - [BsonElement("mask")] - public string? Mask { get; set; } + [BsonElement("mask")] + public string? Mask { get; set; } - [BsonElement("gateway")] - public string? Gateway { get; set; } + [BsonElement("gateway")] + public string? Gateway { get; set; } - [BsonElement("metric")] - public int? Metric { get; set; } + [BsonElement("metric")] + public int? Metric { get; set; } - [BsonIgnoreIfNull, JsonIgnore] - public List? Interfaces { get; set; } - } + [BsonIgnoreIfNull, JsonIgnore] + public List? Interfaces { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostLog.cs b/src/Core/Insight.Infrastructure/Entities/HostLog.cs index c6d4ae4..da1e86a 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostLog.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostLog.cs @@ -2,36 +2,35 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostLogEntity { - [BsonIgnoreExtraElements] - public class HostLogEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("eventid")] - public string? EventId { get; set; } + [BsonElement("eventid")] + public string? EventId { get; set; } - [BsonElement("status")] - public string? Status { get; set; } + [BsonElement("status")] + public string? Status { get; set; } - [BsonElement("source")] - public string? Source { get; set; } + [BsonElement("source")] + public string? Source { get; set; } - [BsonElement("category")] - public string? Category { get; set; } + [BsonElement("category")] + public string? Category { get; set; } - [BsonElement("message")] - public string? Message { get; set; } + [BsonElement("message")] + public string? Message { get; set; } - [BsonElement("timestamp")] - public DateTime? Timestamp { get; set; } - } + [BsonElement("timestamp")] + public DateTime? Timestamp { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostLogMonitoring.cs b/src/Core/Insight.Infrastructure/Entities/HostLogMonitoring.cs index 67bf429..6b8a14f 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostLogMonitoring.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostLogMonitoring.cs @@ -2,42 +2,41 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostLogMonitoringEntity { - [BsonIgnoreExtraElements] - public class HostLogMonitoringEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("hostname")] - public string? Hostname { get; set; } + [BsonElement("hostname")] + public string? Hostname { get; set; } - [BsonElement("category")] - public string? Category { get; set; } + [BsonElement("category")] + public string? Category { get; set; } - [BsonElement("status")] - public string? Status { get; set; } + [BsonElement("status")] + public string? Status { get; set; } - [BsonElement("task")] - public string? Task { get; set; } + [BsonElement("task")] + public string? Task { get; set; } - [BsonElement("message")] - public string? Message { get; set; } + [BsonElement("message")] + public string? Message { get; set; } - [BsonElement("dispatch")] - public string? Dispatch { get; set; } + [BsonElement("dispatch")] + public string? Dispatch { get; set; } - [BsonElement("timestamp")] - public DateTime? Timestamp { get; set; } - } + [BsonElement("timestamp")] + public DateTime? Timestamp { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostMainboard.cs b/src/Core/Insight.Infrastructure/Entities/HostMainboard.cs index f4fd655..4cd6d1a 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostMainboard.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostMainboard.cs @@ -2,39 +2,38 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostMainboardEntity { - [BsonIgnoreExtraElements] - public class HostMainboardEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("company")] - public string? Company { get; set; } + [BsonElement("company")] + public string? Company { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("serial")] - public string? Serial { get; set; } + [BsonElement("serial")] + public string? Serial { get; set; } - [BsonElement("bios")] - public string? Bios { get; set; } + [BsonElement("bios")] + public string? Bios { get; set; } - [BsonElement("version")] - public string? Version { get; set; } + [BsonElement("version")] + public string? Version { get; set; } - [BsonElement("Date")] - public DateTime? Date { get; set; } - } + [BsonElement("Date")] + public DateTime? Date { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostMemory.cs b/src/Core/Insight.Infrastructure/Entities/HostMemory.cs index 1442941..8b65ca6 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostMemory.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostMemory.cs @@ -2,57 +2,56 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostMemoryEntity { - [BsonIgnoreExtraElements] - public class HostMemoryEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("index")] - public uint? Index { get; set; } + [BsonElement("index")] + public uint? Index { get; set; } - [BsonElement("company")] - public string? Company { get; set; } + [BsonElement("company")] + public string? Company { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("tag")] - public string? Tag { get; set; } + [BsonElement("tag")] + public string? Tag { get; set; } - [BsonElement("location")] - public string? Location { get; set; } + [BsonElement("location")] + public string? Location { get; set; } - [BsonElement("serial")] - public string? Serial { get; set; } + [BsonElement("serial")] + public string? Serial { get; set; } - [BsonElement("capacity")] - public ulong? Capacity { get; set; } + [BsonElement("capacity")] + public ulong? Capacity { get; set; } - [BsonElement("clock")] - public uint? Clock { get; set; } + [BsonElement("clock")] + public uint? Clock { get; set; } - [BsonElement("clock_current")] - public uint? CurrentClock { get; set; } + [BsonElement("clock_current")] + public uint? CurrentClock { get; set; } - [BsonElement("voltage")] - public uint? Voltage { get; set; } + [BsonElement("voltage")] + public uint? Voltage { get; set; } - [BsonElement("voltage_current")] - public uint? CurrentVoltage { get; set; } - } + [BsonElement("voltage_current")] + public uint? CurrentVoltage { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostOs.cs b/src/Core/Insight.Infrastructure/Entities/HostOs.cs index b0e0d8f..2e37f3b 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostOs.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostOs.cs @@ -2,39 +2,38 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostOsEntity { - [BsonIgnoreExtraElements] - public class HostOsEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("version")] - public string? Version { get; set; } + [BsonElement("version")] + public string? Version { get; set; } - [BsonElement("architecture")] - public string? Architecture { get; set; } + [BsonElement("architecture")] + public string? Architecture { get; set; } - [BsonElement("serialnumber")] - public string? SerialNumber { get; set; } + [BsonElement("serialnumber")] + public string? SerialNumber { get; set; } - [BsonElement("virtual")] - public bool? Virtual { get; set; } + [BsonElement("virtual")] + public bool? Virtual { get; set; } - [BsonElement("installed")] - public DateTime? Installed { get; set; } - } + [BsonElement("installed")] + public DateTime? Installed { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostPrinter.cs b/src/Core/Insight.Infrastructure/Entities/HostPrinter.cs index 7131499..e3b1653 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostPrinter.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostPrinter.cs @@ -2,39 +2,38 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostPrinterEntity { - [BsonIgnoreExtraElements] - public class HostPrinterEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("company")] - public string? Company { get; set; } + [BsonElement("company")] + public string? Company { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("port")] - public string? Port { get; set; } + [BsonElement("port")] + public string? Port { get; set; } - [BsonElement("location")] - public string? Location { get; set; } + [BsonElement("location")] + public string? Location { get; set; } - [BsonElement("comment")] - public string? Comment { get; set; } - } + [BsonElement("comment")] + public string? Comment { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostProcessor.cs b/src/Core/Insight.Infrastructure/Entities/HostProcessor.cs index 1a81ceb..8d4a7ea 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostProcessor.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostProcessor.cs @@ -2,69 +2,68 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostProcessorEntity { - [BsonIgnoreExtraElements] - public class HostProcessorEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("index")] - public uint? Index { get; set; } + [BsonElement("index")] + public uint? Index { get; set; } - [BsonElement("company")] - public string? Company { get; set; } + [BsonElement("company")] + public string? Company { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("socket")] - public string? Socket { get; set; } + [BsonElement("socket")] + public string? Socket { get; set; } - [BsonElement("serial")] - public string? Serial { get; set; } + [BsonElement("serial")] + public string? Serial { get; set; } - [BsonElement("version")] - public string? Version { get; set; } + [BsonElement("version")] + public string? Version { get; set; } - [BsonElement("cores")] - public uint? Cores { get; set; } + [BsonElement("cores")] + public uint? Cores { get; set; } - [BsonElement("logicalcores")] - public uint? LogicalCores { get; set; } + [BsonElement("logicalcores")] + public uint? LogicalCores { get; set; } - [BsonElement("clock")] - public uint? Clock { get; set; } + [BsonElement("clock")] + public uint? Clock { get; set; } - [BsonElement("clock_current")] - public uint? CurrentClock { get; set; } + [BsonElement("clock_current")] + public uint? CurrentClock { get; set; } - [BsonElement("l1")] - public uint? L1Size { get; set; } + [BsonElement("l1")] + public uint? L1Size { get; set; } - [BsonElement("l2")] - public uint? L2Size { get; set; } + [BsonElement("l2")] + public uint? L2Size { get; set; } - [BsonElement("l3")] - public uint? L3Size { get; set; } + [BsonElement("l3")] + public uint? L3Size { get; set; } - [BsonElement("virtualization")] - public bool? Virtualization { get; set; } + [BsonElement("virtualization")] + public bool? Virtualization { get; set; } - [BsonElement("pnp")] - public string? PNP { get; set; } - } + [BsonElement("pnp")] + public string? PNP { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostService.cs b/src/Core/Insight.Infrastructure/Entities/HostService.cs index c2e71d7..2167e53 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostService.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostService.cs @@ -2,54 +2,53 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostServiceEntity { - [BsonIgnoreExtraElements] - public class HostServiceEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("company")] - public string? Company { get; set; } + [BsonElement("company")] + public string? Company { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("displayname")] - public string? DisplayName { get; set; } + [BsonElement("displayname")] + public string? DisplayName { get; set; } - [BsonElement("description")] - public string? Description { get; set; } + [BsonElement("description")] + public string? Description { get; set; } - [BsonElement("startmode")] - public string? StartMode { get; set; } + [BsonElement("startmode")] + public string? StartMode { get; set; } - [BsonElement("state")] - public string? State { get; set; } + [BsonElement("state")] + public string? State { get; set; } - [BsonElement("processid")] - public uint? ProcessId { get; set; } + [BsonElement("processid")] + public uint? ProcessId { get; set; } - [BsonElement("delay")] - public bool? Delay { get; set; } + [BsonElement("delay")] + public bool? Delay { get; set; } - [BsonElement("path")] - public string? Path { get; set; } + [BsonElement("path")] + public string? Path { get; set; } - [BsonElement("account")] - public string? Account { get; set; } - } + [BsonElement("account")] + public string? Account { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostSession.cs b/src/Core/Insight.Infrastructure/Entities/HostSession.cs index 7c58585..6992f95 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostSession.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostSession.cs @@ -2,39 +2,38 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostSessionEntity { - [BsonIgnoreExtraElements] - public class HostSessionEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("sid")] - public string? Sid { get; set; } + [BsonElement("sid")] + public string? Sid { get; set; } - [BsonElement("user")] - public string? User { get; set; } + [BsonElement("user")] + public string? User { get; set; } - [BsonElement("remote")] - public string? Remote { get; set; } + [BsonElement("remote")] + public string? Remote { get; set; } - [BsonElement("type")] - public string? Type { get; set; } + [BsonElement("type")] + public string? Type { get; set; } - [BsonElement("state")] - public string? State { get; set; } - } + [BsonElement("state")] + public string? State { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostStoragePool.cs b/src/Core/Insight.Infrastructure/Entities/HostStoragePool.cs index 67dd652..3fc138d 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostStoragePool.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostStoragePool.cs @@ -2,206 +2,205 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostStoragePoolEntity { - [BsonIgnoreExtraElements] - public class HostStoragePoolEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("uniqueid")] - public string? UniqueId { get; set; } + [BsonElement("uniqueid")] + public string? UniqueId { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("health")] - public string? Health { get; set; } + [BsonElement("health")] + public string? Health { get; set; } - [BsonElement("resiliency")] - public string? Resiliency { get; set; } + [BsonElement("resiliency")] + public string? Resiliency { get; set; } - [BsonElement("primordial")] - public bool? Primordial { get; set; } + [BsonElement("primordial")] + public bool? Primordial { get; set; } - [BsonElement("readonly")] - public bool? ReadOnly { get; set; } + [BsonElement("readonly")] + public bool? ReadOnly { get; set; } - [BsonElement("clustered")] - public bool? Clustered { get; set; } + [BsonElement("clustered")] + public bool? Clustered { get; set; } - [BsonElement("size")] - public ulong? Size { get; set; } + [BsonElement("size")] + public ulong? Size { get; set; } - [BsonElement("size_allocated")] - public ulong? AllocatedSize { get; set; } + [BsonElement("size_allocated")] + public ulong? AllocatedSize { get; set; } - [BsonElement("sectorsize")] - public ulong? SectorSize { get; set; } + [BsonElement("sectorsize")] + public ulong? SectorSize { get; set; } - [BsonElement("states")] - public List? States { get; set; } + [BsonElement("states")] + public List? States { get; set; } - [BsonIgnoreIfNull, JsonIgnore] - public List? PhysicalDisks { get; set; } + [BsonIgnoreIfNull, JsonIgnore] + public List? PhysicalDisks { get; set; } - [BsonIgnoreIfNull, JsonIgnore] - public List? VirtualDisks { get; set; } - } + [BsonIgnoreIfNull, JsonIgnore] + public List? VirtualDisks { get; set; } +} - [BsonIgnoreExtraElements] - public class HostStoragePoolVirtualDiskEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[BsonIgnoreExtraElements] +public class HostStoragePoolVirtualDiskEntity +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_storagepool"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("storagepool")] - public string? StoragePool { get; set; } + [BsonElement("_storagepool"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("storagepool")] + public string? StoragePool { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("uniqueid")] - public string? UniqueId { get; set; } + [BsonElement("uniqueid")] + public string? UniqueId { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("health")] - public string? Health { get; set; } + [BsonElement("health")] + public string? Health { get; set; } - [BsonElement("access")] - public string? Access { get; set; } + [BsonElement("access")] + public string? Access { get; set; } - [BsonElement("provisioning")] - public string? Provisioning { get; set; } + [BsonElement("provisioning")] + public string? Provisioning { get; set; } - [BsonElement("redundancy")] - public uint? PhysicalRedundancy { get; set; } + [BsonElement("redundancy")] + public uint? PhysicalRedundancy { get; set; } - [BsonElement("resiliency")] - public string? Resiliency { get; set; } + [BsonElement("resiliency")] + public string? Resiliency { get; set; } - [BsonElement("deduplication")] - public bool? Deduplication { get; set; } + [BsonElement("deduplication")] + public bool? Deduplication { get; set; } - [BsonElement("snapshot")] - public bool? Snapshot { get; set; } + [BsonElement("snapshot")] + public bool? Snapshot { get; set; } - [BsonElement("size")] - public ulong? Size { get; set; } + [BsonElement("size")] + public ulong? Size { get; set; } - [BsonElement("size_allocated")] - public ulong? AllocatedSize { get; set; } + [BsonElement("size_allocated")] + public ulong? AllocatedSize { get; set; } - [BsonElement("footprint")] - public ulong? Footprint { get; set; } + [BsonElement("footprint")] + public ulong? Footprint { get; set; } - [BsonElement("cache_read_size")] - public ulong? ReadCacheSize { get; set; } + [BsonElement("cache_read_size")] + public ulong? ReadCacheSize { get; set; } - [BsonElement("cache_write_size")] - public ulong? WriteCacheSize { get; set; } + [BsonElement("cache_write_size")] + public ulong? WriteCacheSize { get; set; } - [BsonElement("states")] - public List? States { get; set; } - } + [BsonElement("states")] + public List? States { get; set; } +} - [BsonIgnoreExtraElements] - public class HostStoragePoolPhysicalDiskEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[BsonIgnoreExtraElements] +public class HostStoragePoolPhysicalDiskEntity +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_storagepool"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("storagepool")] - public string? StoragePool { get; set; } + [BsonElement("_storagepool"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("storagepool")] + public string? StoragePool { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("uniqueid")] - public string? UniqueId { get; set; } + [BsonElement("uniqueid")] + public string? UniqueId { get; set; } - [BsonElement("deviceid")] - public string? DeviceId { get; set; } + [BsonElement("deviceid")] + public string? DeviceId { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("manufacturer")] - public string? Manufacturer { get; set; } + [BsonElement("manufacturer")] + public string? Manufacturer { get; set; } - [BsonElement("Model")] - public string? Model { get; set; } + [BsonElement("Model")] + public string? Model { get; set; } - [BsonElement("media")] - public string? Media { get; set; } + [BsonElement("media")] + public string? Media { get; set; } - [BsonElement("bus")] - public string? Bus { get; set; } + [BsonElement("bus")] + public string? Bus { get; set; } - [BsonElement("health")] - public string? Health { get; set; } + [BsonElement("health")] + public string? Health { get; set; } - [BsonElement("usage")] - public ushort? Usage { get; set; } + [BsonElement("usage")] + public ushort? Usage { get; set; } - [BsonElement("location")] - public string? Location { get; set; } + [BsonElement("location")] + public string? Location { get; set; } - [BsonElement("serial")] - public string? Serial { get; set; } + [BsonElement("serial")] + public string? Serial { get; set; } - [BsonElement("firmware")] - public string? Firmware { get; set; } + [BsonElement("firmware")] + public string? Firmware { get; set; } - [BsonElement("size")] - public ulong? Size { get; set; } + [BsonElement("size")] + public ulong? Size { get; set; } - [BsonElement("size_allocated")] - public ulong? AllocatedSize { get; set; } + [BsonElement("size_allocated")] + public ulong? AllocatedSize { get; set; } - [BsonElement("footprint")] - public ulong? Footprint { get; set; } + [BsonElement("footprint")] + public ulong? Footprint { get; set; } - [BsonElement("sector_size_physical")] - public ulong? PhysicalSectorSize { get; set; } + [BsonElement("sector_size_physical")] + public ulong? PhysicalSectorSize { get; set; } - [BsonElement("sector_size_logical")] - public ulong? LogicalSectorSize { get; set; } + [BsonElement("sector_size_logical")] + public ulong? LogicalSectorSize { get; set; } - [BsonElement("states")] - public List? States { get; set; } - } + [BsonElement("states")] + public List? States { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostSystem.cs b/src/Core/Insight.Infrastructure/Entities/HostSystem.cs index 7cea81e..f6a1e0d 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostSystem.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostSystem.cs @@ -2,33 +2,32 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostSystemEntity { - [BsonIgnoreExtraElements] - public class HostSystemEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("localtime")] - public DateTime? LocalTime { get; set; } + [BsonElement("localtime")] + public DateTime? LocalTime { get; set; } - [BsonElement("bootuptime")] - public DateTime? BootUpTime { get; set; } + [BsonElement("bootuptime")] + public DateTime? BootUpTime { get; set; } - [BsonElement("processes")] - public uint? Processes { get; set; } + [BsonElement("processes")] + public uint? Processes { get; set; } - [BsonElement("license")] - public string? License { get; set; } - } + [BsonElement("license")] + public string? License { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostUpdate.cs b/src/Core/Insight.Infrastructure/Entities/HostUpdate.cs index 2e2e545..4b7b243 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostUpdate.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostUpdate.cs @@ -2,60 +2,59 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostUpdateEntity { - [BsonIgnoreExtraElements] - public class HostUpdateEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("serial")] - public string? Serial { get; set; } // os update id + [BsonElement("serial")] + public string? Serial { get; set; } // os update id - [BsonElement("description")] - public string? Description { get; set; } + [BsonElement("description")] + public string? Description { get; set; } - [BsonElement("supporturl")] - public string? SupportUrl { get; set; } + [BsonElement("supporturl")] + public string? SupportUrl { get; set; } - [BsonElement("date")] - public DateTime? Date { get; set; } + [BsonElement("date")] + public DateTime? Date { get; set; } - [BsonElement("pending")] - public bool? Pending { get; set; } + [BsonElement("pending")] + public bool? Pending { get; set; } - [BsonElement("result"), BsonIgnoreIfNull] // installed only - public string? Result { get; set; } + [BsonElement("result"), BsonIgnoreIfNull] // installed only + public string? Result { get; set; } - [BsonElement("type"), BsonIgnoreIfNull] // pending only - public string? Type { get; set; } + [BsonElement("type"), BsonIgnoreIfNull] // pending only + public string? Type { get; set; } - [BsonElement("size"), BsonIgnoreIfNull] // pending only - public decimal? Size { get; set; } + [BsonElement("size"), BsonIgnoreIfNull] // pending only + public decimal? Size { get; set; } - [BsonElement("downloaded"), BsonIgnoreIfNull] // pending only - public bool? IsDownloaded { get; set; } + [BsonElement("downloaded"), BsonIgnoreIfNull] // pending only + public bool? IsDownloaded { get; set; } - [BsonElement("inputrequest"), BsonIgnoreIfNull] // pending only - public bool? CanRequestUserInput { get; set; } + [BsonElement("inputrequest"), BsonIgnoreIfNull] // pending only + public bool? CanRequestUserInput { get; set; } - [BsonElement("reboot"), BsonIgnoreIfNull] // pending only - public string? RebootBehavior { get; set; } - } + [BsonElement("reboot"), BsonIgnoreIfNull] // pending only + public string? RebootBehavior { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostUser.cs b/src/Core/Insight.Infrastructure/Entities/HostUser.cs index 7ef4201..95670f8 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostUser.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostUser.cs @@ -2,119 +2,118 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostUserEntity { - [BsonIgnoreExtraElements] - public class HostUserEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("sid")] - public string? Sid { get; set; } + [BsonElement("sid")] + public string? Sid { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("domain")] - public string? Domain { get; set; } + [BsonElement("domain")] + public string? Domain { get; set; } - [BsonElement("fullname")] - public string? FullName { get; set; } + [BsonElement("fullname")] + public string? FullName { get; set; } - [BsonElement("description")] - public string? Description { get; set; } + [BsonElement("description")] + public string? Description { get; set; } - [BsonElement("status")] - public string? Status { get; set; } + [BsonElement("status")] + public string? Status { get; set; } - [BsonElement("localaccount")] - public bool? LocalAccount { get; set; } + [BsonElement("localaccount")] + public bool? LocalAccount { get; set; } - [BsonElement("disabled")] - public bool? Disabled { get; set; } + [BsonElement("disabled")] + public bool? Disabled { get; set; } - [BsonElement("lockout")] - public bool? Lockout { get; set; } + [BsonElement("lockout")] + public bool? Lockout { get; set; } - [BsonElement("password_changeable")] - public bool? PasswordChangeable { get; set; } + [BsonElement("password_changeable")] + public bool? PasswordChangeable { get; set; } - [BsonElement("password_expires")] - public bool? PasswordExpires { get; set; } + [BsonElement("password_expires")] + public bool? PasswordExpires { get; set; } - [BsonElement("password_required")] - public bool? PasswordRequired { get; set; } - } + [BsonElement("password_required")] + public bool? PasswordRequired { get; set; } +} - [BsonIgnoreExtraElements] - public class HostGroupEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[BsonIgnoreExtraElements] +public class HostGroupEntity +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("sid")] - public string? Sid { get; set; } + [BsonElement("sid")] + public string? Sid { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("domain")] - public string? Domain { get; set; } + [BsonElement("domain")] + public string? Domain { get; set; } - [BsonElement("description")] - public string? Description { get; set; } + [BsonElement("description")] + public string? Description { get; set; } - [BsonElement("localaccount")] - public bool? LocalAccount { get; set; } - } + [BsonElement("localaccount")] + public bool? LocalAccount { get; set; } +} - [BsonIgnoreExtraElements] - public class HostUserGroupEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[BsonIgnoreExtraElements] +public class HostUserGroupEntity +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_user"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("user")] - public string? User { get; set; } + [BsonElement("_user"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("user")] + public string? User { get; set; } - [BsonElement("_group"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("group")] - public string? Group { get; set; } + [BsonElement("_group"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("group")] + public string? Group { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } - } + [BsonElement("update")] + public DateTime? Update { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostVideocard.cs b/src/Core/Insight.Infrastructure/Entities/HostVideocard.cs index a2552a9..da9fb62 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostVideocard.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostVideocard.cs @@ -2,39 +2,38 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostVideocardEntity { - [BsonIgnoreExtraElements] - public class HostVideocardEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("company")] - public string? Company { get; set; } + [BsonElement("company")] + public string? Company { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("memory")] - public ulong? Memory { get; set; } + [BsonElement("memory")] + public ulong? Memory { get; set; } - [BsonElement("driver")] - public string? Driver { get; set; } + [BsonElement("driver")] + public string? Driver { get; set; } - [BsonElement("date")] - public DateTime? Date { get; set; } - } + [BsonElement("date")] + public DateTime? Date { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/HostVolume.cs b/src/Core/Insight.Infrastructure/Entities/HostVolume.cs index 00c19df..21f5dfb 100644 --- a/src/Core/Insight.Infrastructure/Entities/HostVolume.cs +++ b/src/Core/Insight.Infrastructure/Entities/HostVolume.cs @@ -2,75 +2,74 @@ using MongoDB.Bson.Serialization.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[BsonIgnoreExtraElements] +public class HostVolumeEntity { - [BsonIgnoreExtraElements] - public class HostVolumeEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] - public string? Host { get; set; } + [BsonElement("_host"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("host")] + public string? Host { get; set; } - [BsonElement("_drive"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("drive")] - public string? Drive { get; set; } + [BsonElement("_drive"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("drive")] + public string? Drive { get; set; } - [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] - public string? Batch { get; set; } + [BsonElement("_batch"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("batch")] + public string? Batch { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } - [BsonElement("index")] - public uint? Index { get; set; } + [BsonElement("index")] + public uint? Index { get; set; } - [BsonElement("label")] - public string? Label { get; set; } + [BsonElement("label")] + public string? Label { get; set; } - [BsonElement("name")] - public string? Name { get; set; } + [BsonElement("name")] + public string? Name { get; set; } - [BsonElement("serial")] - public string? Serial { get; set; } + [BsonElement("serial")] + public string? Serial { get; set; } - [BsonElement("size")] - public ulong? Size { get; set; } + [BsonElement("size")] + public ulong? Size { get; set; } - [BsonElement("freespace")] - public ulong? FreeSpace { get; set; } + [BsonElement("freespace")] + public ulong? FreeSpace { get; set; } - [BsonElement("type")] - public string? Type { get; set; } + [BsonElement("type")] + public string? Type { get; set; } - [BsonElement("filesystem")] - public string? FileSystem { get; set; } + [BsonElement("filesystem")] + public string? FileSystem { get; set; } - [BsonElement("compressed")] - public bool? Compressed { get; set; } + [BsonElement("compressed")] + public bool? Compressed { get; set; } - [BsonElement("bootable")] - public bool? Bootable { get; set; } + [BsonElement("bootable")] + public bool? Bootable { get; set; } - [BsonElement("primary")] - public bool? Primary { get; set; } + [BsonElement("primary")] + public bool? Primary { get; set; } - [BsonElement("boot")] - public bool? Boot { get; set; } + [BsonElement("boot")] + public bool? Boot { get; set; } - [BsonElement("blocksize")] - public ulong? BlockSize { get; set; } + [BsonElement("blocksize")] + public ulong? BlockSize { get; set; } - [BsonElement("blocks")] - public ulong? Blocks { get; set; } + [BsonElement("blocks")] + public ulong? Blocks { get; set; } - [BsonElement("startoffset")] - public ulong? StartingOffset { get; set; } + [BsonElement("startoffset")] + public ulong? StartingOffset { get; set; } - [BsonElement("provider")] - public string? Provider { get; set; } - } + [BsonElement("provider")] + public string? Provider { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Entities/Identity.cs b/src/Core/Insight.Infrastructure/Entities/Identity.cs index 9827a9b..732a69d 100644 --- a/src/Core/Insight.Infrastructure/Entities/Identity.cs +++ b/src/Core/Insight.Infrastructure/Entities/Identity.cs @@ -4,96 +4,92 @@ using MongoDB.Bson.Serialization.Attributes; using MongoDbGenericRepository.Attributes; using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Entities +namespace Insight.Infrastructure.Entities; + +[CollectionName("user"), BsonIgnoreExtraElements] +public class InsightUser : MongoIdentityUser { - [CollectionName("user"), BsonIgnoreExtraElements] - public class InsightUser : MongoIdentityUser - { - public InsightUser() : base() { } + public InsightUser() : base() { } - public InsightUser(string userName, string email) : base(userName, email) { } + public InsightUser(string userName, string email) : base(userName, email) { } - [JsonPropertyName("refresh_tokens")] - public List? RefreshTokens { get; set; } - } + [JsonPropertyName("refresh_tokens")] + public List? RefreshTokens { get; set; } +} - [BsonIgnoreExtraElements] - public class InsightUserLogEntity - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[BsonIgnoreExtraElements] +public class InsightUserLogEntity +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_user"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("user")] - public string? User { get; set; } + [BsonElement("_user"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("user")] + public string? User { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("timestamp")] - public DateTime? Timestamp { get; set; } + [BsonElement("timestamp")] + public DateTime? Timestamp { get; set; } - [BsonElement("message")] - public string? Message { get; set; } - } + [BsonElement("message")] + public string? Message { get; set; } +} - [CollectionName("user_pref"), BsonIgnoreExtraElements] - public class InsightUserPreferences - { - [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] - public string? Id { get; set; } +[CollectionName("user_pref"), BsonIgnoreExtraElements] +public class InsightUserPreferences +{ + [BsonId, BsonRepresentation(BsonType.ObjectId), JsonPropertyName("id")] + public string? Id { get; set; } - [BsonElement("_user"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("user")] - public string? User { get; set; } + [BsonElement("_user"), BsonRepresentation(BsonType.ObjectId), JsonPropertyName("user")] + public string? User { get; set; } - [BsonElement("insert")] - public DateTime? Insert { get; set; } + [BsonElement("insert")] + public DateTime? Insert { get; set; } - [BsonElement("update")] - public DateTime? Update { get; set; } + [BsonElement("update")] + public DateTime? Update { get; set; } + [BsonElement("darkmode")] + public bool DarkMode { get; set; } +} - [BsonElement("darkmode")] - public bool DarkMode { get; set; } - } +[CollectionName("role")] +public class InsightRole : MongoIdentityRole +{ - [CollectionName("role")] - public class InsightRole : MongoIdentityRole - { - public InsightRole() : base() { } +} - public InsightRole(string roleName) : base(roleName) { } - } +[BsonIgnoreExtraElements] +public class RefreshToken +{ + [BsonElement("token")] + public string? Token { get; set; } - [BsonIgnoreExtraElements] - public class RefreshToken - { - [BsonElement("token")] - public string? Token { get; set; } + [BsonElement("created")] + public DateTime Created { get; set; } - [BsonElement("created")] - public DateTime Created { get; set; } + [BsonElement("created_ip")] + public string? CreatedByIp { get; set; } - [BsonElement("created_ip")] - public string? CreatedByIp { get; set; } + [BsonElement("expires")] + public DateTime Expires { get; set; } - [BsonElement("expires")] - public DateTime Expires { get; set; } + [BsonElement("revoked")] + public DateTime? Revoked { get; set; } - [BsonElement("revoked")] - public DateTime? Revoked { get; set; } + [BsonElement("revoked_ip")] + public string? RevokedByIp { get; set; } - [BsonElement("revoked_ip")] - public string? RevokedByIp { get; set; } + [BsonElement("revoked_reason")] + public string? ReasonRevoked { get; set; } - [BsonElement("revoked_reason")] - public string? ReasonRevoked { get; set; } + [BsonIgnore, JsonIgnore] + public bool IsExpired => DateTime.Now >= Expires.ToLocalTime(); - [BsonIgnore, JsonIgnore] - public bool IsExpired => DateTime.Now >= Expires.ToLocalTime(); + [BsonIgnore, JsonIgnore] + public bool IsRevoked => Revoked != null; - [BsonIgnore, JsonIgnore] - public bool IsRevoked => Revoked != null; - - [BsonIgnore, JsonIgnore] - public bool IsActive => !IsRevoked && !IsExpired; - } + [BsonIgnore, JsonIgnore] + public bool IsActive => !IsRevoked && !IsExpired; } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Extensions/HttpRequestExtensions.cs b/src/Core/Insight.Infrastructure/Extensions/HttpRequestExtensions.cs index 27d0cb9..7d6ca72 100644 --- a/src/Core/Insight.Infrastructure/Extensions/HttpRequestExtensions.cs +++ b/src/Core/Insight.Infrastructure/Extensions/HttpRequestExtensions.cs @@ -2,46 +2,45 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Extensions; -namespace Insight.Infrastructure +namespace Insight.Infrastructure; + +public static class HttpRequestExtensions { - public static class HttpRequestExtensions + public static void AddPagination(this HttpRequest request, PagedList pagelist) { - public static void AddPagination(this HttpRequest request, PagedList pagelist) + var builder = new QueryBuilder(); + + foreach (var item in request.Query.Where(p => p.Key.ToLower() != "limit" || p.Key.ToLower() != "offset")) { - var builder = new QueryBuilder(); + builder.Add(item.Key.ToLower(), item.Value.ToString()); + } - foreach (var item in request.Query.Where(p => p.Key.ToLower() != "limit" || p.Key.ToLower() != "offset")) + builder.Add("limit", pagelist.Meta.Limit.ToString()); + + if (pagelist.Meta.Offset > 0) + { + var qb = new QueryBuilder(builder); + + if (pagelist.Meta.Offset > pagelist.Meta.Limit) { - builder.Add(item.Key.ToLower(), item.Value.ToString()); + qb.Add("offset", (pagelist.Meta.Offset - pagelist.Meta.Limit).ToString()); + } + else + { + qb.Add("offset", 0.ToString()); } - builder.Add("limit", pagelist.Meta.Limit.ToString()); + pagelist.Meta.Previous = $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}{qb}"; + } - if (pagelist.Meta.Offset > 0) + if ((pagelist.Meta.Offset + pagelist.Meta.Count) < pagelist.Meta.Total) + { + var qb = new QueryBuilder(builder) { - var qb = new QueryBuilder(builder); + { "offset", (pagelist.Meta.Offset + pagelist.Meta.Count).ToString() } + }; - if (pagelist.Meta.Offset > pagelist.Meta.Limit) - { - qb.Add("offset", (pagelist.Meta.Offset - pagelist.Meta.Limit).ToString()); - } - else - { - qb.Add("offset", 0.ToString()); - } - - pagelist.Meta.Previous = $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}{qb}"; - } - - if ((pagelist.Meta.Offset + pagelist.Meta.Count) < pagelist.Meta.Total) - { - var qb = new QueryBuilder(builder) - { - { "offset", (pagelist.Meta.Offset + pagelist.Meta.Count).ToString() } - }; - - pagelist.Meta.Next = $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}{qb}"; - } + pagelist.Meta.Next = $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}{qb}"; } } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Extensions/HttpResponseExtensions.cs b/src/Core/Insight.Infrastructure/Extensions/HttpResponseExtensions.cs index 6bb788d..cf4d828 100644 --- a/src/Core/Insight.Infrastructure/Extensions/HttpResponseExtensions.cs +++ b/src/Core/Insight.Infrastructure/Extensions/HttpResponseExtensions.cs @@ -2,16 +2,15 @@ using Microsoft.AspNetCore.Http; using System.Text.Json; -namespace Insight.Infrastructure +namespace Insight.Infrastructure; + +public static class HttpResponseExtensions { - public static class HttpResponseExtensions + public static void AddPagination(this HttpResponse response, PagedList pagelist) { - public static void AddPagination(this HttpResponse response, PagedList pagelist) + response.Headers.Add("X-Pagination", JsonSerializer.Serialize(pagelist.Meta as PagedHeaderData, new JsonSerializerOptions { - response.Headers.Add("X-Pagination", JsonSerializer.Serialize(pagelist.Meta as PagedHeaderData, new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.CamelCase - })); - } + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + })); } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Extensions/MongoCollectionExtensions.cs b/src/Core/Insight.Infrastructure/Extensions/MongoCollectionExtensions.cs index bc18ab8..3fa382b 100644 --- a/src/Core/Insight.Infrastructure/Extensions/MongoCollectionExtensions.cs +++ b/src/Core/Insight.Infrastructure/Extensions/MongoCollectionExtensions.cs @@ -4,80 +4,79 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver; -namespace Insight.Infrastructure +namespace Insight.Infrastructure; + +public static class MongoCollectionExtensions { - public static class MongoCollectionExtensions + private const int _maximumLimit = 100; + + public static async Task> GetPagedAsync( + this IMongoCollection collection, + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) { - private const int _maximumLimit = 100; + if (limit > _maximumLimit) throw new InvalidOperationException("invalid limit value > 100"); - public static async Task> GetPagedAsync( - this IMongoCollection collection, - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) - { - if (limit > _maximumLimit) throw new InvalidOperationException("invalid limit value > 100"); + var query = collection.Find(filter ?? Builders.Filter.Empty); - var query = collection.Find(filter ?? Builders.Filter.Empty); + if (sort is not null) query = query.Sort(sort); - if (sort is not null) query = query.Sort(sort); + var data = await query.Skip(offset).Limit(limit).ToListAsync(cancellationToken).ConfigureAwait(false); + var total = await collection.EstimatedDocumentCountAsync(null, cancellationToken).ConfigureAwait(false); - var data = await query.Skip(offset).Limit(limit).ToListAsync(cancellationToken).ConfigureAwait(false); - var total = await collection.EstimatedDocumentCountAsync(null, cancellationToken).ConfigureAwait(false); + return new PagedList(data, offset, limit, total); + } - return new PagedList(data, offset, limit, total); - } + public static async Task> GetPagedAsync( + this IMongoCollection collection, + HttpRequest request, + HttpResponse response, + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) + { + var result = await GetPagedAsync(collection, filter, sort, offset, limit, cancellationToken).ConfigureAwait(false); - public static async Task> GetPagedAsync( - this IMongoCollection collection, - HttpRequest request, - HttpResponse response, - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) - { - var result = await GetPagedAsync(collection, filter, sort, offset, limit, cancellationToken).ConfigureAwait(false); + request?.AddPagination(result); + response?.AddPagination(result); - request?.AddPagination(result); - response?.AddPagination(result); + return result; + } - return result; - } + public static async Task> GetPagedAsync( + this IMongoCollection collection, + IAggregateFluent query, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) + { + if (limit > _maximumLimit) throw new InvalidOperationException("invalid limit value"); - public static async Task> GetPagedAsync( - this IMongoCollection collection, - IAggregateFluent query, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) - { - if (limit > _maximumLimit) throw new InvalidOperationException("invalid limit value"); + var data = await query.Skip(offset).Limit(limit).ToListAsync(cancellationToken).ConfigureAwait(false); + var total = await collection.EstimatedDocumentCountAsync(null, cancellationToken).ConfigureAwait(false); - var data = await query.Skip(offset).Limit(limit).ToListAsync(cancellationToken).ConfigureAwait(false); - var total = await collection.EstimatedDocumentCountAsync(null, cancellationToken).ConfigureAwait(false); + return new PagedList(data.Select(x => BsonSerializer.Deserialize(x)), offset, limit, total); + } - return new PagedList(data.Select(x => BsonSerializer.Deserialize(x)), offset, limit, total); - } + public static async Task> GetPagedAsync( + this IMongoCollection collection, + HttpRequest request, + HttpResponse response, + IAggregateFluent query, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) + { + var result = await GetPagedAsync(collection, query, offset, limit, cancellationToken).ConfigureAwait(false); - public static async Task> GetPagedAsync( - this IMongoCollection collection, - HttpRequest request, - HttpResponse response, - IAggregateFluent query, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) - { - var result = await GetPagedAsync(collection, query, offset, limit, cancellationToken).ConfigureAwait(false); + request?.AddPagination(result); + response?.AddPagination(result); - request?.AddPagination(result); - response?.AddPagination(result); - - return result; - } + return result; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Extensions/MongoDatabaseExtensions.cs b/src/Core/Insight.Infrastructure/Extensions/MongoDatabaseExtensions.cs index 3769e1d..3a76e9b 100644 --- a/src/Core/Insight.Infrastructure/Extensions/MongoDatabaseExtensions.cs +++ b/src/Core/Insight.Infrastructure/Extensions/MongoDatabaseExtensions.cs @@ -1,57 +1,56 @@ using Insight.Infrastructure.Entities; using MongoDB.Driver; -namespace Insight.Infrastructure +namespace Insight.Infrastructure; + +public static class MongoDatabaseExtensions { - public static class MongoDatabaseExtensions - { - // internal users (roles), groups... - public static IMongoCollection User(this IMongoDatabase database) => database.GetCollection("user"); - public static IMongoCollection UserLog(this IMongoDatabase database) => database.GetCollection("user_log"); - public static IMongoCollection UserPreference(this IMongoDatabase database) => database.GetCollection("user_pref"); - public static IMongoCollection Role(this IMongoDatabase database) => database.GetCollection("role"); + // internal users (roles), groups... + public static IMongoCollection User(this IMongoDatabase database) => database.GetCollection("user"); + public static IMongoCollection UserLog(this IMongoDatabase database) => database.GetCollection("user_log"); + public static IMongoCollection UserPreference(this IMongoDatabase database) => database.GetCollection("user_pref"); + public static IMongoCollection Role(this IMongoDatabase database) => database.GetCollection("role"); - // customers - public static IMongoCollection Customer(this IMongoDatabase database) => database.GetCollection("customer"); + // customers + public static IMongoCollection Customer(this IMongoDatabase database) => database.GetCollection("customer"); - // agents - public static IMongoCollection Agent(this IMongoDatabase database) => database.GetCollection("agent"); - public static IMongoCollection AgentLog(this IMongoDatabase database) => database.GetCollection("agent_log"); + // agents + public static IMongoCollection Agent(this IMongoDatabase database) => database.GetCollection("agent"); + public static IMongoCollection AgentLog(this IMongoDatabase database) => database.GetCollection("agent_log"); - // host groups - public static IMongoCollection HostGroup(this IMongoDatabase database) => database.GetCollection("host"); + // host groups + public static IMongoCollection HostGroup(this IMongoDatabase database) => database.GetCollection("host"); - // hosts - public static IMongoCollection Host(this IMongoDatabase database) => database.GetCollection("host"); - public static IMongoCollection HostLog(this IMongoDatabase database) => database.GetCollection("host_log"); + // hosts + public static IMongoCollection Host(this IMongoDatabase database) => database.GetCollection("host"); + public static IMongoCollection HostLog(this IMongoDatabase database) => database.GetCollection("host_log"); - // hosts extensions - public static IMongoCollection HostLogMonitoring(this IMongoDatabase database) => database.GetCollection("host_log_mon"); - public static IMongoCollection HostApplication(this IMongoDatabase database) => database.GetCollection("host_app"); - public static IMongoCollection HostDrive(this IMongoDatabase database) => database.GetCollection("host_drv"); - public static IMongoCollection HostVolume(this IMongoDatabase database) => database.GetCollection("host_vol"); - public static IMongoCollection HostOs(this IMongoDatabase database) => database.GetCollection("host_os"); - public static IMongoCollection HostUpdate(this IMongoDatabase database) => database.GetCollection("host_upd"); - public static IMongoCollection HostSession(this IMongoDatabase database) => database.GetCollection("host_session"); - public static IMongoCollection HostService(this IMongoDatabase database) => database.GetCollection("host_svc"); - public static IMongoCollection HostPrinter(this IMongoDatabase database) => database.GetCollection("host_prn"); - public static IMongoCollection HostMainboard(this IMongoDatabase database) => database.GetCollection("host_board"); - public static IMongoCollection HostProcessor(this IMongoDatabase database) => database.GetCollection("host_cpu"); - public static IMongoCollection HostMemory(this IMongoDatabase database) => database.GetCollection("host_mem"); - public static IMongoCollection HostVideocard(this IMongoDatabase database) => database.GetCollection("host_gpu"); - public static IMongoCollection HostSystemUser(this IMongoDatabase database) => database.GetCollection("host_sysusr"); - public static IMongoCollection HostSystemGroup(this IMongoDatabase database) => database.GetCollection("host_sysgrp"); - public static IMongoCollection HostSystemUserSystemGroup(this IMongoDatabase database) => database.GetCollection("host_sysusr_sysgrp"); - public static IMongoCollection HostSystem(this IMongoDatabase database) => database.GetCollection("host_sys"); - public static IMongoCollection HostStoragePool(this IMongoDatabase database) => database.GetCollection("host_sp"); - public static IMongoCollection HostStoragePoolPhysicalDisk(this IMongoDatabase database) => database.GetCollection("host_sp.pd"); - public static IMongoCollection HostStoragePoolVirtualDisk(this IMongoDatabase database) => database.GetCollection("host_sp.vd"); - public static IMongoCollection HostHypervisorVirtualMaschine(this IMongoDatabase database) => database.GetCollection("host_hv_vm"); - public static IMongoCollection HostVirtualMaschineConfig(this IMongoDatabase database) => database.GetCollection("host_hv_vm_cfg"); - public static IMongoCollection HostInterface(this IMongoDatabase database) => database.GetCollection("host_if"); - public static IMongoCollection HostInterfaceAddress(this IMongoDatabase database) => database.GetCollection("host_if_addr"); - public static IMongoCollection HostInterfaceGateway(this IMongoDatabase database) => database.GetCollection("host_if_gw"); - public static IMongoCollection HostInterfaceNameserver(this IMongoDatabase database) => database.GetCollection("host_if_ns"); - public static IMongoCollection HostInterfaceRoute(this IMongoDatabase database) => database.GetCollection("host_if_rt"); - } + // hosts extensions + public static IMongoCollection HostLogMonitoring(this IMongoDatabase database) => database.GetCollection("host_log_mon"); + public static IMongoCollection HostApplication(this IMongoDatabase database) => database.GetCollection("host_app"); + public static IMongoCollection HostDrive(this IMongoDatabase database) => database.GetCollection("host_drv"); + public static IMongoCollection HostVolume(this IMongoDatabase database) => database.GetCollection("host_vol"); + public static IMongoCollection HostOs(this IMongoDatabase database) => database.GetCollection("host_os"); + public static IMongoCollection HostUpdate(this IMongoDatabase database) => database.GetCollection("host_upd"); + public static IMongoCollection HostSession(this IMongoDatabase database) => database.GetCollection("host_session"); + public static IMongoCollection HostService(this IMongoDatabase database) => database.GetCollection("host_svc"); + public static IMongoCollection HostPrinter(this IMongoDatabase database) => database.GetCollection("host_prn"); + public static IMongoCollection HostMainboard(this IMongoDatabase database) => database.GetCollection("host_board"); + public static IMongoCollection HostProcessor(this IMongoDatabase database) => database.GetCollection("host_cpu"); + public static IMongoCollection HostMemory(this IMongoDatabase database) => database.GetCollection("host_mem"); + public static IMongoCollection HostVideocard(this IMongoDatabase database) => database.GetCollection("host_gpu"); + public static IMongoCollection HostSystemUser(this IMongoDatabase database) => database.GetCollection("host_sysusr"); + public static IMongoCollection HostSystemGroup(this IMongoDatabase database) => database.GetCollection("host_sysgrp"); + public static IMongoCollection HostSystemUserSystemGroup(this IMongoDatabase database) => database.GetCollection("host_sysusr_sysgrp"); + public static IMongoCollection HostSystem(this IMongoDatabase database) => database.GetCollection("host_sys"); + public static IMongoCollection HostStoragePool(this IMongoDatabase database) => database.GetCollection("host_sp"); + public static IMongoCollection HostStoragePoolPhysicalDisk(this IMongoDatabase database) => database.GetCollection("host_sp.pd"); + public static IMongoCollection HostStoragePoolVirtualDisk(this IMongoDatabase database) => database.GetCollection("host_sp.vd"); + public static IMongoCollection HostHypervisorVirtualMaschine(this IMongoDatabase database) => database.GetCollection("host_hv_vm"); + public static IMongoCollection HostVirtualMaschineConfig(this IMongoDatabase database) => database.GetCollection("host_hv_vm_cfg"); + public static IMongoCollection HostInterface(this IMongoDatabase database) => database.GetCollection("host_if"); + public static IMongoCollection HostInterfaceAddress(this IMongoDatabase database) => database.GetCollection("host_if_addr"); + public static IMongoCollection HostInterfaceGateway(this IMongoDatabase database) => database.GetCollection("host_if_gw"); + public static IMongoCollection HostInterfaceNameserver(this IMongoDatabase database) => database.GetCollection("host_if_ns"); + public static IMongoCollection HostInterfaceRoute(this IMongoDatabase database) => database.GetCollection("host_if_rt"); } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Extensions/ServiceExtensions.cs b/src/Core/Insight.Infrastructure/Extensions/ServiceExtensions.cs index e8e49d6..f46cf99 100644 --- a/src/Core/Insight.Infrastructure/Extensions/ServiceExtensions.cs +++ b/src/Core/Insight.Infrastructure/Extensions/ServiceExtensions.cs @@ -16,248 +16,247 @@ using MongoDB.Driver; using MongoDB.Driver.Core.Configuration; using System.Text; -namespace Insight.Infrastructure +namespace Insight.Infrastructure; + +public static class ServiceExtensions { - public static class ServiceExtensions + public static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration, ILoggerFactory? loggerFactory = null) { - public static IServiceCollection AddDatabase(this IServiceCollection services, IConfiguration configuration, ILoggerFactory? loggerFactory = null) + var connectionString = configuration.GetValue(Appsettings.Database) ?? throw new Exception($"{Appsettings.Database} value not set (appsettings)"); + + var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString)); + settings.ConnectTimeout = TimeSpan.FromSeconds(3); + settings.IPv6 = false; + + if (loggerFactory is not null) { - var connectionString = configuration.GetValue(Appsettings.Database) ?? throw new Exception($"{Appsettings.Database} value not set (appsettings)"); - - var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString)); - settings.ConnectTimeout = TimeSpan.FromSeconds(3); - settings.IPv6 = false; - - if (loggerFactory is not null) - { - settings.LoggingSettings = new LoggingSettings(loggerFactory); - } - - services.AddSingleton(new MongoClient(settings)); - services.AddSingleton(provider => provider.GetRequiredService()); - return services.AddSingleton(provider => provider.GetRequiredService().GetDatabase(Settings.Database)); + settings.LoggingSettings = new LoggingSettings(loggerFactory); } - public static IServiceCollection AddInfrastructureServices(this IServiceCollection services) + services.AddSingleton(new MongoClient(settings)); + services.AddSingleton(provider => provider.GetRequiredService()); + return services.AddSingleton(provider => provider.GetRequiredService().GetDatabase(Settings.Database)); + } + + public static IServiceCollection AddInfrastructureServices(this IServiceCollection services) + { + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + return services; + } + + public static IServiceCollection AddIdentityServices(this IServiceCollection services, IConfiguration configuration) + { + var connectionString = configuration.GetValue(Appsettings.Database) ?? throw new Exception($"{Appsettings.Database} value not set (appsettings)"); + + services.AddIdentity(options => { - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - return services; - } - public static IServiceCollection AddIdentityServices(this IServiceCollection services, IConfiguration configuration) + }) + .AddMongoDbStores(connectionString, Settings.Database) + .AddDefaultTokenProviders() + .AddSignInManager(); + + return services; + } + + public static IServiceCollection AddTokenServices(this IServiceCollection services, IConfiguration configuration) + { + var options = new Models.TokenOptions( + key: configuration.GetValue(Appsettings.JwtKey) ?? throw new Exception($"{Appsettings.JwtKey} value not set (appsettings)"), + expires: configuration.GetValue(Appsettings.JwtExp) ?? throw new Exception($"{Appsettings.JwtExp} value not set (appsettings)"), + audience: configuration.GetValue(Appsettings.JwtAudience) ?? throw new Exception($"{Appsettings.JwtAudience} value not set (appsettings)"), + issuer: configuration.GetValue(Appsettings.JwtIssuer) ?? throw new Exception($"{Appsettings.JwtIssuer} value not set (appsettings)")); + + services.AddSingleton(options); + services.AddTransient(); + + return services; + } + + public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration) + { + // REWRITE TO COOKIE ONLY FOR WEB + + services.AddAuthentication(options => { - var connectionString = configuration.GetValue(Appsettings.Database) ?? throw new Exception($"{Appsettings.Database} value not set (appsettings)"); - - services.AddIdentity(options => - { - - }) - .AddMongoDbStores(connectionString, Settings.Database) - .AddDefaultTokenProviders() - .AddSignInManager(); - - return services; - } - - public static IServiceCollection AddTokenServices(this IServiceCollection services, IConfiguration configuration) + options.DefaultScheme = "Custom"; + options.DefaultChallengeScheme = "Custom"; + }) + .AddCookie("Cookies", options => { - var options = new Models.TokenOptions( - key: configuration.GetValue(Appsettings.JwtKey) ?? throw new Exception($"{Appsettings.JwtKey} value not set (appsettings)"), - expires: configuration.GetValue(Appsettings.JwtExp) ?? throw new Exception($"{Appsettings.JwtExp} value not set (appsettings)"), - audience: configuration.GetValue(Appsettings.JwtAudience) ?? throw new Exception($"{Appsettings.JwtAudience} value not set (appsettings)"), - issuer: configuration.GetValue(Appsettings.JwtIssuer) ?? throw new Exception($"{Appsettings.JwtIssuer} value not set (appsettings)")); + //options.Cookie.Domain = "insight.webmatic.de"; + options.Cookie.Name = "insight"; + options.LoginPath = "/account/login"; + options.LogoutPath = "/account/logout"; + options.ExpireTimeSpan = TimeSpan.FromHours(1); + options.SlidingExpiration = true; - services.AddSingleton(options); - services.AddTransient(); - - return services; - } - - public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration) - { - // REWRITE TO COOKIE ONLY FOR WEB - - services.AddAuthentication(options => + options.Events.OnRedirectToLogin = options => { - options.DefaultScheme = "Custom"; - options.DefaultChallengeScheme = "Custom"; - }) - .AddCookie("Cookies", options => - { - //options.Cookie.Domain = "insight.webmatic.de"; - options.Cookie.Name = "insight"; - options.LoginPath = "/account/login"; - options.LogoutPath = "/account/logout"; - options.ExpireTimeSpan = TimeSpan.FromHours(1); - options.SlidingExpiration = true; + if (options.Request.Path.StartsWithSegments("/api") && options.Response.StatusCode == 200) + options.Response.StatusCode = 401; + else + options.Response.Redirect(options.RedirectUri); - options.Events.OnRedirectToLogin = options => - { - if (options.Request.Path.StartsWithSegments("/api") && options.Response.StatusCode == 200) - options.Response.StatusCode = 401; - else - options.Response.Redirect(options.RedirectUri); - - return Task.CompletedTask; - }; - }) - .AddJwtBearer("Bearer", options => - { - options.RequireHttpsMetadata = false; - options.SaveToken = true; - - options.TokenValidationParameters.ValidateActor = false; - - options.TokenValidationParameters.ValidAudience = configuration.GetSection("Jwt:Audience").Value; - options.TokenValidationParameters.ValidateAudience = true; - - options.TokenValidationParameters.ValidIssuer = configuration.GetSection("Jwt:Issuer").Value; - options.TokenValidationParameters.ValidateIssuer = true; - - options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey( - Encoding.UTF8.GetBytes(configuration.GetSection("Jwt:Key").Value ?? throw new ArgumentNullException(nameof(TokenValidationParameters), "Jwt:Key")) - ); - - options.TokenValidationParameters.ValidateIssuerSigningKey = true; - options.TokenValidationParameters.ValidateLifetime = true; - }) - .AddPolicyScheme("Custom", "Custom", options => - { - options.ForwardDefaultSelector = context => - { - string authorization = context.Request.Headers[HeaderNames.Authorization]; - - if (!string.IsNullOrEmpty(authorization) && authorization.StartsWith("Bearer ")) return "Bearer"; - - return "Cookies"; - }; - }); - - return services; - } - - public static IServiceCollection AddBearerAuthentication(this IServiceCollection services, IConfiguration configuration) - { - services.AddAuthentication(options => - { - options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme; - }) - .AddJwtBearer(options => - { - options.RequireHttpsMetadata = false; - options.SaveToken = true; - - options.TokenValidationParameters.ValidateActor = false; - - options.TokenValidationParameters.ValidAudience = configuration.GetValue(Appsettings.JwtAudience) ?? throw new Exception($"{Appsettings.JwtAudience} value not set (appsettings)"); - options.TokenValidationParameters.ValidateAudience = true; - - options.TokenValidationParameters.ValidIssuer = configuration.GetValue(Appsettings.JwtIssuer) ?? throw new Exception($"{Appsettings.JwtIssuer} value not set (appsettings)"); - options.TokenValidationParameters.ValidateIssuer = true; - - options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey( - Encoding.UTF8.GetBytes(configuration.GetValue(Appsettings.JwtKey) ?? throw new Exception($"{Appsettings.JwtKey} value not set (appsettings)")) - ); - - options.TokenValidationParameters.ValidateIssuerSigningKey = true; - options.TokenValidationParameters.ValidateLifetime = true; - }); - - return services; - } - - public static IServiceCollection AddProxyServices(this IServiceCollection services, IConfiguration configuration) - { - // add before routing - services.Configure(options => - { - options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; - }); - - return services; - } - - public static IServiceCollection AddRoutingServices(this IServiceCollection services, IConfiguration configuration) - { - // add after proxy - services.AddRouting(options => - { - options.LowercaseUrls = true; - }); - - return services; - } - - private static IServiceCollection AddIdentityServices2(this IServiceCollection services, IConfiguration configuration) - { - var identityOptions = new MongoDbIdentityConfiguration - { - MongoDbSettings = new MongoDbSettings - { - ConnectionString = configuration.GetSection("ConnectionStrings:Mongo").Value, - DatabaseName = "insight" - }, - IdentityOptionsAction = options => - { - options.User.RequireUniqueEmail = true; - options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@.-_"; - - options.Password.RequireDigit = false; - options.Password.RequiredLength = 8; - options.Password.RequireNonAlphanumeric = false; - options.Password.RequireUppercase = false; - options.Password.RequireLowercase = false; - - options.SignIn.RequireConfirmedAccount = false; - options.SignIn.RequireConfirmedEmail = false; - options.SignIn.RequireConfirmedPhoneNumber = false; - - options.Lockout.MaxFailedAccessAttempts = 5; - options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); - } + return Task.CompletedTask; }; - - services.ConfigureMongoDbIdentity(identityOptions) - .AddDefaultTokenProviders() - .AddSignInManager(); - - return services; - } - - private static IServiceCollection AddIdentityAuthentication(this IServiceCollection services, IConfiguration configuration) + }) + .AddJwtBearer("Bearer", options => { - services.AddAuthentication(options => + options.RequireHttpsMetadata = false; + options.SaveToken = true; + + options.TokenValidationParameters.ValidateActor = false; + + options.TokenValidationParameters.ValidAudience = configuration.GetSection("Jwt:Audience").Value; + options.TokenValidationParameters.ValidateAudience = true; + + options.TokenValidationParameters.ValidIssuer = configuration.GetSection("Jwt:Issuer").Value; + options.TokenValidationParameters.ValidateIssuer = true; + + options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey( + Encoding.UTF8.GetBytes(configuration.GetSection("Jwt:Key").Value ?? throw new ArgumentNullException(nameof(TokenValidationParameters), "Jwt:Key")) + ); + + options.TokenValidationParameters.ValidateIssuerSigningKey = true; + options.TokenValidationParameters.ValidateLifetime = true; + }) + .AddPolicyScheme("Custom", "Custom", options => + { + options.ForwardDefaultSelector = context => { - //options.DefaultAuthenticateScheme = - }); - //cookieBuilder.ApplicationCookie = builder.AddApplicationCookie(); - //cookieBuilder.ExternalCookie = builder.AddExternalCookie(); - //cookieBuilder.TwoFactorRememberMeCookie = builder.AddTwoFactorRememberMeCookie(); - //cookieBuilder.TwoFactorUserIdCookie = builder.AddTwoFactorUserIdCookie(); - //.AddCookie(options => - //{ - // options. - //}; - //.AddIdentityCookies(); - //.AddCookie(options => - //{ - // // Specify where to redirect un-authenticated users - // options.LoginPath = "/account/login"; + string authorization = context.Request.Headers[HeaderNames.Authorization]; - // // Specify the name of the auth cookie. - // // ASP.NET picks a dumb name by default. - // options.Cookie.Name = "insight"; - //}); + if (!string.IsNullOrEmpty(authorization) && authorization.StartsWith("Bearer ")) return "Bearer"; - return services; - } + return "Cookies"; + }; + }); + + return services; + } + + public static IServiceCollection AddBearerAuthentication(this IServiceCollection services, IConfiguration configuration) + { + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme; + }) + .AddJwtBearer(options => + { + options.RequireHttpsMetadata = false; + options.SaveToken = true; + + options.TokenValidationParameters.ValidateActor = false; + + options.TokenValidationParameters.ValidAudience = configuration.GetValue(Appsettings.JwtAudience) ?? throw new Exception($"{Appsettings.JwtAudience} value not set (appsettings)"); + options.TokenValidationParameters.ValidateAudience = true; + + options.TokenValidationParameters.ValidIssuer = configuration.GetValue(Appsettings.JwtIssuer) ?? throw new Exception($"{Appsettings.JwtIssuer} value not set (appsettings)"); + options.TokenValidationParameters.ValidateIssuer = true; + + options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey( + Encoding.UTF8.GetBytes(configuration.GetValue(Appsettings.JwtKey) ?? throw new Exception($"{Appsettings.JwtKey} value not set (appsettings)")) + ); + + options.TokenValidationParameters.ValidateIssuerSigningKey = true; + options.TokenValidationParameters.ValidateLifetime = true; + }); + + return services; + } + + public static IServiceCollection AddProxyServices(this IServiceCollection services, IConfiguration configuration) + { + // add before routing + services.Configure(options => + { + options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + }); + + return services; + } + + public static IServiceCollection AddRoutingServices(this IServiceCollection services, IConfiguration configuration) + { + // add after proxy + services.AddRouting(options => + { + options.LowercaseUrls = true; + }); + + return services; + } + + private static IServiceCollection AddIdentityServices2(this IServiceCollection services, IConfiguration configuration) + { + var identityOptions = new MongoDbIdentityConfiguration + { + MongoDbSettings = new MongoDbSettings + { + ConnectionString = configuration.GetSection("ConnectionStrings:Mongo").Value, + DatabaseName = "insight" + }, + IdentityOptionsAction = options => + { + options.User.RequireUniqueEmail = true; + options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@.-_"; + + options.Password.RequireDigit = false; + options.Password.RequiredLength = 8; + options.Password.RequireNonAlphanumeric = false; + options.Password.RequireUppercase = false; + options.Password.RequireLowercase = false; + + options.SignIn.RequireConfirmedAccount = false; + options.SignIn.RequireConfirmedEmail = false; + options.SignIn.RequireConfirmedPhoneNumber = false; + + options.Lockout.MaxFailedAccessAttempts = 5; + options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); + } + }; + + services.ConfigureMongoDbIdentity(identityOptions) + .AddDefaultTokenProviders() + .AddSignInManager(); + + return services; + } + + private static IServiceCollection AddIdentityAuthentication(this IServiceCollection services, IConfiguration configuration) + { + services.AddAuthentication(options => + { + //options.DefaultAuthenticateScheme = + }); + //cookieBuilder.ApplicationCookie = builder.AddApplicationCookie(); + //cookieBuilder.ExternalCookie = builder.AddExternalCookie(); + //cookieBuilder.TwoFactorRememberMeCookie = builder.AddTwoFactorRememberMeCookie(); + //cookieBuilder.TwoFactorUserIdCookie = builder.AddTwoFactorUserIdCookie(); + //.AddCookie(options => + //{ + // options. + //}; + //.AddIdentityCookies(); + //.AddCookie(options => + //{ + // // Specify where to redirect un-authenticated users + // options.LoginPath = "/account/login"; + + // // Specify the name of the auth cookie. + // // ASP.NET picks a dumb name by default. + // options.Cookie.Name = "insight"; + //}); + + return services; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Models/Pagination.cs b/src/Core/Insight.Infrastructure/Models/Pagination.cs index 1ddc63a..ea27d93 100644 --- a/src/Core/Insight.Infrastructure/Models/Pagination.cs +++ b/src/Core/Insight.Infrastructure/Models/Pagination.cs @@ -1,49 +1,48 @@ using System.Text.Json.Serialization; -namespace Insight.Infrastructure.Models +namespace Insight.Infrastructure.Models; + +public class PagedList { - public class PagedList - { - public PagedMetaData Meta { get; } = new(); - public IEnumerable Data { get; } + public PagedMetaData Meta { get; } = new(); + public IEnumerable Data { get; } - public PagedList(IEnumerable data, int offset, int limit, long total) + public PagedList(IEnumerable data, int offset, int limit, long total) + { + Data = data; + Meta = new() { - Data = data; - Meta = new() - { - Offset = offset, - Limit = limit, - Count = data?.Count() ?? 0, - Total = total, - }; - } + Offset = offset, + Limit = limit, + Count = data?.Count() ?? 0, + Total = total, + }; } +} - public class PagedDataRequest - { - [JsonPropertyName("offset")] - public int Offset { get; set; } = 0; +public class PagedDataRequest +{ + [JsonPropertyName("offset")] + public int Offset { get; set; } = 0; - [JsonPropertyName("limit")] - public int Limit { get; set; } = 10; - } + [JsonPropertyName("limit")] + public int Limit { get; set; } = 10; +} - public class PagedHeaderData : PagedDataRequest - { - [JsonPropertyName("count")] - public int Count { get; set; } = 0; +public class PagedHeaderData : PagedDataRequest +{ + [JsonPropertyName("count")] + public int Count { get; set; } = 0; - [JsonPropertyName("total")] - public long Total { get; set; } = 0; - } + [JsonPropertyName("total")] + public long Total { get; set; } = 0; +} - public class PagedMetaData : PagedHeaderData - { - [JsonPropertyName("next")] - public string? Next { get; set; } +public class PagedMetaData : PagedHeaderData +{ + [JsonPropertyName("next")] + public string? Next { get; set; } - [JsonPropertyName("previous")] - public string? Previous { get; set; } - } + [JsonPropertyName("previous")] + public string? Previous { get; set; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Models/TokenOptions.cs b/src/Core/Insight.Infrastructure/Models/TokenOptions.cs index d993465..fb4f6c7 100644 --- a/src/Core/Insight.Infrastructure/Models/TokenOptions.cs +++ b/src/Core/Insight.Infrastructure/Models/TokenOptions.cs @@ -1,18 +1,17 @@ -namespace Insight.Infrastructure.Models -{ - public class TokenOptions - { - public string Key { get; set; } - public int Expires { get; set; } - public Uri? Audience { get; set; } - public Uri? Issuer { get; set; } +namespace Insight.Infrastructure.Models; - public TokenOptions(string key, int expires, Uri? audience = null, Uri? issuer = null) - { - Key = key; - Expires = expires; - Audience = audience; - Issuer = issuer; - } +public class TokenOptions +{ + public string Key { get; set; } + public int Expires { get; set; } + public Uri? Audience { get; set; } + public Uri? Issuer { get; set; } + + public TokenOptions(string key, int expires, Uri? audience = null, Uri? issuer = null) + { + Key = key; + Expires = expires; + Audience = audience; + Issuer = issuer; } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Services/AccountService.cs b/src/Core/Insight.Infrastructure/Services/AccountService.cs index ece4505..e70a503 100644 --- a/src/Core/Insight.Infrastructure/Services/AccountService.cs +++ b/src/Core/Insight.Infrastructure/Services/AccountService.cs @@ -4,33 +4,32 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace Insight.Infrastructure.Services +namespace Insight.Infrastructure.Services; + +public class AccountService { - public class AccountService + private readonly IMongoDatabase _database; + private readonly ILogger _logger; + + public AccountService(IMongoDatabase database, ILogger logger) { - private readonly IMongoDatabase _database; - private readonly ILogger _logger; - - public AccountService(IMongoDatabase database, ILogger logger) - { - _database = database; - _logger = logger; - } - - public Task> GetAsync( - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) => _database.User().GetPagedAsync(filter, sort, offset, limit, cancellationToken); - - public Task> GetAsync( - HttpRequest request, - HttpResponse response, - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) => _database.User().GetPagedAsync(request, response, filter, sort, offset, limit, cancellationToken); + _database = database; + _logger = logger; } + + public Task> GetAsync( + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) => _database.User().GetPagedAsync(filter, sort, offset, limit, cancellationToken); + + public Task> GetAsync( + HttpRequest request, + HttpResponse response, + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) => _database.User().GetPagedAsync(request, response, filter, sort, offset, limit, cancellationToken); } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Services/AgentService.cs b/src/Core/Insight.Infrastructure/Services/AgentService.cs index 580336e..f5704e3 100644 --- a/src/Core/Insight.Infrastructure/Services/AgentService.cs +++ b/src/Core/Insight.Infrastructure/Services/AgentService.cs @@ -4,33 +4,32 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace Insight.Infrastructure.Services +namespace Insight.Infrastructure.Services; + +public class AgentService { - public class AgentService + private readonly IMongoDatabase _database; + private readonly ILogger _logger; + + public AgentService(IMongoDatabase database, ILogger logger) { - private readonly IMongoDatabase _database; - private readonly ILogger _logger; - - public AgentService(IMongoDatabase database, ILogger logger) - { - _database = database; - _logger = logger; - } - - public Task> GetAsync( - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) => _database.Agent().GetPagedAsync(filter, sort, offset, limit, cancellationToken); - - public Task> GetAsync( - HttpRequest request, - HttpResponse response, - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) => _database.Agent().GetPagedAsync(request, response, filter, sort, offset, limit, cancellationToken); + _database = database; + _logger = logger; } + + public Task> GetAsync( + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) => _database.Agent().GetPagedAsync(filter, sort, offset, limit, cancellationToken); + + public Task> GetAsync( + HttpRequest request, + HttpResponse response, + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) => _database.Agent().GetPagedAsync(request, response, filter, sort, offset, limit, cancellationToken); } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Services/AuthenticatorService.cs b/src/Core/Insight.Infrastructure/Services/AuthenticatorService.cs index 65f29df..cd08c32 100644 --- a/src/Core/Insight.Infrastructure/Services/AuthenticatorService.cs +++ b/src/Core/Insight.Infrastructure/Services/AuthenticatorService.cs @@ -5,108 +5,107 @@ using System.Globalization; using System.Text; using System.Text.Encodings.Web; -namespace Insight.Infrastructure.Services +namespace Insight.Infrastructure.Services; + +public class AuthenticatorService { - public class AuthenticatorService + private readonly IMongoDatabase _database; + private readonly UserManager _userManager; + + public AuthenticatorService(IMongoDatabase database, UserManager userManager) { - private readonly IMongoDatabase _database; - private readonly UserManager _userManager; + _database = database; + _userManager = userManager; + } - public AuthenticatorService(IMongoDatabase database, UserManager userManager) + public async Task GetStatusAsync(InsightUser user) + { + return await _userManager.GetTwoFactorEnabledAsync(user).ConfigureAwait(false); + } + + public async Task GetKeyAsync(InsightUser user) + { + return await _userManager.GetAuthenticatorKeyAsync(user).ConfigureAwait(false); + } + + public async Task ResetKeyAsync(InsightUser user) + { + var result = await _userManager.ResetAuthenticatorKeyAsync(user).ConfigureAwait(false); + return result.Succeeded; + } + + public async Task VerifyAsync(InsightUser user, string code) + { + code = code.Replace(" ", string.Empty).Replace("-", string.Empty); + return await _userManager.VerifyTwoFactorTokenAsync(user, _userManager.Options.Tokens.AuthenticatorTokenProvider, code).ConfigureAwait(false); + } + + public async Task EnableAsync(InsightUser user) + { + var result = await _userManager.SetTwoFactorEnabledAsync(user, true).ConfigureAwait(false); + return result.Succeeded; + } + + public async Task DisableAsync(InsightUser user) + { + var result = await _userManager.SetTwoFactorEnabledAsync(user, false).ConfigureAwait(false); + return result.Succeeded; + } + + public async Task DeleteAsync(InsightUser user) + { + var result = await _userManager.SetTwoFactorEnabledAsync(user, false).ConfigureAwait(false); + if (result.Succeeded is false) return false; + + result = await _userManager.RemoveAuthenticationTokenAsync(user, "[AspNetUserStore]", "AuthenticatorKey").ConfigureAwait(false); + if (result.Succeeded is false) return false; + + return true; + } + + public async Task CountRecoveryCodesAsync(InsightUser user) + { + return await _userManager.CountRecoveryCodesAsync(user).ConfigureAwait(false); + } + + public async Task UseRecoveryCodeAsync(InsightUser user, string recoveryCode) + { + var result = await _userManager.RedeemTwoFactorRecoveryCodeAsync(user, recoveryCode).ConfigureAwait(false); + return result.Succeeded; + } + + public async Task?> ResetRecoveryCodesAsync(InsightUser user, int count = 3) + { + return await _userManager.GenerateNewTwoFactorRecoveryCodesAsync(user, count).ConfigureAwait(false); + } + + public string GenerateQrCode(string email, string unformattedKey) + { + var encoder = UrlEncoder.Default; + + return string.Format(CultureInfo.InvariantCulture, + @"otpauth://totp/{0}:{1}?secret={2}&issuer={0}&digits=6", + encoder.Encode("Insight"), + encoder.Encode(email), + unformattedKey); + } + + public static string HumanizeKey(string unformattedKey) + { + var result = new StringBuilder(); + int currentPosition = 0; + + while (currentPosition + 4 < unformattedKey.Length) { - _database = database; - _userManager = userManager; + result.Append(unformattedKey.AsSpan(currentPosition, 4)).Append(' '); + currentPosition += 4; } - public async Task GetStatusAsync(InsightUser user) + if (currentPosition < unformattedKey.Length) { - return await _userManager.GetTwoFactorEnabledAsync(user).ConfigureAwait(false); + result.Append(unformattedKey.AsSpan(currentPosition)); } - public async Task GetKeyAsync(InsightUser user) - { - return await _userManager.GetAuthenticatorKeyAsync(user).ConfigureAwait(false); - } - - public async Task ResetKeyAsync(InsightUser user) - { - var result = await _userManager.ResetAuthenticatorKeyAsync(user).ConfigureAwait(false); - return result.Succeeded; - } - - public async Task VerifyAsync(InsightUser user, string code) - { - code = code.Replace(" ", string.Empty).Replace("-", string.Empty); - return await _userManager.VerifyTwoFactorTokenAsync(user, _userManager.Options.Tokens.AuthenticatorTokenProvider, code).ConfigureAwait(false); - } - - public async Task EnableAsync(InsightUser user) - { - var result = await _userManager.SetTwoFactorEnabledAsync(user, true).ConfigureAwait(false); - return result.Succeeded; - } - - public async Task DisableAsync(InsightUser user) - { - var result = await _userManager.SetTwoFactorEnabledAsync(user, false).ConfigureAwait(false); - return result.Succeeded; - } - - public async Task DeleteAsync(InsightUser user) - { - var result = await _userManager.SetTwoFactorEnabledAsync(user, false).ConfigureAwait(false); - if (result.Succeeded is false) return false; - - result = await _userManager.RemoveAuthenticationTokenAsync(user, "[AspNetUserStore]", "AuthenticatorKey").ConfigureAwait(false); - if (result.Succeeded is false) return false; - - return true; - } - - public async Task CountRecoveryCodesAsync(InsightUser user) - { - return await _userManager.CountRecoveryCodesAsync(user).ConfigureAwait(false); - } - - public async Task UseRecoveryCodeAsync(InsightUser user, string recoveryCode) - { - var result = await _userManager.RedeemTwoFactorRecoveryCodeAsync(user, recoveryCode).ConfigureAwait(false); - return result.Succeeded; - } - - public async Task?> ResetRecoveryCodesAsync(InsightUser user, int count = 3) - { - return await _userManager.GenerateNewTwoFactorRecoveryCodesAsync(user, count).ConfigureAwait(false); - } - - public string GenerateQrCode(string email, string unformattedKey) - { - var encoder = UrlEncoder.Default; - - return string.Format(CultureInfo.InvariantCulture, - @"otpauth://totp/{0}:{1}?secret={2}&issuer={0}&digits=6", - encoder.Encode("Insight"), - encoder.Encode(email), - unformattedKey); - } - - public static string HumanizeKey(string unformattedKey) - { - var result = new StringBuilder(); - int currentPosition = 0; - - while (currentPosition + 4 < unformattedKey.Length) - { - result.Append(unformattedKey.AsSpan(currentPosition, 4)).Append(' '); - currentPosition += 4; - } - - if (currentPosition < unformattedKey.Length) - { - result.Append(unformattedKey.AsSpan(currentPosition)); - } - - return result.ToString().ToLowerInvariant(); - } + return result.ToString().ToLowerInvariant(); } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Services/CustomerService.cs b/src/Core/Insight.Infrastructure/Services/CustomerService.cs index c88c35b..fd22db3 100644 --- a/src/Core/Insight.Infrastructure/Services/CustomerService.cs +++ b/src/Core/Insight.Infrastructure/Services/CustomerService.cs @@ -4,33 +4,32 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace Insight.Infrastructure.Services +namespace Insight.Infrastructure.Services; + +public class CustomerService { - public class CustomerService + private readonly IMongoDatabase _database; + private readonly ILogger _logger; + + public CustomerService(IMongoDatabase database, ILogger logger) { - private readonly IMongoDatabase _database; - private readonly ILogger _logger; - - public CustomerService(IMongoDatabase database, ILogger logger) - { - _database = database; - _logger = logger; - } - - public Task> GetAsync( - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) => _database.Customer().GetPagedAsync(filter, sort, offset, limit, cancellationToken); - - public Task> GetAsync( - HttpRequest request, - HttpResponse response, - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) => _database.Customer().GetPagedAsync(request, response, filter, sort, offset, limit, cancellationToken); + _database = database; + _logger = logger; } + + public Task> GetAsync( + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) => _database.Customer().GetPagedAsync(filter, sort, offset, limit, cancellationToken); + + public Task> GetAsync( + HttpRequest request, + HttpResponse response, + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) => _database.Customer().GetPagedAsync(request, response, filter, sort, offset, limit, cancellationToken); } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Services/HostService.cs b/src/Core/Insight.Infrastructure/Services/HostService.cs index d39cfc9..756e21e 100644 --- a/src/Core/Insight.Infrastructure/Services/HostService.cs +++ b/src/Core/Insight.Infrastructure/Services/HostService.cs @@ -4,33 +4,32 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace Insight.Infrastructure.Services +namespace Insight.Infrastructure.Services; + +public class HostService { - public class HostService + private readonly IMongoDatabase _database; + private readonly ILogger _logger; + + public HostService(IMongoDatabase database, ILogger logger) { - private readonly IMongoDatabase _database; - private readonly ILogger _logger; - - public HostService(IMongoDatabase database, ILogger logger) - { - _database = database; - _logger = logger; - } - - public Task> GetAsync( - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) => _database.Host().GetPagedAsync(filter, sort, offset, limit, cancellationToken); - - public Task> GetAsync( - HttpRequest request, - HttpResponse response, - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) => _database.Host().GetPagedAsync(request, response, filter, sort, offset, limit, cancellationToken); + _database = database; + _logger = logger; } + + public Task> GetAsync( + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) => _database.Host().GetPagedAsync(filter, sort, offset, limit, cancellationToken); + + public Task> GetAsync( + HttpRequest request, + HttpResponse response, + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) => _database.Host().GetPagedAsync(request, response, filter, sort, offset, limit, cancellationToken); } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Services/IdentityService.cs b/src/Core/Insight.Infrastructure/Services/IdentityService.cs index 03c7ca8..cc266b5 100644 --- a/src/Core/Insight.Infrastructure/Services/IdentityService.cs +++ b/src/Core/Insight.Infrastructure/Services/IdentityService.cs @@ -3,136 +3,135 @@ using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Logging; using System.Security.Claims; -namespace Insight.Infrastructure.Services +namespace Insight.Infrastructure.Services; + +public class IdentityService { - public class IdentityService + private readonly UserManager _userManager; + private readonly RoleManager _roleManager; + private readonly ILogger _logger; + + public IdentityService(UserManager userManager, RoleManager roleManager, ILogger logger) { - private readonly UserManager _userManager; - private readonly RoleManager _roleManager; - private readonly ILogger _logger; + _userManager = userManager; + _roleManager = roleManager; + _logger = logger; + } - public IdentityService(UserManager userManager, RoleManager roleManager, ILogger logger) + public async Task SeedAsync() + { + // SEED ROLES + if (await _roleManager.FindByNameAsync("system") is not InsightRole systemRole) { - _userManager = userManager; - _roleManager = roleManager; - _logger = logger; + var result = await CreateRoleAsync("system"); + if (result.Succeeded is false) throw new InvalidProgramException("seeding: system role failed"); + + systemRole = await _roleManager.FindByNameAsync("system") ?? throw new InvalidProgramException("seeding: system role failed"); } - public async Task SeedAsync() + if (await _roleManager.FindByNameAsync("administrator") is not InsightRole administratorRole) { - // SEED ROLES - if (await _roleManager.FindByNameAsync("system") is not InsightRole systemRole) - { - var result = await CreateRoleAsync("system"); - if (result.Succeeded is false) throw new InvalidProgramException("seeding: system role failed"); + var result = await CreateRoleAsync("administrator"); + if (result.Succeeded is false) throw new InvalidProgramException("seeding: administrator role failed"); - systemRole = await _roleManager.FindByNameAsync("system") ?? throw new InvalidProgramException("seeding: system role failed"); - } - - if (await _roleManager.FindByNameAsync("administrator") is not InsightRole administratorRole) - { - var result = await CreateRoleAsync("administrator"); - if (result.Succeeded is false) throw new InvalidProgramException("seeding: administrator role failed"); - - administratorRole = await _roleManager.FindByNameAsync("administrator") ?? throw new InvalidProgramException("seeding: administrator role failed"); - } - - if (await _roleManager.FindByNameAsync("chat") is not InsightRole chatRole) - { - var result = await CreateRoleAsync("chat"); - if (result.Succeeded is false) throw new InvalidProgramException("seeding: chat role failed"); - - chatRole = await _roleManager.FindByNameAsync("chat") ?? throw new InvalidProgramException("seeding: chat role failed"); - } - - // SEED USERS - if (await _userManager.FindByEmailAsync("system@insight.local") is not InsightUser systemUser) - { - var result = await CreateUserAsync("system@insight.local", "Replica3-Unroasted-Respect"); - if (result.Succeeded is false) throw new InvalidProgramException("seeding: system user failed"); - - systemUser = await _userManager.FindByEmailAsync("system@insight.local") ?? throw new InvalidProgramException("seeding: system user failed"); - } - - if (systemUser.Roles.Any(p => p == systemRole.Id) is false) - { - var assign = await _userManager.AddToRoleAsync(systemUser, systemRole.Name); - if (assign.Succeeded is false) throw new InvalidProgramException("seeding: system user roles failed"); - } + administratorRole = await _roleManager.FindByNameAsync("administrator") ?? throw new InvalidProgramException("seeding: administrator role failed"); } - public async Task CreateUserAsync(string email, string password) + if (await _roleManager.FindByNameAsync("chat") is not InsightRole chatRole) { - var user = new InsightUser - { - UserName = email, - NormalizedUserName = email.ToUpperInvariant(), - Email = email, - NormalizedEmail = email.ToUpperInvariant(), - }; + var result = await CreateRoleAsync("chat"); + if (result.Succeeded is false) throw new InvalidProgramException("seeding: chat role failed"); - return await _userManager.CreateAsync(user, password); + chatRole = await _roleManager.FindByNameAsync("chat") ?? throw new InvalidProgramException("seeding: chat role failed"); } - public async Task CreateRoleAsync(string name) + // SEED USERS + if (await _userManager.FindByEmailAsync("system@insight.local") is not InsightUser systemUser) { - var role = new InsightRole - { - Name = name, - NormalizedName = name.ToUpperInvariant() - }; + var result = await CreateUserAsync("system@insight.local", "Replica3-Unroasted-Respect"); + if (result.Succeeded is false) throw new InvalidProgramException("seeding: system user failed"); - return await _roleManager.CreateAsync(role); + systemUser = await _userManager.FindByEmailAsync("system@insight.local") ?? throw new InvalidProgramException("seeding: system user failed"); } - public async Task LoginAsync(string email, string password, string? code = null) + if (systemUser.Roles.Any(p => p == systemRole.Id) is false) { - if (await _userManager.FindByEmailAsync(email) is not InsightUser user) throw new InvalidDataException("Invalid Credentials"); - if (await _userManager.CheckPasswordAsync(user, password) is false) throw new InvalidDataException("Invalid Credentials"); - - if (await _userManager.GetTwoFactorEnabledAsync(user)) - { - if (string.IsNullOrWhiteSpace(code)) throw new InvalidOperationException("Requires 2FA Code"); - - var authCode = code.Replace(" ", string.Empty).Replace("-", string.Empty); - - if (await _userManager.VerifyTwoFactorTokenAsync(user, _userManager.Options.Tokens.AuthenticatorTokenProvider, authCode) is false) - { - throw new InvalidDataException("Invalid 2FA Code"); - } - } - - return user; - } - - public async Task ChangePasswordAsync(InsightUser user, string current, string @new) - { - var result = await _userManager.ChangePasswordAsync(user, current, @new).ConfigureAwait(false); - return result.Succeeded; - } - - public async Task GetByEmailAsync(string key) - { - var result = await _userManager.FindByEmailAsync(key).ConfigureAwait(false); - if (result is not null) return result; - - return null; - } - - public async Task> GetClaimsAsync(InsightUser user, bool includeRoles = true) - { - var claims = await _userManager.GetClaimsAsync(user).ConfigureAwait(false); - - if (includeRoles) - { - var roles = await _userManager.GetRolesAsync(user).ConfigureAwait(false); - foreach (var role in roles) claims.Add(new Claim(ClaimTypes.Role, role)); - } - - claims.Add(new Claim(ClaimTypes.Email, user.Email)); - claims.Add(new Claim("user", user.UserName)); - - return claims; + var assign = await _userManager.AddToRoleAsync(systemUser, systemRole.Name); + if (assign.Succeeded is false) throw new InvalidProgramException("seeding: system user roles failed"); } } + + public async Task CreateUserAsync(string email, string password) + { + var user = new InsightUser + { + UserName = email, + NormalizedUserName = email.ToUpperInvariant(), + Email = email, + NormalizedEmail = email.ToUpperInvariant(), + }; + + return await _userManager.CreateAsync(user, password); + } + + public async Task CreateRoleAsync(string name) + { + var role = new InsightRole + { + Name = name, + NormalizedName = name.ToUpperInvariant() + }; + + return await _roleManager.CreateAsync(role); + } + + public async Task LoginAsync(string email, string password, string? code = null) + { + if (await _userManager.FindByEmailAsync(email) is not InsightUser user) throw new InvalidDataException("Invalid Credentials"); + if (await _userManager.CheckPasswordAsync(user, password) is false) throw new InvalidDataException("Invalid Credentials"); + + if (await _userManager.GetTwoFactorEnabledAsync(user)) + { + if (string.IsNullOrWhiteSpace(code)) throw new InvalidOperationException("Requires 2FA Code"); + + var authCode = code.Replace(" ", string.Empty).Replace("-", string.Empty); + + if (await _userManager.VerifyTwoFactorTokenAsync(user, _userManager.Options.Tokens.AuthenticatorTokenProvider, authCode) is false) + { + throw new InvalidDataException("Invalid 2FA Code"); + } + } + + return user; + } + + public async Task ChangePasswordAsync(InsightUser user, string current, string @new) + { + var result = await _userManager.ChangePasswordAsync(user, current, @new).ConfigureAwait(false); + return result.Succeeded; + } + + public async Task GetByEmailAsync(string key) + { + var result = await _userManager.FindByEmailAsync(key).ConfigureAwait(false); + if (result is not null) return result; + + return null; + } + + public async Task> GetClaimsAsync(InsightUser user, bool includeRoles = true) + { + var claims = await _userManager.GetClaimsAsync(user).ConfigureAwait(false); + + if (includeRoles) + { + var roles = await _userManager.GetRolesAsync(user).ConfigureAwait(false); + foreach (var role in roles) claims.Add(new Claim(ClaimTypes.Role, role)); + } + + claims.Add(new Claim(ClaimTypes.Email, user.Email)); + claims.Add(new Claim("user", user.UserName)); + + return claims; + } } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Services/InventoryService.cs b/src/Core/Insight.Infrastructure/Services/InventoryService.cs index c5e1608..fd0235d 100644 --- a/src/Core/Insight.Infrastructure/Services/InventoryService.cs +++ b/src/Core/Insight.Infrastructure/Services/InventoryService.cs @@ -4,33 +4,32 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace Insight.Infrastructure.Services +namespace Insight.Infrastructure.Services; + +public class InventoryService { - public class InventoryService + private readonly IMongoDatabase _database; + private readonly ILogger _logger; + + public InventoryService(IMongoDatabase database, ILogger logger) { - private readonly IMongoDatabase _database; - private readonly ILogger _logger; - - public InventoryService(IMongoDatabase database, ILogger logger) - { - _database = database; - _logger = logger; - } - - public Task> GetAsync( - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) => _database.HostApplication().GetPagedAsync(filter, sort, offset, limit, cancellationToken); - - public Task> GetAsync( - HttpRequest request, - HttpResponse response, - FilterDefinition? filter = null, - SortDefinition? sort = null, - int offset = 0, - int limit = 10, - CancellationToken cancellationToken = default) => _database.HostApplication().GetPagedAsync(request, response, filter, sort, offset, limit, cancellationToken); + _database = database; + _logger = logger; } + + public Task> GetAsync( + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) => _database.HostApplication().GetPagedAsync(filter, sort, offset, limit, cancellationToken); + + public Task> GetAsync( + HttpRequest request, + HttpResponse response, + FilterDefinition? filter = null, + SortDefinition? sort = null, + int offset = 0, + int limit = 10, + CancellationToken cancellationToken = default) => _database.HostApplication().GetPagedAsync(request, response, filter, sort, offset, limit, cancellationToken); } \ No newline at end of file diff --git a/src/Core/Insight.Infrastructure/Services/TokenService.cs b/src/Core/Insight.Infrastructure/Services/TokenService.cs index 11c0ff3..f9cf6e7 100644 --- a/src/Core/Insight.Infrastructure/Services/TokenService.cs +++ b/src/Core/Insight.Infrastructure/Services/TokenService.cs @@ -8,142 +8,141 @@ using System.Net; using System.Security.Cryptography; using System.Text; -namespace Insight.Infrastructure.Services +namespace Insight.Infrastructure.Services; + +public class TokenService { - public class TokenService + private readonly TokenOptions _options; + private readonly IdentityService _identityService; + private readonly IMongoDatabase _database; + + public TokenService(TokenOptions options, IdentityService identityService, IMongoDatabase database) { - private readonly TokenOptions _options; - private readonly IdentityService _identityService; - private readonly IMongoDatabase _database; + _options = options; + _identityService = identityService; + _database = database; + } - public TokenService(TokenOptions options, IdentityService identityService, IMongoDatabase database) + public async Task GetAsync(string email, string password, string? code = null, IPAddress? ipa = null) + { + var user = await _identityService.LoginAsync(email, password, code).ConfigureAwait(false); + + var accessToken = await CreateAccessTokenAsync(user, ipa).ConfigureAwait(false); + var refreshToken = await CreateRefreshTokenAsync(user, ipa).ConfigureAwait(false); + + return new TokenResponse { - _options = options; - _identityService = identityService; - _database = database; + AccessToken = accessToken.Item1, + ExpireInSeconds = accessToken.Item2, + RefreshToken = refreshToken.Item1 + }; + } + + public async Task RefreshAsync(string refreshToken, IPAddress? ipa = null) + { + if (string.IsNullOrWhiteSpace(refreshToken)) throw new ArgumentNullException(nameof(refreshToken)); + + var user = await _database.User().Find(p => p.RefreshTokens.Any(t => t.Token == refreshToken)).FirstOrDefaultAsync(); + if (user is null || user.RefreshTokens is null) throw new InvalidDataException("Invalid Refresh Token"); + + var token = user.RefreshTokens.First(p => p.Token == refreshToken); + + if (token.IsRevoked) + { + // todo: revoke all descendant tokens in case this token has been compromised + throw new InvalidDataException("Invalid Refresh Token"); } - public async Task GetAsync(string email, string password, string? code = null, IPAddress? ipa = null) + if (token.IsActive is false) { - var user = await _identityService.LoginAsync(email, password, code).ConfigureAwait(false); + throw new InvalidDataException("Invalid Refresh Token"); + } - var accessToken = await CreateAccessTokenAsync(user, ipa).ConfigureAwait(false); - var refreshToken = await CreateRefreshTokenAsync(user, ipa).ConfigureAwait(false); + // remove actual refresh token + user.RefreshTokens.Remove(token); - return new TokenResponse + // remove old refresh tokens from user + user.RefreshTokens.RemoveAll(p => p.IsExpired && p.IsRevoked is false); + + // update users refreshTokens + await _database.User().UpdateOneAsync(Builders + .Filter.Eq(p => p.UserName, user.UserName), Builders + .Update.Set(p => p.RefreshTokens, user.RefreshTokens)); + + // create new refresh token + var newRefreshToken = await CreateRefreshTokenAsync(user, ipa).ConfigureAwait(false); + + // create access token + var accessToken = await CreateAccessTokenAsync(user, ipa).ConfigureAwait(false); + + return new TokenResponse + { + AccessToken = accessToken.Item1, + ExpireInSeconds = accessToken.Item2, + RefreshToken = newRefreshToken.Item1, + }; + } + + public async Task RevokeAsync(string refreshToken, string reason, IPAddress? ipa = null) + { + if (string.IsNullOrWhiteSpace(refreshToken)) throw new ArgumentNullException(nameof(refreshToken)); + + var user = await _database.User().Find(p => p.RefreshTokens.Any(t => t.Token == refreshToken)).FirstOrDefaultAsync(); + if (user is null || user.RefreshTokens is null) throw new InvalidDataException("Invalid Refresh Token"); + + var token = user.RefreshTokens.First(p => p.Token == refreshToken); + + if (token.IsActive is false) + { + throw new InvalidDataException("Invalid Refresh Token"); + } + + token.Revoked = DateTime.Now; + token.RevokedByIp = ipa?.ToString(); + token.ReasonRevoked = reason; + } + + private async Task<(string, int)> CreateAccessTokenAsync(InsightUser user, IPAddress? ipa = null) + { + var claims = await _identityService.GetClaimsAsync(user).ConfigureAwait(false); + + var key = Encoding.UTF8.GetBytes(_options.Key); + var secret = new SymmetricSecurityKey(key); + var signing = new SigningCredentials(secret, SecurityAlgorithms.HmacSha256); + + var securityToken = new JwtSecurityToken( + _options.Issuer?.ToString(), + _options.Audience?.ToString(), + claims, + DateTime.Now, + DateTime.Now.AddSeconds(Convert.ToDouble(_options.Expires)), + signing); + + var token = new JwtSecurityTokenHandler().WriteToken(securityToken); + + return (token, (int)TimeSpan.FromMinutes(Convert.ToDouble(_options.Expires)).TotalSeconds); + } + + private async Task<(string, int)> CreateRefreshTokenAsync(InsightUser user, IPAddress? ipa = null) + { + var randomNumber = new byte[32]; + + using var rng = RandomNumberGenerator.Create(); + rng.GetBytes(randomNumber); + + var refreshToken = Convert.ToBase64String(randomNumber); + + await _database.User() + .UpdateOneAsync(Builders + .Filter.Eq(p => p.UserName, user.UserName), Builders + .Update.AddToSet(p => p.RefreshTokens, new RefreshToken { - AccessToken = accessToken.Item1, - ExpireInSeconds = accessToken.Item2, - RefreshToken = refreshToken.Item1 - }; - } + Token = refreshToken, + Created = DateTime.Now, + Expires = DateTime.Now.AddMinutes(30), // change offset to config based + CreatedByIp = ipa?.ToString() + })); - public async Task RefreshAsync(string refreshToken, IPAddress? ipa = null) - { - if (string.IsNullOrWhiteSpace(refreshToken)) throw new ArgumentNullException(nameof(refreshToken)); - - var user = await _database.User().Find(p => p.RefreshTokens.Any(t => t.Token == refreshToken)).FirstOrDefaultAsync(); - if (user is null || user.RefreshTokens is null) throw new InvalidDataException("Invalid Refresh Token"); - - var token = user.RefreshTokens.First(p => p.Token == refreshToken); - - if (token.IsRevoked) - { - // todo: revoke all descendant tokens in case this token has been compromised - throw new InvalidDataException("Invalid Refresh Token"); - } - - if (token.IsActive is false) - { - throw new InvalidDataException("Invalid Refresh Token"); - } - - // remove actual refresh token - user.RefreshTokens.Remove(token); - - // remove old refresh tokens from user - user.RefreshTokens.RemoveAll(p => p.IsExpired && p.IsRevoked is false); - - // update users refreshTokens - await _database.User().UpdateOneAsync(Builders - .Filter.Eq(p => p.UserName, user.UserName), Builders - .Update.Set(p => p.RefreshTokens, user.RefreshTokens)); - - // create new refresh token - var newRefreshToken = await CreateRefreshTokenAsync(user, ipa).ConfigureAwait(false); - - // create access token - var accessToken = await CreateAccessTokenAsync(user, ipa).ConfigureAwait(false); - - return new TokenResponse - { - AccessToken = accessToken.Item1, - ExpireInSeconds = accessToken.Item2, - RefreshToken = newRefreshToken.Item1, - }; - } - - public async Task RevokeAsync(string refreshToken, string reason, IPAddress? ipa = null) - { - if (string.IsNullOrWhiteSpace(refreshToken)) throw new ArgumentNullException(nameof(refreshToken)); - - var user = await _database.User().Find(p => p.RefreshTokens.Any(t => t.Token == refreshToken)).FirstOrDefaultAsync(); - if (user is null || user.RefreshTokens is null) throw new InvalidDataException("Invalid Refresh Token"); - - var token = user.RefreshTokens.First(p => p.Token == refreshToken); - - if (token.IsActive is false) - { - throw new InvalidDataException("Invalid Refresh Token"); - } - - token.Revoked = DateTime.Now; - token.RevokedByIp = ipa?.ToString(); - token.ReasonRevoked = reason; - } - - private async Task<(string, int)> CreateAccessTokenAsync(InsightUser user, IPAddress? ipa = null) - { - var claims = await _identityService.GetClaimsAsync(user).ConfigureAwait(false); - - var key = Encoding.UTF8.GetBytes(_options.Key); - var secret = new SymmetricSecurityKey(key); - var signing = new SigningCredentials(secret, SecurityAlgorithms.HmacSha256); - - var securityToken = new JwtSecurityToken( - _options.Issuer?.ToString(), - _options.Audience?.ToString(), - claims, - DateTime.Now, - DateTime.Now.AddSeconds(Convert.ToDouble(_options.Expires)), - signing); - - var token = new JwtSecurityTokenHandler().WriteToken(securityToken); - - return (token, (int)TimeSpan.FromMinutes(Convert.ToDouble(_options.Expires)).TotalSeconds); - } - - private async Task<(string, int)> CreateRefreshTokenAsync(InsightUser user, IPAddress? ipa = null) - { - var randomNumber = new byte[32]; - - using var rng = RandomNumberGenerator.Create(); - rng.GetBytes(randomNumber); - - var refreshToken = Convert.ToBase64String(randomNumber); - - await _database.User() - .UpdateOneAsync(Builders - .Filter.Eq(p => p.UserName, user.UserName), Builders - .Update.AddToSet(p => p.RefreshTokens, new RefreshToken - { - Token = refreshToken, - Created = DateTime.Now, - Expires = DateTime.Now.AddMinutes(30), // change offset to config based - CreatedByIp = ipa?.ToString() - })); - - return (refreshToken, (int)TimeSpan.FromMinutes(30).TotalSeconds); - } + return (refreshToken, (int)TimeSpan.FromMinutes(30).TotalSeconds); } } \ No newline at end of file diff --git a/src/Server/Insight.Server/Constants/Appsettings.cs b/src/Server/Insight.Server/Constants/Appsettings.cs index 29f0dd7..07a59f5 100644 --- a/src/Server/Insight.Server/Constants/Appsettings.cs +++ b/src/Server/Insight.Server/Constants/Appsettings.cs @@ -1,14 +1,13 @@ -namespace Insight.Server -{ - internal static class Appsettings - { - internal const string AgentServerPort = "agent.server.port"; - internal const string AgentServerCertificate = "agent.server.certificate"; - internal const string AgentServerCertificatePassword = "agent.server.certificate.password"; - internal const string DispatchWebmatic = "dispatch.webmatic"; +namespace Insight.Server; - internal const string WebServerPort = "web.server.port"; - internal const string WebServerCertificate = "web.server.certificate"; - internal const string WebServerCertificatePassword = "web.server.certificate.password"; - } +internal static class Appsettings +{ + internal const string AgentServerPort = "agent.server.port"; + internal const string AgentServerCertificate = "agent.server.certificate"; + internal const string AgentServerCertificatePassword = "agent.server.certificate.password"; + internal const string DispatchWebmatic = "dispatch.webmatic"; + + internal const string WebServerPort = "web.server.port"; + internal const string WebServerCertificate = "web.server.certificate"; + internal const string WebServerCertificatePassword = "web.server.certificate.password"; } \ No newline at end of file diff --git a/src/Server/Insight.Server/Extensions/Async.cs b/src/Server/Insight.Server/Extensions/Async.cs index 2b41b74..ed2cd7e 100644 --- a/src/Server/Insight.Server/Extensions/Async.cs +++ b/src/Server/Insight.Server/Extensions/Async.cs @@ -1,53 +1,52 @@ using System.Threading.Tasks.Dataflow; -namespace Insight.Server.Extensions +namespace Insight.Server.Extensions; + +public static class Async { - public static class Async + public static async Task ParallelForEach( + this IAsyncEnumerable source, + Func body, + int maxDegreeOfParallelism = DataflowBlockOptions.Unbounded, + TaskScheduler scheduler = null) { - public static async Task ParallelForEach( - this IAsyncEnumerable source, - Func body, - int maxDegreeOfParallelism = DataflowBlockOptions.Unbounded, - TaskScheduler scheduler = null) + var options = new ExecutionDataflowBlockOptions { - var options = new ExecutionDataflowBlockOptions - { - MaxDegreeOfParallelism = maxDegreeOfParallelism - }; + MaxDegreeOfParallelism = maxDegreeOfParallelism + }; - if (scheduler != null) - options.TaskScheduler = scheduler; + if (scheduler != null) + options.TaskScheduler = scheduler; - var block = new ActionBlock(body, options); + var block = new ActionBlock(body, options); - await foreach (var item in source) - block.Post(item); + await foreach (var item in source) + block.Post(item); - block.Complete(); - await block.Completion; - } + block.Complete(); + await block.Completion; + } - public static async Task ParallelForEach( - this IEnumerable source, - Func body, - int maxDegreeOfParallelism = DataflowBlockOptions.Unbounded, - TaskScheduler scheduler = null) + public static async Task ParallelForEach( + this IEnumerable source, + Func body, + int maxDegreeOfParallelism = DataflowBlockOptions.Unbounded, + TaskScheduler scheduler = null) + { + var options = new ExecutionDataflowBlockOptions { - var options = new ExecutionDataflowBlockOptions - { - MaxDegreeOfParallelism = maxDegreeOfParallelism - }; + MaxDegreeOfParallelism = maxDegreeOfParallelism + }; - if (scheduler != null) - options.TaskScheduler = scheduler; + if (scheduler != null) + options.TaskScheduler = scheduler; - var block = new ActionBlock(body, options); + var block = new ActionBlock(body, options); - foreach (var item in source) - block.Post(item); + foreach (var item in source) + block.Post(item); - block.Complete(); - await block.Completion; - } + block.Complete(); + await block.Completion; } } diff --git a/src/Server/Insight.Server/Extensions/ConfigurationExtensions.cs b/src/Server/Insight.Server/Extensions/ConfigurationExtensions.cs index 6f0abe0..3bc0aa5 100644 --- a/src/Server/Insight.Server/Extensions/ConfigurationExtensions.cs +++ b/src/Server/Insight.Server/Extensions/ConfigurationExtensions.cs @@ -1,14 +1,13 @@ using Microsoft.Extensions.Configuration; -namespace Insight.Server.Extensions +namespace Insight.Server.Extensions; + +public static class ConfigurationExtensions { - public static class ConfigurationExtensions + public static IConfigurationBuilder Defaults(this IConfigurationBuilder configuration) { - public static IConfigurationBuilder Defaults(this IConfigurationBuilder configuration) - { - configuration.Sources.Clear(); - configuration.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); - return configuration.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true); - } + configuration.Sources.Clear(); + configuration.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); + return configuration.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true); } } \ No newline at end of file diff --git a/src/Setup/Insight.Setup.Windows/Constants/Deploy.cs b/src/Setup/Insight.Setup.Windows/Constants/Deploy.cs index 724759b..5240b5e 100644 --- a/src/Setup/Insight.Setup.Windows/Constants/Deploy.cs +++ b/src/Setup/Insight.Setup.Windows/Constants/Deploy.cs @@ -1,49 +1,48 @@ -namespace Insight.Setup.Constants +namespace Insight.Setup.Constants; + +public static class Deploy { - public static class Deploy + public static class Runtime { - public static class Runtime + public static class Core { - public static class Core - { - public const string Version = "7.0.2"; - public const string Download = "https://download.visualstudio.microsoft.com/download/pr/df7da01f-1f17-4728-92b7-778e9607da8f/7c18246830f8c78591f02f25aa368dcf/dotnet-runtime-7.0.2-win-x64.exe"; + public const string Version = "7.0.2"; + public const string Download = "https://download.visualstudio.microsoft.com/download/pr/df7da01f-1f17-4728-92b7-778e9607da8f/7c18246830f8c78591f02f25aa368dcf/dotnet-runtime-7.0.2-win-x64.exe"; - public static DirectoryInfo Directory => new DirectoryInfo($@"{Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)}/dotnet/shared/Microsoft.NETCore.App"); - } - - public static class Asp - { - public const string Version = "7.0.2"; - public const string Download = "https://download.visualstudio.microsoft.com/download/pr/3ecad4f7-1342-4688-ae4a-38908c61f4a2/391a9010acad2e312e3d1e766bedfac7/aspnetcore-runtime-7.0.2-win-x64.exe"; - - public static DirectoryInfo Directory => new DirectoryInfo($@"{Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)}/dotnet/shared/Microsoft.AspNetCore.App"); - } + public static DirectoryInfo Directory => new DirectoryInfo($@"{Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)}/dotnet/shared/Microsoft.NETCore.App"); } - public static class Updater + public static class Asp { - public const string Name = "Updater"; - public const string ServiceName = "insight_updater"; - public const string Description = "Insight Updater"; + public const string Version = "7.0.2"; + public const string Download = "https://download.visualstudio.microsoft.com/download/pr/3ecad4f7-1342-4688-ae4a-38908c61f4a2/391a9010acad2e312e3d1e766bedfac7/aspnetcore-runtime-7.0.2-win-x64.exe"; - public static Uri UpdateHref(Uri api) => new($"{api.AbsoluteUri}/{Name}/windows"); + public static DirectoryInfo Directory => new DirectoryInfo($@"{Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)}/dotnet/shared/Microsoft.AspNetCore.App"); } - - public static class Agent - { - public const string Name = "Agent"; - public const string ServiceName = "insight_agent"; - public const string Description = "Insight Agent"; - } - - public static DirectoryInfo GetAppDirectory(string appName) - => new($"{Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)}/Webmatic/Insight/{appName}"); - - public static FileInfo GetAppExecutable(string appName) - => new($"{GetAppDirectory(appName).FullName}/{appName.ToLower()}.exe"); - - public static Uri GetUpdateHref(Uri api, string appName) - => new($"{api.AbsoluteUri}/update/{appName.ToLower()}/windows"); } + + public static class Updater + { + public const string Name = "Updater"; + public const string ServiceName = "insight_updater"; + public const string Description = "Insight Updater"; + + public static Uri UpdateHref(Uri api) => new($"{api.AbsoluteUri}/{Name}/windows"); + } + + public static class Agent + { + public const string Name = "Agent"; + public const string ServiceName = "insight_agent"; + public const string Description = "Insight Agent"; + } + + public static DirectoryInfo GetAppDirectory(string appName) + => new($"{Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)}/Webmatic/Insight/{appName}"); + + public static FileInfo GetAppExecutable(string appName) + => new($"{GetAppDirectory(appName).FullName}/{appName.ToLower()}.exe"); + + public static Uri GetUpdateHref(Uri api, string appName) + => new($"{api.AbsoluteUri}/update/{appName.ToLower()}/windows"); } \ No newline at end of file diff --git a/src/Setup/Insight.Setup.Windows/Program.cs b/src/Setup/Insight.Setup.Windows/Program.cs index 8c488d7..4450a9a 100644 --- a/src/Setup/Insight.Setup.Windows/Program.cs +++ b/src/Setup/Insight.Setup.Windows/Program.cs @@ -5,54 +5,53 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System.Runtime.Versioning; -namespace Insight.Setup.Windows +namespace Insight.Setup.Windows; + +[SupportedOSPlatform("windows")] +internal class Program { - [SupportedOSPlatform("windows")] - public class Program + public static async Task Main(string[] args) { - public static async Task Main(string[] args) - { - await Host.CreateDefaultBuilder(args) - .ConfigureAppConfiguration(options => + await Host.CreateDefaultBuilder(args) + .ConfigureAppConfiguration(options => + { + options.Sources.Clear(); + options.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); + options.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true); + + options.AddCommandLine(args, new Dictionary() { - options.Sources.Clear(); - options.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); - options.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true); + { "-deploy", "deploy" }, + { "--deploy", "deploy" } + }); + }) + .ConfigureLogging(options => + { + options.ClearProviders(); + options.SetMinimumLevel(LogLevel.Trace); - options.AddCommandLine(args, new Dictionary() - { - { "-deploy", "deploy" }, - { "--deploy", "deploy" } - }); - }) - .ConfigureLogging(options => + options.AddSimpleConsole(options => { - options.ClearProviders(); - options.SetMinimumLevel(LogLevel.Trace); + options.IncludeScopes = true; + options.SingleLine = true; + options.TimestampFormat = "yyyy-MM-dd HH:mm:ss.fff "; + }); - options.AddSimpleConsole(options => - { - options.IncludeScopes = true; - options.SingleLine = true; - options.TimestampFormat = "yyyy-MM-dd HH:mm:ss.fff "; - }); + options.AddFilter("Microsoft", LogLevel.Warning); + }) + .ConfigureServices((host, services) => + { + // SERVICES + services.AddHostedService(); - options.AddFilter("Microsoft", LogLevel.Warning); - }) - .ConfigureServices((host, services) => + // GLOBALS + services.AddTransient(provider => new HttpClient(new HttpClientHandler { - // SERVICES - services.AddHostedService(); - - // GLOBALS - services.AddTransient(provider => new HttpClient(new HttpClientHandler - { - ClientCertificateOptions = ClientCertificateOption.Manual, - ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => true - })); - }) - .Build() - .RunAsync(); - } + ClientCertificateOptions = ClientCertificateOption.Manual, + ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => true + })); + }) + .Build() + .RunAsync(); } } \ No newline at end of file diff --git a/src/Setup/Insight.Setup.Windows/Services/Deployment.cs b/src/Setup/Insight.Setup.Windows/Services/Deployment.cs index 57a8047..cfddfa9 100644 --- a/src/Setup/Insight.Setup.Windows/Services/Deployment.cs +++ b/src/Setup/Insight.Setup.Windows/Services/Deployment.cs @@ -6,472 +6,471 @@ using System.Runtime.Versioning; using System.ServiceProcess; using System.Text.Json; -namespace Insight.Setup.Services +namespace Insight.Setup.Services; + +public static class Deployment { - public static class Deployment + [SupportedOSPlatform("windows")] + public static class Windows { - [SupportedOSPlatform("windows")] - public static class Windows + public static class Service { - public static class Service + private static bool ServiceExistence(string serviceName) { - private static bool ServiceExistence(string serviceName) + try { - try - { - if (ServiceController.GetServices().Any(s => s.ServiceName.Equals(serviceName, StringComparison.InvariantCultureIgnoreCase))) return true; - return false; - } - catch (Exception) { } - + if (ServiceController.GetServices().Any(s => s.ServiceName.Equals(serviceName, StringComparison.InvariantCultureIgnoreCase))) return true; return false; } + catch (Exception) { } - private static bool SetServiceState(string app, ServiceControllerStatus status, TimeSpan timeout) + return false; + } + + private static bool SetServiceState(string app, ServiceControllerStatus status, TimeSpan timeout) + { + try { - try + using var sc = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName.Equals(app, StringComparison.InvariantCultureIgnoreCase)); + if (sc is null) return false; + + if (sc.Status != status) { - using var sc = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName.Equals(app, StringComparison.InvariantCultureIgnoreCase)); - if (sc is null) return false; - - if (sc.Status != status) + switch (status) { - switch (status) - { - case ServiceControllerStatus.Running: - sc.Start(); - break; + case ServiceControllerStatus.Running: + sc.Start(); + break; - case ServiceControllerStatus.Stopped: - sc.Stop(); - break; - } - - sc.WaitForStatus(status, timeout); + case ServiceControllerStatus.Stopped: + sc.Stop(); + break; } - return true; + sc.WaitForStatus(status, timeout); } - catch (Exception) { } + return true; + } + catch (Exception) { } + + return false; + } + + private static async ValueTask InstallAsync(FileInfo bin, string serviceName, string displayName, string description, bool autorun) + { + if (bin.Exists is false) return false; + if (ServiceExistence(serviceName)) return false; + + var args = @$"/C sc create {serviceName} binPath= ""{bin.FullName}"" DisplayName= ""{displayName}"""; + args += $@" && sc description {serviceName} ""{description}"""; + args += $@" && sc config {serviceName} start= {(autorun ? "auto" : "demand")}"; + args += $@" && sc start {serviceName}"; + + try + { + using var process = new System.Diagnostics.Process() + { + StartInfo = new ProcessStartInfo + { + WindowStyle = ProcessWindowStyle.Normal, + FileName = "cmd.exe", + Arguments = args, + Verb = "runas", + RedirectStandardOutput = true, + UseShellExecute = false + } + }; + + process.Start(); + + var output = await process.StandardOutput.ReadToEndAsync(); + + if (Directory.GetParent(bin.FullName) is not DirectoryInfo serviceDir) return false; + + return ServiceExistence(serviceName); // may return output as return model if existence false + } + catch (Exception) + { return false; } - - private static async ValueTask InstallAsync(FileInfo bin, string serviceName, string displayName, string description, bool autorun) - { - if (bin.Exists is false) return false; - if (ServiceExistence(serviceName)) return false; - - var args = @$"/C sc create {serviceName} binPath= ""{bin.FullName}"" DisplayName= ""{displayName}"""; - args += $@" && sc description {serviceName} ""{description}"""; - args += $@" && sc config {serviceName} start= {(autorun ? "auto" : "demand")}"; - args += $@" && sc start {serviceName}"; - - try - { - using var process = new System.Diagnostics.Process() - { - StartInfo = new ProcessStartInfo - { - WindowStyle = ProcessWindowStyle.Normal, - FileName = "cmd.exe", - Arguments = args, - Verb = "runas", - RedirectStandardOutput = true, - UseShellExecute = false - } - }; - - process.Start(); - - var output = await process.StandardOutput.ReadToEndAsync(); - - if (Directory.GetParent(bin.FullName) is not DirectoryInfo serviceDir) return false; - - return ServiceExistence(serviceName); // may return output as return model if existence false - } - catch (Exception) - { - return false; - } - } - - public static async ValueTask InstallAsync(HttpClient httpClient, Uri api, FileInfo bin, string serviceName, string serviceDisplayName, string serviceDescription, bool autorun, CancellationToken cancellationToken) - { - var result = new InstallResult - { - Api = api?.ToString(), - SourceDirectory = bin.Directory?.FullName, - App = bin.Name, - ServiceName = serviceName, - Autorun = autorun - }; - - try - { - if (ServiceExistence(serviceName)) - { - result.Errors.Add("Service already installed"); - return result; - } - - var response = await httpClient.GetFromJsonAsync(api, cancellationToken); - if (response is null) - { - result.ApiErrors.Add("not available / response null"); - return result; - } - - // get update file (bytes) to memory - using var update = await httpClient.GetAsync(response.Uri, cancellationToken); - if (update is null) - { - result.ApiErrors.Add("update source not available"); - return result; - } - - result.ApiAvailable = true; - - // read update archive to temp (overwrite) - var temp = Directory.CreateTempSubdirectory(); - var updateFile = new FileInfo($@"{temp.FullName}/{bin.Name}.zip"); - - await File.WriteAllBytesAsync(updateFile.FullName, await update.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); - - // extract update archive from temp to app dir (overwrite) - ZipFile.ExtractToDirectory(updateFile.FullName, bin.Directory?.FullName, true); - - // delete temp folder - if (temp.Exists) temp.Delete(true); - - // install service with windows api - if (await InstallAsync(bin, serviceName, serviceDisplayName, serviceDescription, autorun) is false) - { - result.Errors.Add("installation failed"); - return result; - } - - result.Success = true; - } - catch (Exception ex) - { - result.Errors.Add(ex.Message); - } - - return result; - } - - public static async ValueTask UpdateAsync(HttpClient httpClient, Uri api, FileInfo bin, string serviceName, CancellationToken cancellationToken) - { - var result = new UpdateResult - { - Api = api?.ToString(), - SourceDirectory = bin.Directory?.FullName, - App = bin.Name, - ServiceName = serviceName - }; - - try - { - // check if service exists - if (ServiceExistence(serviceName) is false) - { - result.UpdateErrors.Add("service not found"); - return result; - } - - // get service update details - var response = await httpClient.GetFromJsonAsync(api, cancellationToken); - if (response is null) - { - result.ApiErrors.Add("not available / response null"); - return result; - } - - result.ApiAvailable = true; - - // check if local binary exists - if (bin is null) - { - result.UpdateErrors.Add("source binary not found"); - return result; - } - - // get local file binary version - if (FileVersionInfo.GetVersionInfo(bin.FullName).FileVersion is not string binVersionString) - { - result.UpdateErrors.Add("source binary fileversion not valid"); - return result; - } - - // compare local against update version, skip lower or equal update version - var actualVersion = Version.Parse(binVersionString); - if (actualVersion >= response.Version) - { - result.Success = true; - return result; - } - else - { - result.UpdateAvailable = true; - } - - // get update file (bytes) to memory - using var update = await httpClient.GetAsync(response.Uri, cancellationToken); - if (update is null) - { - result.ApiErrors.Add("update source not available"); - return result; - } - - // stop service - if (SetServiceState(serviceName, ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10)) is false) - { - result.UpdateErrors.Add("service control failed / failed to stop service"); - return result; - } - - // read update archive to temp (overwrite) - var temp = Directory.CreateTempSubdirectory(); - var updateFile = new FileInfo($@"{temp.FullName}/{bin.Name}.zip"); - - await File.WriteAllBytesAsync(updateFile.FullName, await update.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); - - // extract update archive from temp to app dir (overwrite) - ZipFile.ExtractToDirectory(updateFile.FullName, bin.Directory?.FullName, true); - - // delete temp folder - if (temp.Exists) temp.Delete(true); - - // start updateds service - if (SetServiceState(serviceName, ServiceControllerStatus.Running, TimeSpan.FromSeconds(10)) is false) - { - result.UpdateErrors.Add("service control failed / failed to start service"); - return result; - } - - result.Success = true; - } - catch (Exception ex) - { - result.UpdateErrors.Add(ex.Message); - } - - return result; - } - - public static async ValueTask UninstallAsync(string serviceName) - { - var result = new UninstallResult - { - ServiceName = serviceName - }; - - try - { - if (ServiceExistence(serviceName) is false) - { - result.Errors.Add("service not found"); - return result; - } - - if (SetServiceState(serviceName, ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(60)) is false) - { - result.Errors.Add("service control failed / failed to stop service"); - return result; - } - - using var process = new System.Diagnostics.Process() - { - StartInfo = new ProcessStartInfo - { - WindowStyle = ProcessWindowStyle.Normal, - FileName = "cmd.exe", - Arguments = $"/C sc delete {serviceName}", - Verb = "runas", - RedirectStandardOutput = true, - UseShellExecute = false - } - }; - - process.Start(); - - var output = await process.StandardOutput.ReadToEndAsync(); - - // may return output as return model if existence true - - if (ServiceExistence(serviceName)) - { - result.Errors.Add("service still existing"); - } - - result.Success = true; - } - catch (Exception ex) - { - result.Errors.Add(ex.Message); - } - - return result; - } } - public static class Process + public static async ValueTask InstallAsync(HttpClient httpClient, Uri api, FileInfo bin, string serviceName, string serviceDisplayName, string serviceDescription, bool autorun, CancellationToken cancellationToken) { - public static bool IsRunning(FileInfo bin) + var result = new InstallResult { - if (bin.Exists is false) return false; + Api = api?.ToString(), + SourceDirectory = bin.Directory?.FullName, + App = bin.Name, + ServiceName = serviceName, + Autorun = autorun + }; - var matched = System.Diagnostics.Process.GetProcessesByName(bin.FullName); - - if (matched is null || matched.Any() is false) return false; - - if (matched.Any(p => - p.MainModule is not null && - p.MainModule.FileName is not null && - p.MainModule.FileName.Equals(bin.FullName, - StringComparison.InvariantCultureIgnoreCase))) return true; - - return false; - } - - public static bool Start(FileInfo binary) + try { - try + if (ServiceExistence(serviceName)) { - if (IsRunning(binary) is false) return false; - - using var process = System.Diagnostics.Process.Start(binary.FullName); - return true; + result.Errors.Add("Service already installed"); + return result; } - catch (Exception) { } - return false; + var response = await httpClient.GetFromJsonAsync(api, cancellationToken); + if (response is null) + { + result.ApiErrors.Add("not available / response null"); + return result; + } + + // get update file (bytes) to memory + using var update = await httpClient.GetAsync(response.Uri, cancellationToken); + if (update is null) + { + result.ApiErrors.Add("update source not available"); + return result; + } + + result.ApiAvailable = true; + + // read update archive to temp (overwrite) + var temp = Directory.CreateTempSubdirectory(); + var updateFile = new FileInfo($@"{temp.FullName}/{bin.Name}.zip"); + + await File.WriteAllBytesAsync(updateFile.FullName, await update.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); + + // extract update archive from temp to app dir (overwrite) + ZipFile.ExtractToDirectory(updateFile.FullName, bin.Directory?.FullName, true); + + // delete temp folder + if (temp.Exists) temp.Delete(true); + + // install service with windows api + if (await InstallAsync(bin, serviceName, serviceDisplayName, serviceDescription, autorun) is false) + { + result.Errors.Add("installation failed"); + return result; + } + + result.Success = true; + } + catch (Exception ex) + { + result.Errors.Add(ex.Message); } - public static bool Stop(FileInfo bin, TimeSpan timeout) + return result; + } + + public static async ValueTask UpdateAsync(HttpClient httpClient, Uri api, FileInfo bin, string serviceName, CancellationToken cancellationToken) + { + var result = new UpdateResult { - try + Api = api?.ToString(), + SourceDirectory = bin.Directory?.FullName, + App = bin.Name, + ServiceName = serviceName + }; + + try + { + // check if service exists + if (ServiceExistence(serviceName) is false) { - if (IsRunning(bin) is false) return false; + result.UpdateErrors.Add("service not found"); + return result; + } - var matched = System.Diagnostics.Process.GetProcessesByName(bin.FullName); + // get service update details + var response = await httpClient.GetFromJsonAsync(api, cancellationToken); + if (response is null) + { + result.ApiErrors.Add("not available / response null"); + return result; + } - if (matched is null || matched.Any() is false) return true; + result.ApiAvailable = true; - foreach (var procsInfo in matched.Where(p => - p.MainModule is not null && - p.MainModule.FileName is not null && - p.MainModule.FileName.Equals(bin.FullName, StringComparison.InvariantCultureIgnoreCase))) + // check if local binary exists + if (bin is null) + { + result.UpdateErrors.Add("source binary not found"); + return result; + } + + // get local file binary version + if (FileVersionInfo.GetVersionInfo(bin.FullName).FileVersion is not string binVersionString) + { + result.UpdateErrors.Add("source binary fileversion not valid"); + return result; + } + + // compare local against update version, skip lower or equal update version + var actualVersion = Version.Parse(binVersionString); + if (actualVersion >= response.Version) + { + result.Success = true; + return result; + } + else + { + result.UpdateAvailable = true; + } + + // get update file (bytes) to memory + using var update = await httpClient.GetAsync(response.Uri, cancellationToken); + if (update is null) + { + result.ApiErrors.Add("update source not available"); + return result; + } + + // stop service + if (SetServiceState(serviceName, ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10)) is false) + { + result.UpdateErrors.Add("service control failed / failed to stop service"); + return result; + } + + // read update archive to temp (overwrite) + var temp = Directory.CreateTempSubdirectory(); + var updateFile = new FileInfo($@"{temp.FullName}/{bin.Name}.zip"); + + await File.WriteAllBytesAsync(updateFile.FullName, await update.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); + + // extract update archive from temp to app dir (overwrite) + ZipFile.ExtractToDirectory(updateFile.FullName, bin.Directory?.FullName, true); + + // delete temp folder + if (temp.Exists) temp.Delete(true); + + // start updateds service + if (SetServiceState(serviceName, ServiceControllerStatus.Running, TimeSpan.FromSeconds(10)) is false) + { + result.UpdateErrors.Add("service control failed / failed to start service"); + return result; + } + + result.Success = true; + } + catch (Exception ex) + { + result.UpdateErrors.Add(ex.Message); + } + + return result; + } + + public static async ValueTask UninstallAsync(string serviceName) + { + var result = new UninstallResult + { + ServiceName = serviceName + }; + + try + { + if (ServiceExistence(serviceName) is false) + { + result.Errors.Add("service not found"); + return result; + } + + if (SetServiceState(serviceName, ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(60)) is false) + { + result.Errors.Add("service control failed / failed to stop service"); + return result; + } + + using var process = new System.Diagnostics.Process() + { + StartInfo = new ProcessStartInfo { - if (procsInfo.CloseMainWindow()) procsInfo.WaitForExit((int)timeout.TotalMilliseconds); - if (procsInfo.HasExited is false) procsInfo.Kill(true); + WindowStyle = ProcessWindowStyle.Normal, + FileName = "cmd.exe", + Arguments = $"/C sc delete {serviceName}", + Verb = "runas", + RedirectStandardOutput = true, + UseShellExecute = false } + }; - return true; + process.Start(); + + var output = await process.StandardOutput.ReadToEndAsync(); + + // may return output as return model if existence true + + if (ServiceExistence(serviceName)) + { + result.Errors.Add("service still existing"); } - catch (Exception) { } - return false; + result.Success = true; + } + catch (Exception ex) + { + result.Errors.Add(ex.Message); } - public static async ValueTask UpdateAsync(HttpClient httpClient, Uri api, FileInfo bin, CancellationToken cancellationToken) + return result; + } + } + + public static class Process + { + public static bool IsRunning(FileInfo bin) + { + if (bin.Exists is false) return false; + + var matched = System.Diagnostics.Process.GetProcessesByName(bin.FullName); + + if (matched is null || matched.Any() is false) return false; + + if (matched.Any(p => + p.MainModule is not null && + p.MainModule.FileName is not null && + p.MainModule.FileName.Equals(bin.FullName, + StringComparison.InvariantCultureIgnoreCase))) return true; + + return false; + } + + public static bool Start(FileInfo binary) + { + try + { + if (IsRunning(binary) is false) return false; + + using var process = System.Diagnostics.Process.Start(binary.FullName); + return true; + } + catch (Exception) { } + + return false; + } + + public static bool Stop(FileInfo bin, TimeSpan timeout) + { + try { if (IsRunning(bin) is false) return false; - var response = await httpClient.GetFromJsonAsync(api.AbsoluteUri, new JsonSerializerOptions + var matched = System.Diagnostics.Process.GetProcessesByName(bin.FullName); + + if (matched is null || matched.Any() is false) return true; + + foreach (var procsInfo in matched.Where(p => + p.MainModule is not null && + p.MainModule.FileName is not null && + p.MainModule.FileName.Equals(bin.FullName, StringComparison.InvariantCultureIgnoreCase))) { - IncludeFields = true - }, cancellationToken); - - if (response is null) return false; - - Version actualVersion; - - if (FileVersionInfo.GetVersionInfo(bin.FullName).FileVersion is not string binVersionString) return false; - - try - { - actualVersion = Version.Parse(binVersionString); - if (actualVersion >= response.Version) return false; - - using var update = await httpClient.GetAsync(response.Uri, cancellationToken); - if (update is null) return false; - - Stop(bin, TimeSpan.FromSeconds(60)); - - // read update archive to temp (overwrite) - var temp = Directory.CreateTempSubdirectory(); - var updateFile = new FileInfo($@"{temp.FullName}/{bin.Name}.zip"); - - await File.WriteAllBytesAsync(updateFile.FullName, await update.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); - - // extract update archive from temp to app dir (overwrite) - ZipFile.ExtractToDirectory(updateFile.FullName, bin.Directory?.FullName, true); - - // delete temp folder - if (temp.Exists) temp.Delete(true); - - // rewrite with options to start user session process - //Start(app, directory, TimeSpan.FromSeconds(60)); - - return true; + if (procsInfo.CloseMainWindow()) procsInfo.WaitForExit((int)timeout.TotalMilliseconds); + if (procsInfo.HasExited is false) procsInfo.Kill(true); } - catch (Exception) { } - return false; + return true; } + catch (Exception) { } - public static bool Delete(FileInfo bin, TimeSpan timeout) + return false; + } + + public static async ValueTask UpdateAsync(HttpClient httpClient, Uri api, FileInfo bin, CancellationToken cancellationToken) + { + if (IsRunning(bin) is false) return false; + + var response = await httpClient.GetFromJsonAsync(api.AbsoluteUri, new JsonSerializerOptions { - try - { - Stop(bin, timeout); - bin.Delete(); + IncludeFields = true + }, cancellationToken); - return true; - } - catch (Exception) { } + if (response is null) return false; - return false; + Version actualVersion; + + if (FileVersionInfo.GetVersionInfo(bin.FullName).FileVersion is not string binVersionString) return false; + + try + { + actualVersion = Version.Parse(binVersionString); + if (actualVersion >= response.Version) return false; + + using var update = await httpClient.GetAsync(response.Uri, cancellationToken); + if (update is null) return false; + + Stop(bin, TimeSpan.FromSeconds(60)); + + // read update archive to temp (overwrite) + var temp = Directory.CreateTempSubdirectory(); + var updateFile = new FileInfo($@"{temp.FullName}/{bin.Name}.zip"); + + await File.WriteAllBytesAsync(updateFile.FullName, await update.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); + + // extract update archive from temp to app dir (overwrite) + ZipFile.ExtractToDirectory(updateFile.FullName, bin.Directory?.FullName, true); + + // delete temp folder + if (temp.Exists) temp.Delete(true); + + // rewrite with options to start user session process + //Start(app, directory, TimeSpan.FromSeconds(60)); + + return true; } + catch (Exception) { } + + return false; + } + + public static bool Delete(FileInfo bin, TimeSpan timeout) + { + try + { + Stop(bin, timeout); + bin.Delete(); + + return true; + } + catch (Exception) { } + + return false; } } + } - public class InstallResult - { - public string? Api { get; set; } - public string? SourceDirectory { get; set; } - public string? App { get; set; } - public string? ServiceName { get; set; } - public bool Autorun { get; set; } + public class InstallResult + { + public string? Api { get; set; } + public string? SourceDirectory { get; set; } + public string? App { get; set; } + public string? ServiceName { get; set; } + public bool Autorun { get; set; } - public bool ApiAvailable { get; set; } = false; - public bool Success { get; set; } = false; - public List ApiErrors { get; } = new(); - public List Errors { get; } = new(); - } + public bool ApiAvailable { get; set; } = false; + public bool Success { get; set; } = false; + public List ApiErrors { get; } = new(); + public List Errors { get; } = new(); + } - public class UpdateResult - { - public string? Api { get; set; } - public string? SourceDirectory { get; set; } - public string? App { get; set; } - public string? ServiceName { get; set; } + public class UpdateResult + { + public string? Api { get; set; } + public string? SourceDirectory { get; set; } + public string? App { get; set; } + public string? ServiceName { get; set; } - public bool ApiAvailable { get; set; } = false; - public bool UpdateAvailable { get; set; } = false; - public bool Success { get; set; } = false; - public List ApiErrors { get; } = new(); - public List UpdateErrors { get; } = new(); - } + public bool ApiAvailable { get; set; } = false; + public bool UpdateAvailable { get; set; } = false; + public bool Success { get; set; } = false; + public List ApiErrors { get; } = new(); + public List UpdateErrors { get; } = new(); + } - public class UninstallResult - { - public string? ServiceName { get; set; } + public class UninstallResult + { + public string? ServiceName { get; set; } - public bool Success { get; set; } = false; - public List Errors { get; } = new(); - } + public bool Success { get; set; } = false; + public List Errors { get; } = new(); } } \ No newline at end of file diff --git a/src/Setup/Insight.Setup.Windows/Services/SetupService.cs b/src/Setup/Insight.Setup.Windows/Services/SetupService.cs index 54df73b..547bec9 100644 --- a/src/Setup/Insight.Setup.Windows/Services/SetupService.cs +++ b/src/Setup/Insight.Setup.Windows/Services/SetupService.cs @@ -5,243 +5,242 @@ using Microsoft.Extensions.Logging; using System.Diagnostics; using System.Runtime.Versioning; -namespace Insight.Setup.Services +namespace Insight.Setup.Services; + +[SupportedOSPlatform("windows")] +internal class SetupService : BackgroundService { - [SupportedOSPlatform("windows")] - internal class SetupService : BackgroundService + private readonly Uri _uri; + + private readonly HttpClient _httpClient; + private readonly IHostApplicationLifetime _lifetime; + private readonly ILogger _logger; + + public SetupService(HttpClient httpClient, IHostApplicationLifetime lifetime, IConfiguration configuration, ILogger logger) { - private readonly Uri _uri; + _httpClient = httpClient; + _lifetime = lifetime; + _uri = configuration.GetValue("api") ?? new Uri("https://insight.webmatic.de/api"); //throw new Exception($"api value not set (appsettings)"); + _logger = logger; + } - private readonly HttpClient _httpClient; - private readonly IHostApplicationLifetime _lifetime; - private readonly ILogger _logger; + protected override async Task ExecuteAsync(CancellationToken cancellationToken) + { + _logger.LogTrace("ExecuteAsync"); - public SetupService(HttpClient httpClient, IHostApplicationLifetime lifetime, IConfiguration configuration, ILogger logger) + Console.WriteLine("1: Install"); + Console.WriteLine("2: Update"); + Console.WriteLine("3: Uninstall"); + + Console.WriteLine("\n"); + + var key = Console.ReadKey(); + + Console.Clear(); + + try { - _httpClient = httpClient; - _lifetime = lifetime; - _uri = configuration.GetValue("api") ?? new Uri("https://insight.webmatic.de/api"); //throw new Exception($"api value not set (appsettings)"); - _logger = logger; - } - - protected override async Task ExecuteAsync(CancellationToken cancellationToken) - { - _logger.LogTrace("ExecuteAsync"); - - Console.WriteLine("1: Install"); - Console.WriteLine("2: Update"); - Console.WriteLine("3: Uninstall"); - - Console.WriteLine("\n"); - - var key = Console.ReadKey(); - - Console.Clear(); - - try + switch (key.Key) { - switch (key.Key) - { - case ConsoleKey.NumPad1: - case ConsoleKey.D1: - { - await InstallAsync(cancellationToken); - break; - } - case ConsoleKey.NumPad2: - case ConsoleKey.D2: - { - await UpdateAsync(cancellationToken); - break; - } - case ConsoleKey.NumPad3: - case ConsoleKey.D3: - { - await UninstallAsync(); - break; - } - default: - { - Console.WriteLine("invalid selection"); - break; - } - } - } - catch (Exception ex) - { - Console.WriteLine(ex); - } - finally - { - _lifetime.StopApplication(); - } - } - - private async ValueTask InstallAsync(CancellationToken cancellationToken) - { - Console.WriteLine("Install Runtime"); - await InstallRuntimeAsync(cancellationToken); - - Console.WriteLine("Install ASP Runtime"); - await InstallAspRuntimeAsync(cancellationToken); - - // UPDATER - Console.WriteLine("Install Updater"); - - var updaterResult = await Deployment.Windows.Service.InstallAsync( - _httpClient, - Deploy.GetUpdateHref(_uri, Deploy.Updater.Name), - Deploy.GetAppExecutable(Deploy.Updater.Name), - Deploy.Updater.ServiceName, - Deploy.Updater.Description, - Deploy.Updater.Description, - true, - cancellationToken); - - Console.WriteLine($"Updater: {updaterResult.Success}"); - Console.WriteLine($"Updater: {string.Concat(updaterResult.Errors)}"); - - // AGENT - Console.WriteLine("Install Agent"); - - var agentResult = await Deployment.Windows.Service.InstallAsync( - _httpClient, - Deploy.GetUpdateHref(_uri, Deploy.Agent.Name), - Deploy.GetAppExecutable(Deploy.Agent.Name), - Deploy.Agent.ServiceName, - Deploy.Agent.Description, - Deploy.Agent.Description, - true, - cancellationToken); - - Console.WriteLine($"Agent: {agentResult}"); - Console.WriteLine($"Agent: {string.Concat(agentResult.Errors)}"); - } - - private async ValueTask UpdateAsync(CancellationToken cancellationToken) - { - // UPDATER - Console.WriteLine("Update Updater"); - - var updateResult = await Deployment.Windows.Service.UpdateAsync( - _httpClient, - Deploy.GetUpdateHref(_uri, Deploy.Updater.Name), - Deploy.GetAppExecutable(Deploy.Updater.Name), - Deploy.Updater.ServiceName, - cancellationToken); - - Console.WriteLine($"Result: {updateResult}"); - - // AGENT - Console.WriteLine("Update Agent"); - - var agentResult = await Deployment.Windows.Service.UpdateAsync( - _httpClient, - Deploy.GetUpdateHref(_uri, Deploy.Agent.Name), - Deploy.GetAppExecutable(Deploy.Agent.Name), - Deploy.Agent.ServiceName, - cancellationToken); - - Console.WriteLine($"Result: {agentResult}"); - } - - private static async ValueTask UninstallAsync() - { - // UPDATER - Console.WriteLine("Uninstall Updater"); - - var updaterResult = await Deployment.Windows.Service.UninstallAsync(Deploy.Updater.ServiceName); - Console.WriteLine($"Result: {updaterResult}"); - - // AGENT - Console.WriteLine("Uninstall Agent"); - - var agentResult = await Deployment.Windows.Service.UninstallAsync(Deploy.Agent.ServiceName); - Console.WriteLine($"Result: {agentResult}"); - } - - private async ValueTask InstallRuntimeAsync(CancellationToken cancellationToken) - { - // try get dotnet folders - var coreDirectory = Deploy.Runtime.Core.Directory; - - // Runtime Installation Check... - if (coreDirectory.Exists && coreDirectory.EnumerateDirectories().Any(x => x.Name == Deploy.Runtime.Core.Version)) return; - - // Downloading Runtime... - var queryResult = await _httpClient.GetAsync(Deploy.Runtime.Core.Download, cancellationToken); - - var tempDir = Directory.CreateTempSubdirectory(); - - await File.WriteAllBytesAsync( - $@"{tempDir.FullName}/runtime.exe", - await queryResult.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); - - // Installing Runtime... - var runtimeFile = new FileInfo($@"{tempDir.FullName}/runtime.exe"); - - using var process = new Process() - { - StartInfo = new ProcessStartInfo - { - FileName = runtimeFile.FullName, - ArgumentList = + case ConsoleKey.NumPad1: + case ConsoleKey.D1: { - @"/install", - @"/quiet", - @"/norestart" - }, - UseShellExecute = false, - RedirectStandardOutput = true - } - }; - - process.Start(); - await process.WaitForExitAsync(cancellationToken); - - if (runtimeFile.Exists) runtimeFile.Delete(); - } - - private async ValueTask InstallAspRuntimeAsync(CancellationToken cancellationToken) - { - // try get dotnet folders - var aspDirectory = Deploy.Runtime.Asp.Directory; - - // Runtime Installation Check... - if (aspDirectory.Exists && aspDirectory.EnumerateDirectories().Any(x => x.Name == Deploy.Runtime.Asp.Version)) return; - - // Downloading Runtime... - var queryResult = await _httpClient.GetAsync(Deploy.Runtime.Asp.Download, cancellationToken); - - var tempDir = Directory.CreateTempSubdirectory(); - - await File.WriteAllBytesAsync( - $@"{tempDir.FullName}/runtime.exe", - await queryResult.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); - - // Installing Runtime... - var runtimeFile = new FileInfo($@"{tempDir.FullName}/runtime.exe"); - - using var process = new Process() - { - StartInfo = new ProcessStartInfo - { - FileName = runtimeFile.FullName, - ArgumentList = + await InstallAsync(cancellationToken); + break; + } + case ConsoleKey.NumPad2: + case ConsoleKey.D2: { - @"/install", - @"/quiet", - @"/norestart" - }, - UseShellExecute = false, - RedirectStandardOutput = true - } - }; - - process.Start(); - await process.WaitForExitAsync(cancellationToken); - - if (runtimeFile.Exists) runtimeFile.Delete(); + await UpdateAsync(cancellationToken); + break; + } + case ConsoleKey.NumPad3: + case ConsoleKey.D3: + { + await UninstallAsync(); + break; + } + default: + { + Console.WriteLine("invalid selection"); + break; + } + } + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + finally + { + _lifetime.StopApplication(); } } + + private async ValueTask InstallAsync(CancellationToken cancellationToken) + { + Console.WriteLine("Install Runtime"); + await InstallRuntimeAsync(cancellationToken); + + Console.WriteLine("Install ASP Runtime"); + await InstallAspRuntimeAsync(cancellationToken); + + // UPDATER + Console.WriteLine("Install Updater"); + + var updaterResult = await Deployment.Windows.Service.InstallAsync( + _httpClient, + Deploy.GetUpdateHref(_uri, Deploy.Updater.Name), + Deploy.GetAppExecutable(Deploy.Updater.Name), + Deploy.Updater.ServiceName, + Deploy.Updater.Description, + Deploy.Updater.Description, + true, + cancellationToken); + + Console.WriteLine($"Updater: {updaterResult.Success}"); + Console.WriteLine($"Updater: {string.Concat(updaterResult.Errors)}"); + + // AGENT + Console.WriteLine("Install Agent"); + + var agentResult = await Deployment.Windows.Service.InstallAsync( + _httpClient, + Deploy.GetUpdateHref(_uri, Deploy.Agent.Name), + Deploy.GetAppExecutable(Deploy.Agent.Name), + Deploy.Agent.ServiceName, + Deploy.Agent.Description, + Deploy.Agent.Description, + true, + cancellationToken); + + Console.WriteLine($"Agent: {agentResult}"); + Console.WriteLine($"Agent: {string.Concat(agentResult.Errors)}"); + } + + private async ValueTask UpdateAsync(CancellationToken cancellationToken) + { + // UPDATER + Console.WriteLine("Update Updater"); + + var updateResult = await Deployment.Windows.Service.UpdateAsync( + _httpClient, + Deploy.GetUpdateHref(_uri, Deploy.Updater.Name), + Deploy.GetAppExecutable(Deploy.Updater.Name), + Deploy.Updater.ServiceName, + cancellationToken); + + Console.WriteLine($"Result: {updateResult}"); + + // AGENT + Console.WriteLine("Update Agent"); + + var agentResult = await Deployment.Windows.Service.UpdateAsync( + _httpClient, + Deploy.GetUpdateHref(_uri, Deploy.Agent.Name), + Deploy.GetAppExecutable(Deploy.Agent.Name), + Deploy.Agent.ServiceName, + cancellationToken); + + Console.WriteLine($"Result: {agentResult}"); + } + + private static async ValueTask UninstallAsync() + { + // UPDATER + Console.WriteLine("Uninstall Updater"); + + var updaterResult = await Deployment.Windows.Service.UninstallAsync(Deploy.Updater.ServiceName); + Console.WriteLine($"Result: {updaterResult}"); + + // AGENT + Console.WriteLine("Uninstall Agent"); + + var agentResult = await Deployment.Windows.Service.UninstallAsync(Deploy.Agent.ServiceName); + Console.WriteLine($"Result: {agentResult}"); + } + + private async ValueTask InstallRuntimeAsync(CancellationToken cancellationToken) + { + // try get dotnet folders + var coreDirectory = Deploy.Runtime.Core.Directory; + + // Runtime Installation Check... + if (coreDirectory.Exists && coreDirectory.EnumerateDirectories().Any(x => x.Name == Deploy.Runtime.Core.Version)) return; + + // Downloading Runtime... + var queryResult = await _httpClient.GetAsync(Deploy.Runtime.Core.Download, cancellationToken); + + var tempDir = Directory.CreateTempSubdirectory(); + + await File.WriteAllBytesAsync( + $@"{tempDir.FullName}/runtime.exe", + await queryResult.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); + + // Installing Runtime... + var runtimeFile = new FileInfo($@"{tempDir.FullName}/runtime.exe"); + + using var process = new Process() + { + StartInfo = new ProcessStartInfo + { + FileName = runtimeFile.FullName, + ArgumentList = + { + @"/install", + @"/quiet", + @"/norestart" + }, + UseShellExecute = false, + RedirectStandardOutput = true + } + }; + + process.Start(); + await process.WaitForExitAsync(cancellationToken); + + if (runtimeFile.Exists) runtimeFile.Delete(); + } + + private async ValueTask InstallAspRuntimeAsync(CancellationToken cancellationToken) + { + // try get dotnet folders + var aspDirectory = Deploy.Runtime.Asp.Directory; + + // Runtime Installation Check... + if (aspDirectory.Exists && aspDirectory.EnumerateDirectories().Any(x => x.Name == Deploy.Runtime.Asp.Version)) return; + + // Downloading Runtime... + var queryResult = await _httpClient.GetAsync(Deploy.Runtime.Asp.Download, cancellationToken); + + var tempDir = Directory.CreateTempSubdirectory(); + + await File.WriteAllBytesAsync( + $@"{tempDir.FullName}/runtime.exe", + await queryResult.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); + + // Installing Runtime... + var runtimeFile = new FileInfo($@"{tempDir.FullName}/runtime.exe"); + + using var process = new Process() + { + StartInfo = new ProcessStartInfo + { + FileName = runtimeFile.FullName, + ArgumentList = + { + @"/install", + @"/quiet", + @"/norestart" + }, + UseShellExecute = false, + RedirectStandardOutput = true + } + }; + + process.Start(); + await process.WaitForExitAsync(cancellationToken); + + if (runtimeFile.Exists) runtimeFile.Delete(); + } } \ No newline at end of file diff --git a/src/Updater/Insight.Updater/Constants/Deploy.cs b/src/Updater/Insight.Updater/Constants/Deploy.cs index b285b98..86d9a6d 100644 --- a/src/Updater/Insight.Updater/Constants/Deploy.cs +++ b/src/Updater/Insight.Updater/Constants/Deploy.cs @@ -1,21 +1,20 @@ -namespace Insight.Updater.Constants +namespace Insight.Updater.Constants; + +public static class Deploy { - public static class Deploy + public static class Agent { - public static class Agent - { - public const string Name = "Agent"; - public const string ServiceName = "insight_agent"; - public const string Description = "Insight Agent"; - } - - public static DirectoryInfo GetAppDirectory(string appName) - => new($"{Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)}/Webmatic/Insight/{appName}"); - - public static FileInfo GetAppExecutable(string appName) - => new($"{GetAppDirectory(appName).FullName}/{appName.ToLower()}.exe"); - - public static Uri GetUpdateHref(Uri api, string appName) - => new($"{api.AbsoluteUri}/update/{appName.ToLower()}/windows"); + public const string Name = "Agent"; + public const string ServiceName = "insight_agent"; + public const string Description = "Insight Agent"; } + + public static DirectoryInfo GetAppDirectory(string appName) + => new($"{Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)}/Webmatic/Insight/{appName}"); + + public static FileInfo GetAppExecutable(string appName) + => new($"{GetAppDirectory(appName).FullName}/{appName.ToLower()}.exe"); + + public static Uri GetUpdateHref(Uri api, string appName) + => new($"{api.AbsoluteUri}/update/{appName.ToLower()}/windows"); } \ No newline at end of file diff --git a/src/Updater/Insight.Updater/Program.cs b/src/Updater/Insight.Updater/Program.cs index 892f807..55d2eab 100644 --- a/src/Updater/Insight.Updater/Program.cs +++ b/src/Updater/Insight.Updater/Program.cs @@ -5,53 +5,52 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -namespace Insight.Updater.Windows +namespace Insight.Updater.Windows; + +internal class Program { - internal class Program + public static async Task Main(string[] args) { - public static async Task Main(string[] args) + var builder = Host.CreateDefaultBuilder(args); + builder.UseWindowsService(); + builder.UseSystemd(); + + builder.ConfigureAppConfiguration(options => { - var builder = Host.CreateDefaultBuilder(args); - builder.UseWindowsService(); - builder.UseSystemd(); + options.Sources.Clear(); + options.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); + options.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true); + }); - builder.ConfigureAppConfiguration(options => + builder.ConfigureLogging(options => + { + options.ClearProviders(); + options.SetMinimumLevel(LogLevel.Trace); + + options.AddSimpleConsole(options => { - options.Sources.Clear(); - options.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); - options.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true, reloadOnChange: true); + options.IncludeScopes = true; + options.SingleLine = true; + options.TimestampFormat = "yyyy-MM-dd HH:mm:ss.fff "; }); - builder.ConfigureLogging(options => + options.AddFile($"{Configuration.AppDirectory?.FullName}/" + "logs/updater_{Date}.log", LogLevel.Trace, fileSizeLimitBytes: 104857600, retainedFileCountLimit: 10, outputTemplate: "{Timestamp:o} [{Level:u3}] {Message} {NewLine}{Exception}"); + }); + + builder.ConfigureServices((host, services) => + { + // SERVICES + services.AddHostedService(); + + // GLOBALS + services.AddTransient(provider => new HttpClient(new HttpClientHandler { - options.ClearProviders(); - options.SetMinimumLevel(LogLevel.Trace); + ClientCertificateOptions = ClientCertificateOption.Manual, + ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => true + })); + }); - options.AddSimpleConsole(options => - { - options.IncludeScopes = true; - options.SingleLine = true; - options.TimestampFormat = "yyyy-MM-dd HH:mm:ss.fff "; - }); - - options.AddFile($"{Configuration.AppDirectory?.FullName}/" + "logs/updater_{Date}.log", LogLevel.Trace, fileSizeLimitBytes: 104857600, retainedFileCountLimit: 10, outputTemplate: "{Timestamp:o} [{Level:u3}] {Message} {NewLine}{Exception}"); - }); - - builder.ConfigureServices((host, services) => - { - // SERVICES - services.AddHostedService(); - - // GLOBALS - services.AddTransient(provider => new HttpClient(new HttpClientHandler - { - ClientCertificateOptions = ClientCertificateOption.Manual, - ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => true - })); - }); - - var host = builder.Build(); - await host.RunAsync().ConfigureAwait(false); - } + var host = builder.Build(); + await host.RunAsync().ConfigureAwait(false); } } \ No newline at end of file diff --git a/src/Updater/Insight.Updater/Services/UpdateService.cs b/src/Updater/Insight.Updater/Services/UpdateService.cs index e88c598..c2935b7 100644 --- a/src/Updater/Insight.Updater/Services/UpdateService.cs +++ b/src/Updater/Insight.Updater/Services/UpdateService.cs @@ -10,351 +10,350 @@ using System.Runtime.Versioning; using System.ServiceProcess; using System.Text.Json; -namespace Insight.Updater.Services +namespace Insight.Updater.Services; + +public class UpdateService : BackgroundService { - public class UpdateService : BackgroundService + private readonly Uri _uri; + + private readonly HttpClient _httpClient; + private readonly ILogger _logger; + + public UpdateService(HttpClient httpClient, IConfiguration configuration, ILogger logger) { - private readonly Uri _uri; + _httpClient = httpClient; + _uri = configuration.GetValue("api") ?? throw new Exception($"api value not set (appsettings)"); + _logger = logger; + } - private readonly HttpClient _httpClient; - private readonly ILogger _logger; + protected override async Task ExecuteAsync(CancellationToken cancellationToken) + { + _logger.LogTrace("ExecuteAsync"); - public UpdateService(HttpClient httpClient, IConfiguration configuration, ILogger logger) + while (cancellationToken.IsCancellationRequested is false) { - _httpClient = httpClient; - _uri = configuration.GetValue("api") ?? throw new Exception($"api value not set (appsettings)"); - _logger = logger; + try + { + UpdateResult? result = null; + + if (OperatingSystem.IsWindows()) result = await WindowsUpdateAsync(cancellationToken); + if (OperatingSystem.IsLinux()) result = await LinuxUpdateAsync(cancellationToken); + + _logger.LogInformation("Update Result: {result}", result?.Success); + if (result?.UpdateErrors is not null) + { + _logger.LogError("Update Errors: {errors}", string.Concat(result?.UpdateErrors)); + } + } + catch (OperationCanceledException) { } + catch (Exception ex) // may inform via client / api about errors + { + _logger.LogError("{ex}", ex.Message); + } + finally + { + await Task.Delay(TimeSpan.FromMinutes(1), cancellationToken); + } } + } - protected override async Task ExecuteAsync(CancellationToken cancellationToken) + [SupportedOSPlatform("windows")] + private async ValueTask WindowsUpdateAsync(CancellationToken cancellationToken) + { + return await Windows.Service.UpdateAsync( + _httpClient, + Deploy.GetUpdateHref(_uri, Deploy.Agent.Name), + Deploy.GetAppExecutable(Deploy.Agent.Name), + Deploy.Agent.ServiceName, + cancellationToken); + } + + [SupportedOSPlatform("linux")] + private ValueTask LinuxUpdateAsync(CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } + + [SupportedOSPlatform("windows")] + private static class Windows + { + public static class Service { - _logger.LogTrace("ExecuteAsync"); - - while (cancellationToken.IsCancellationRequested is false) + private static bool ServiceExistence(string serviceName) { try { - UpdateResult? result = null; + if (ServiceController.GetServices().Any(s => s.ServiceName.Equals(serviceName, StringComparison.InvariantCultureIgnoreCase))) return true; + return false; + } + catch (Exception) { } - if (OperatingSystem.IsWindows()) result = await WindowsUpdateAsync(cancellationToken); - if (OperatingSystem.IsLinux()) result = await LinuxUpdateAsync(cancellationToken); - - _logger.LogInformation("Update Result: {result}", result?.Success); - if (result?.UpdateErrors is not null) - { - _logger.LogError("Update Errors: {errors}", string.Concat(result?.UpdateErrors)); - } - } - catch (OperationCanceledException) { } - catch (Exception ex) // may inform via client / api about errors - { - _logger.LogError("{ex}", ex.Message); - } - finally - { - await Task.Delay(TimeSpan.FromMinutes(1), cancellationToken); - } + return false; } - } - [SupportedOSPlatform("windows")] - private async ValueTask WindowsUpdateAsync(CancellationToken cancellationToken) - { - return await Windows.Service.UpdateAsync( - _httpClient, - Deploy.GetUpdateHref(_uri, Deploy.Agent.Name), - Deploy.GetAppExecutable(Deploy.Agent.Name), - Deploy.Agent.ServiceName, - cancellationToken); - } - - [SupportedOSPlatform("linux")] - private ValueTask LinuxUpdateAsync(CancellationToken cancellationToken) - { - throw new NotImplementedException(); - } - - [SupportedOSPlatform("windows")] - private static class Windows - { - public static class Service + private static bool SetServiceState(string app, ServiceControllerStatus status, TimeSpan timeout) { - private static bool ServiceExistence(string serviceName) + try { - try + using var sc = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName.Equals(app, StringComparison.InvariantCultureIgnoreCase)); + if (sc is null) return false; + + if (sc.Status != status) { - if (ServiceController.GetServices().Any(s => s.ServiceName.Equals(serviceName, StringComparison.InvariantCultureIgnoreCase))) return true; - return false; + switch (status) + { + case ServiceControllerStatus.Running: + sc.Start(); + break; + + case ServiceControllerStatus.Stopped: + sc.Stop(); + break; + } + + sc.WaitForStatus(status, timeout); } - catch (Exception) { } - return false; + return true; } + catch (Exception) { } - private static bool SetServiceState(string app, ServiceControllerStatus status, TimeSpan timeout) + return false; + } + + public static async ValueTask UpdateAsync(HttpClient httpClient, Uri api, FileInfo bin, string serviceName, CancellationToken cancellationToken) + { + var result = new UpdateResult { - try + Api = api?.ToString(), + SourceDirectory = bin.Directory?.FullName, + App = bin.Name, + ServiceName = serviceName + }; + + try + { + // check if service exists + if (ServiceExistence(serviceName) is false) { - using var sc = ServiceController.GetServices().FirstOrDefault(s => s.ServiceName.Equals(app, StringComparison.InvariantCultureIgnoreCase)); - if (sc is null) return false; - - if (sc.Status != status) - { - switch (status) - { - case ServiceControllerStatus.Running: - sc.Start(); - break; - - case ServiceControllerStatus.Stopped: - sc.Stop(); - break; - } - - sc.WaitForStatus(status, timeout); - } - - return true; + result.UpdateErrors.Add("service not found"); + return result; } - catch (Exception) { } - return false; - } - - public static async ValueTask UpdateAsync(HttpClient httpClient, Uri api, FileInfo bin, string serviceName, CancellationToken cancellationToken) - { - var result = new UpdateResult + // get service update details + var response = await httpClient.GetFromJsonAsync(api, cancellationToken); + if (response is null) { - Api = api?.ToString(), - SourceDirectory = bin.Directory?.FullName, - App = bin.Name, - ServiceName = serviceName - }; + result.ApiErrors.Add("not available / response null"); + return result; + } - try + result.ApiAvailable = true; + + // check if local binary exists + if (bin is null) { - // check if service exists - if (ServiceExistence(serviceName) is false) - { - result.UpdateErrors.Add("service not found"); - return result; - } + result.UpdateErrors.Add("source binary not found"); + return result; + } - // get service update details - var response = await httpClient.GetFromJsonAsync(api, cancellationToken); - if (response is null) - { - result.ApiErrors.Add("not available / response null"); - return result; - } - - result.ApiAvailable = true; - - // check if local binary exists - if (bin is null) - { - result.UpdateErrors.Add("source binary not found"); - return result; - } - - // get local file binary version - if (FileVersionInfo.GetVersionInfo(bin.FullName).FileVersion is not string binVersionString) - { - result.UpdateErrors.Add("source binary fileversion not valid"); - return result; - } - - // compare local against update version, skip lower or equal update version - var actualVersion = Version.Parse(binVersionString); - if (actualVersion >= response.Version) - { - result.Success = true; - return result; - } - else - { - result.UpdateAvailable = true; - } - - // get update file (bytes) to memory - using var update = await httpClient.GetAsync(response.Uri, cancellationToken); - if (update is null) - { - result.ApiErrors.Add("update source not available"); - return result; - } - - // stop service - if (SetServiceState(serviceName, ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10)) is false) - { - result.UpdateErrors.Add("service control failed / failed to stop service"); - return result; - } - - // read update archive to temp (overwrite) - var temp = Directory.CreateTempSubdirectory(); - var updateFile = new FileInfo($@"{temp.FullName}/{bin.Name}.zip"); - - await File.WriteAllBytesAsync(updateFile.FullName, await update.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); - - // extract update archive from temp to app dir (overwrite) - ZipFile.ExtractToDirectory(updateFile.FullName, bin.Directory?.FullName, true); - - // delete temp folder - if (temp.Exists) temp.Delete(true); - - // start updateds service - if (SetServiceState(serviceName, ServiceControllerStatus.Running, TimeSpan.FromSeconds(10)) is false) - { - result.UpdateErrors.Add("service control failed / failed to start service"); - return result; - } + // get local file binary version + if (FileVersionInfo.GetVersionInfo(bin.FullName).FileVersion is not string binVersionString) + { + result.UpdateErrors.Add("source binary fileversion not valid"); + return result; + } + // compare local against update version, skip lower or equal update version + var actualVersion = Version.Parse(binVersionString); + if (actualVersion >= response.Version) + { result.Success = true; + return result; } - catch (Exception ex) + else { - result.UpdateErrors.Add(ex.Message); + result.UpdateAvailable = true; } - return result; + // get update file (bytes) to memory + using var update = await httpClient.GetAsync(response.Uri, cancellationToken); + if (update is null) + { + result.ApiErrors.Add("update source not available"); + return result; + } + + // stop service + if (SetServiceState(serviceName, ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10)) is false) + { + result.UpdateErrors.Add("service control failed / failed to stop service"); + return result; + } + + // read update archive to temp (overwrite) + var temp = Directory.CreateTempSubdirectory(); + var updateFile = new FileInfo($@"{temp.FullName}/{bin.Name}.zip"); + + await File.WriteAllBytesAsync(updateFile.FullName, await update.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); + + // extract update archive from temp to app dir (overwrite) + ZipFile.ExtractToDirectory(updateFile.FullName, bin.Directory?.FullName, true); + + // delete temp folder + if (temp.Exists) temp.Delete(true); + + // start updateds service + if (SetServiceState(serviceName, ServiceControllerStatus.Running, TimeSpan.FromSeconds(10)) is false) + { + result.UpdateErrors.Add("service control failed / failed to start service"); + return result; + } + + result.Success = true; } + catch (Exception ex) + { + result.UpdateErrors.Add(ex.Message); + } + + return result; + } + } + + public static class Process + { + public static bool IsRunning(FileInfo bin) + { + if (bin.Exists is false) return false; + + var matched = System.Diagnostics.Process.GetProcessesByName(bin.FullName); + + if (matched is null || matched.Any() is false) return false; + + if (matched.Any(p => + p.MainModule is not null && + p.MainModule.FileName is not null && + p.MainModule.FileName.Equals(bin.FullName, + StringComparison.InvariantCultureIgnoreCase))) return true; + + return false; } - public static class Process + public static bool Start(FileInfo binary) { - public static bool IsRunning(FileInfo bin) + try { - if (bin.Exists is false) return false; + if (IsRunning(binary) is false) return false; - var matched = System.Diagnostics.Process.GetProcessesByName(bin.FullName); - - if (matched is null || matched.Any() is false) return false; - - if (matched.Any(p => - p.MainModule is not null && - p.MainModule.FileName is not null && - p.MainModule.FileName.Equals(bin.FullName, - StringComparison.InvariantCultureIgnoreCase))) return true; - - return false; + using var process = System.Diagnostics.Process.Start(binary.FullName); + return true; } + catch (Exception) { } - public static bool Start(FileInfo binary) - { - try - { - if (IsRunning(binary) is false) return false; + return false; + } - using var process = System.Diagnostics.Process.Start(binary.FullName); - return true; - } - catch (Exception) { } - - return false; - } - - public static bool Stop(FileInfo bin, TimeSpan timeout) - { - try - { - if (IsRunning(bin) is false) return false; - - var matched = System.Diagnostics.Process.GetProcessesByName(bin.FullName); - - if (matched is null || matched.Any() is false) return true; - - foreach (var procsInfo in matched.Where(p => - p.MainModule is not null && - p.MainModule.FileName is not null && - p.MainModule.FileName.Equals(bin.FullName, StringComparison.InvariantCultureIgnoreCase))) - { - if (procsInfo.CloseMainWindow()) procsInfo.WaitForExit((int)timeout.TotalMilliseconds); - if (procsInfo.HasExited is false) procsInfo.Kill(true); - } - - return true; - } - catch (Exception) { } - - return false; - } - - public static async ValueTask UpdateAsync(HttpClient httpClient, Uri api, FileInfo bin, CancellationToken cancellationToken) + public static bool Stop(FileInfo bin, TimeSpan timeout) + { + try { if (IsRunning(bin) is false) return false; - var response = await httpClient.GetFromJsonAsync(api.AbsoluteUri, new JsonSerializerOptions + var matched = System.Diagnostics.Process.GetProcessesByName(bin.FullName); + + if (matched is null || matched.Any() is false) return true; + + foreach (var procsInfo in matched.Where(p => + p.MainModule is not null && + p.MainModule.FileName is not null && + p.MainModule.FileName.Equals(bin.FullName, StringComparison.InvariantCultureIgnoreCase))) { - IncludeFields = true - }, cancellationToken); - - if (response is null) return false; - - Version actualVersion; - - if (FileVersionInfo.GetVersionInfo(bin.FullName).FileVersion is not string binVersionString) return false; - - try - { - actualVersion = Version.Parse(binVersionString); - if (actualVersion >= response.Version) return false; - - using var update = await httpClient.GetAsync(response.Uri, cancellationToken); - if (update is null) return false; - - Stop(bin, TimeSpan.FromSeconds(60)); - - // read update archive to temp (overwrite) - var temp = Directory.CreateTempSubdirectory(); - var updateFile = new FileInfo($@"{temp.FullName}/{bin.Name}.zip"); - - await File.WriteAllBytesAsync(updateFile.FullName, await update.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); - - // extract update archive from temp to app dir (overwrite) - ZipFile.ExtractToDirectory(updateFile.FullName, bin.Directory?.FullName, true); - - // delete temp folder - if (temp.Exists) temp.Delete(true); - - // rewrite with options to start user session process - //Start(app, directory, TimeSpan.FromSeconds(60)); - - return true; + if (procsInfo.CloseMainWindow()) procsInfo.WaitForExit((int)timeout.TotalMilliseconds); + if (procsInfo.HasExited is false) procsInfo.Kill(true); } - catch (Exception) { } - return false; + return true; } + catch (Exception) { } - public static bool Delete(FileInfo bin, TimeSpan timeout) + return false; + } + + public static async ValueTask UpdateAsync(HttpClient httpClient, Uri api, FileInfo bin, CancellationToken cancellationToken) + { + if (IsRunning(bin) is false) return false; + + var response = await httpClient.GetFromJsonAsync(api.AbsoluteUri, new JsonSerializerOptions { - try - { - Stop(bin, timeout); - bin.Delete(); + IncludeFields = true + }, cancellationToken); - return true; - } - catch (Exception) { } + if (response is null) return false; - return false; + Version actualVersion; + + if (FileVersionInfo.GetVersionInfo(bin.FullName).FileVersion is not string binVersionString) return false; + + try + { + actualVersion = Version.Parse(binVersionString); + if (actualVersion >= response.Version) return false; + + using var update = await httpClient.GetAsync(response.Uri, cancellationToken); + if (update is null) return false; + + Stop(bin, TimeSpan.FromSeconds(60)); + + // read update archive to temp (overwrite) + var temp = Directory.CreateTempSubdirectory(); + var updateFile = new FileInfo($@"{temp.FullName}/{bin.Name}.zip"); + + await File.WriteAllBytesAsync(updateFile.FullName, await update.Content.ReadAsByteArrayAsync(cancellationToken), cancellationToken); + + // extract update archive from temp to app dir (overwrite) + ZipFile.ExtractToDirectory(updateFile.FullName, bin.Directory?.FullName, true); + + // delete temp folder + if (temp.Exists) temp.Delete(true); + + // rewrite with options to start user session process + //Start(app, directory, TimeSpan.FromSeconds(60)); + + return true; } + catch (Exception) { } + + return false; + } + + public static bool Delete(FileInfo bin, TimeSpan timeout) + { + try + { + Stop(bin, timeout); + bin.Delete(); + + return true; + } + catch (Exception) { } + + return false; } } + } - public class UpdateResult - { - public string? Api { get; set; } - public string? SourceDirectory { get; set; } - public string? App { get; set; } - public string? ServiceName { get; set; } + public class UpdateResult + { + public string? Api { get; set; } + public string? SourceDirectory { get; set; } + public string? App { get; set; } + public string? ServiceName { get; set; } - public bool ApiAvailable { get; set; } = false; - public bool UpdateAvailable { get; set; } = false; - public bool Success { get; set; } = false; - public List ApiErrors { get; } = new(); - public List UpdateErrors { get; } = new(); - } + public bool ApiAvailable { get; set; } = false; + public bool UpdateAvailable { get; set; } = false; + public bool Success { get; set; } = false; + public List ApiErrors { get; } = new(); + public List UpdateErrors { get; } = new(); } } \ No newline at end of file diff --git a/src/Web/Insight.Web/Program.cs b/src/Web/Insight.Web/Program.cs index bd280d7..923a770 100644 --- a/src/Web/Insight.Web/Program.cs +++ b/src/Web/Insight.Web/Program.cs @@ -12,7 +12,7 @@ using Vaitr.Network.Hosting; namespace Insight.Web; -public class Program +internal class Program { public static async Task Main(string[] args) {