using C4IT.F4SD.DisplayFormatting; using C4IT.F4SD.SupportCaseProtocoll.Models; using C4IT.FASD.Base; using C4IT.FASD.Cockpit.Communication; using C4IT.Logging; using C4IT.MultiLanguage; using FasdCockpitBase.Models; using FasdDesktopUi.Basics.Models; using FasdDesktopUi.Basics.Services.ProtocollService; using FasdDesktopUi.Basics.UserControls; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; using static C4IT.Logging.cLogManager; using static FasdDesktopUi.Basics.UserControls.QuickActionStatusMonitor; namespace FasdDesktopUi.Basics.UiActions { public class cUiServerQuickAction : cUiQuickAction { public cF4sdQuickActionServer ServerQuickAction { get; set; } public cUiServerQuickAction(cF4sdQuickActionServer quickAction) : base(quickAction) { ServerQuickAction = quickAction; Name = quickAction.Names.GetValue(); } public override async Task GetQuickActionStatusMonitorDataAsync() { await Task.CompletedTask; return new cQuickActionStatusMonitorModel() { ActionName = ServerQuickAction.Names.GetValue(), QuickActionDefinition = ServerQuickAction, ActionSteps = new List() { new cQuickActionStatusMonitorModel.cQuickActionStep(cMultiLanguageSupport.GetItem("QuickAction.Remote.Running"), ServerQuickAction.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.running) }, QuickActionParameters = ServerQuickAction.AdjustableParameters, RunQuickAction = ProcessActionAsync }; } public override async Task GetQuickActionDataAsync(cSupportCaseDataProvider dataProvider, bool isDetailedLayout) { DataProvider = dataProvider; var detailedDataQuickActionHistory = new cDetailedDataModel() { Heading = cMultiLanguageSupport.GetItem("DetailsPage.History"), FullDetailedData = new List() { new List() { "Status", cMultiLanguageSupport.GetItem("QuickAction.Revision.ExecutionTime") } } }; //Get QuickAciton Data if (dataProvider != null) { var quickActionHistory = await dataProvider.QuickActionProtocollHelper.GetQuickActionHistoryAsync(ServerQuickAction.Name); if (quickActionHistory != null) detailedDataQuickActionHistory.FullDetailedData.AddRange(quickActionHistory); } //Get Process Steps of Action var quickActionData = await GetQuickActionStatusMonitorDataAsync(); //Get Recommendation cRecommendationDataModel recommendationData = QuickActionRecommendation?.Recommendation != null ? QuickActionRecommendation : null; return new cDataCanvasDataModel() { DetailedData = detailedDataQuickActionHistory, QuickActionStatusMonitorData = quickActionData, RecommendationData = recommendationData }; } private cF4sdQuickActionRevision GetRevisionOutput(cExternalToolExecutorEnh.cProcessResult _result) { var retVal = new cF4sdQuickActionRevision() { Status = enumQuickActionRevisionStatus.unknown }; try { if (!string.IsNullOrEmpty(_result.StandardOutput)) { retVal.OutputText = _result.StandardOutput; if (retVal.Output != null) { if (retVal.Output.ErrorCode is null || retVal.Output.ErrorCode == 0) retVal.Status = enumQuickActionRevisionStatus.finishedSuccessfull; else retVal.Status = enumQuickActionRevisionStatus.finishedWithError; } } if (retVal.Status == enumQuickActionRevisionStatus.unknown) { if (_result.ReturnCode != 0 || !string.IsNullOrEmpty(_result.StandardError)) { retVal.Status = enumQuickActionRevisionStatus.finishedWithError; retVal.Output = new cF4sdQuickActionRevision.cOutput() { ErrorCode = _result.ReturnCode, ErrorDescription = _result.StandardError }; } else retVal.Status = enumQuickActionRevisionStatus.finishedSuccessfull; } } catch (Exception E) { LogException(E); } return retVal; } public override async Task> ProcessActionAsync(CancellationToken token, Dictionary ParameterDictionary = null) { try { var startTime = DateTime.UtcNow; var _actionResult = await Task.Run(async () => { return await cExternalToolExecutorEnh.StartServerActionAsync(ServerQuickAction, DataProvider, cMultiLanguageSupport.GetItem("RemoteTool.Credentials.PasswordRequest"), ParameterDictionary); }); cQuickActionOutput quickActionOutput = new cQuickActionOutputSingle(new cF4sdQuickActionRevision.cOutput() { ResultCode = enumQuickActionSuccess.unknown }); ; cQuickActionOutput protocollOutput = new cQuickActionOutputSingle(new cF4sdQuickActionRevision.cOutput() { ResultCode = enumQuickActionSuccess.unknown }); ; List output = new List(); if (!token.IsCancellationRequested) { var ResultRevision = GetRevisionOutput(_actionResult); cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(StatusMonitor.QuickActionData.ActionSteps, ServerQuickAction.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.running, enumQuickActionRevisionStatus.finishedSuccessfull); cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(StatusMonitor.QuickActionData.ActionSteps, ServerQuickAction.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.main, enumQuickActionRevisionStatus.finishedSuccessfull); if (!string.IsNullOrEmpty(_actionResult.StandardOutput)) try { dynamic retValue = Newtonsoft.Json.JsonConvert.DeserializeObject(_actionResult.StandardOutput); var _output = new cF4sdQuickActionRevision.cOutput() { ResultCode = enumQuickActionSuccess.finished, Values = retValue }; ResultRevision.OutputText = JsonConvert.SerializeObject(_output); } catch { } if (ResultRevision.Output == null) quickActionOutput = new cQuickActionOutputSingle(new cF4sdQuickActionRevision.cOutput() { ResultCode = enumQuickActionSuccess.finished }); else { StatusMonitor.QuickActionOutputs.Add(ResultRevision.Output); quickActionOutput = cQuickActionOutput.GetQuickActionOutput(ResultRevision.Output, DataProvider); } if (cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ProtocollLanguage != null) { string tempLang = cMultiLanguageSupport.CurrentLanguage; cMultiLanguageSupport.CurrentLanguage = cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ProtocollLanguage; if (ResultRevision.Output == null) protocollOutput = new cQuickActionOutputSingle(new cF4sdQuickActionRevision.cOutput() { ResultCode = enumQuickActionSuccess.finished }); else protocollOutput = cQuickActionOutput.GetQuickActionOutput(ResultRevision.Output, DataProvider); cMultiLanguageSupport.CurrentLanguage = tempLang; } cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(ServerQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues); QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(ServerQuickAction, copyData); F4SDProtocoll.Instance.Add(protocollEntry); string quickActionStatus; switch (ResultRevision.Status) { case enumQuickActionRevisionStatus.inProgress: quickActionStatus = cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.InProgress"); break; case enumQuickActionRevisionStatus.finishedSuccessfull: quickActionStatus = cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"); break; case enumQuickActionRevisionStatus.finishedWithError: quickActionStatus = cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"); break; case enumQuickActionRevisionStatus.unknown: default: quickActionStatus = cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Unknown"); break; } output = new List() { quickActionStatus, cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } else { cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(StatusMonitor.QuickActionData.ActionSteps, ServerQuickAction.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.main, enumQuickActionRevisionStatus.canceled); cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(StatusMonitor.QuickActionData.ActionSteps, ServerQuickAction.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.running, enumQuickActionRevisionStatus.canceled); quickActionOutput = new cQuickActionOutputSingle(new cF4sdQuickActionRevision.cOutput() { ResultCode = enumQuickActionSuccess.error, ErrorDescription = cMultiLanguageSupport.GetItem("QuickAction.Copy.Output.Cancel") }); if (cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ProtocollLanguage != null) { string tempLang = cMultiLanguageSupport.CurrentLanguage; cMultiLanguageSupport.CurrentLanguage = cF4SDCockpitXmlConfig.Instance.HealthCardConfig.ProtocollLanguage; protocollOutput = new cQuickActionOutputSingle(new cF4sdQuickActionRevision.cOutput() { ResultCode = enumQuickActionSuccess.error, ErrorDescription = cMultiLanguageSupport.GetItem("QuickAction.Copy.Output.Cancel") }); cMultiLanguageSupport.CurrentLanguage = tempLang; } cQuickActionCopyData copyData = QuickActionProtocollEntryOutput.GetCopyData(ServerQuickAction, DataProvider, false, protocollOutput, StatusMonitor.MeasureValues); QuickActionProtocollEntry protocollEntry = QuickActionProtocollEntryOutput.GetQuickActionProtocollEntry(ServerQuickAction, copyData); F4SDProtocoll.Instance.Add(protocollEntry); output = new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } _ = Task.Run(async () => { try { Guid? userId = DataProvider?.Identities?.FirstOrDefault(identity => identity.Class == enumFasdInformationClass.User)?.Id; Guid? computerId = DataProvider?.Identities?.FirstOrDefault(identity => identity.Class == enumFasdInformationClass.Computer)?.Id; var reportQuickActionParameter = new cF4SDQuickActionParameters() { CaseId = DataProvider.CaseId, QuickActionId = ServerQuickAction.Id, QuickActionName = ServerQuickAction.Name, Paramaters = ParameterDictionary is null ? null : JsonConvert.SerializeObject(ParameterDictionary, Formatting.None), Result = JsonConvert.SerializeObject(quickActionOutput.ResultCode.GetValueOrDefault().ToString(), Formatting.None), ErrorCode = quickActionOutput.ErrorCode, ErrorDescription = quickActionOutput.ErrorDescription, Start = startTime, Finish = DateTime.UtcNow, UserId = userId, DeviceId = computerId, ExecutionType = ServerQuickAction.ExecutionType, ResultType = ServerQuickAction.ResultType }; var reportedQuickActionSuccessfully = await cFasdCockpitCommunicationBase.Instance.ReportQuickAction(reportQuickActionParameter); if (reportedQuickActionSuccessfully is false) LogEntry($"Failed to report QuickAction '{ServerQuickAction.Name}' for case '{reportQuickActionParameter.CaseId}' to Analytics.", LogLevels.Warning); } catch (Exception E) { LogException(E); } }); return output; } catch (Exception E) { LogException(E); return new List() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) }; } } } }