using Insight.Domain.Interfaces; using Insight.Domain.Messages; using Insight.Domain.Messages.Agent; using System.Runtime.Versioning; using System.Text.RegularExpressions; using WUApiLib; using static Insight.Domain.Messages.Agent.Update; namespace Insight.Agent.Network.Handlers; [SupportedOSPlatform("windows")] public class UpdateHandler : IMessageHandler { public async ValueTask HandleAsync(AgentSession sender, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage { if (message is InventoryRequest) { await sender.SendAsync(GetUpdates(), cancellationToken); } } private static UpdateList GetUpdates() { return new UpdateList { Installed = QueryInstalledUpdates(), Pending = QueryPendingUpdates() }; } private static List QueryInstalledUpdates() { var updates = new List(); var session = new UpdateSessionClass(); var searcher = session.CreateUpdateSearcher(); searcher.Online = false; var count = searcher.GetTotalHistoryCount(); var result = searcher.QueryHistory(0, count); foreach (IUpdateHistoryEntry wupdate in result) { var update = new Update { Id = wupdate.UpdateIdentity.UpdateID, Date = wupdate.Date, Name = wupdate.Title, Description = wupdate.Description, Result = wupdate.ResultCode switch { OperationResultCode.orcNotStarted => OsUpdateResultCodeEnum.NotStarted, OperationResultCode.orcInProgress => OsUpdateResultCodeEnum.InProgress, OperationResultCode.orcSucceeded => OsUpdateResultCodeEnum.Succeeded, OperationResultCode.orcSucceededWithErrors => OsUpdateResultCodeEnum.SucceededWithErrors, OperationResultCode.orcFailed => OsUpdateResultCodeEnum.Failed, OperationResultCode.orcAborted => OsUpdateResultCodeEnum.Aborted, _ => null }, SupportUrl = wupdate.SupportUrl, }; try { var rx = new Regex(@"KB(\d+)"); update.Hotfix = rx.Match(wupdate.Title).Value; } catch (Exception) { } updates.Add(update); } return updates; } private static List QueryPendingUpdates() { var updates = new List(); var session = new UpdateSessionClass(); var searcher = session.CreateUpdateSearcher(); searcher.Online = true; var result = searcher.Search("IsInstalled=0"); foreach (IUpdate wupdate in result.Updates) { var update = new Update { Id = wupdate.Identity.UpdateID, Type = wupdate.Type switch { UpdateType.utSoftware => OsUpdateTypeEnum.Software, UpdateType.utDriver => OsUpdateTypeEnum.Driver, _ => null }, Date = wupdate.LastDeploymentChangeTime, Name = wupdate.Title, Description = wupdate.Description, SupportUrl = wupdate.SupportUrl, Size = wupdate.MaxDownloadSize, IsDownloaded = wupdate.IsDownloaded, CanRequestUserInput = wupdate.InstallationBehavior.CanRequestUserInput, RebootBehavior = wupdate.InstallationBehavior.RebootBehavior switch { InstallationRebootBehavior.irbNeverReboots => OsUpdateRebootBehaviorEnum.NeverReboots, InstallationRebootBehavior.irbAlwaysRequiresReboot => OsUpdateRebootBehaviorEnum.AlwaysRequiresReboot, InstallationRebootBehavior.irbCanRequestReboot => OsUpdateRebootBehaviorEnum.CanRequestReboot, _ => null }, }; if (wupdate.KBArticleIDs.Count > 0) { foreach (var id in wupdate.KBArticleIDs) { update.Hotfix = $"KB{id}"; break; } } updates.Add(update); } return updates; } }