Files
Meik 0b52999b1d feat: expand cockpit integrations and support workflows
Add Phoenix remote desktop, action connector, documentation engine, and gamification support. Refactor support-case processing and search/action UI, and update installer assets and dependencies.
2026-07-13 11:16:53 +02:00

172 lines
10 KiB
C#

using C4IT.F4SD.DisplayFormatting;
using C4IT.FASD.Base;
using C4IT.MultiLanguage;
using FasdCockpitBase.Models.RemoteDesktopConnection;
using FasdCockpitCommunication.RemoteDesktopCommunication;
using FasdDesktopUi.Basics.Models;
using FasdDesktopUi.Basics.Services.RemoteDesktop;
using FasdDesktopUi.Basics.UserControls;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using static C4IT.Logging.cLogManager;
namespace FasdDesktopUi.Basics.UiActions.NativeActions
{
internal class RemoteConnectionAction
{
internal const string NativeActionName = "StartAgentRemoteConnection";
internal static void UpdatePrerequesites(FasdNativeQuickAction nativeQuickAction)
{
nativeQuickAction.CheckFilePath = AgentRemoteDesktopService.GetViewerPath();
}
internal static cDataCanvasDataModel GetQuickActionData(cFasdQuickAction quickActionConfig, cQuickActionStatusMonitorModel.RunQuickActionDelegate quickAction)
{
var detailedDataQuickActionHistory = new cDetailedDataModel()
{
Heading = cMultiLanguageSupport.GetItem("DetailsPage.History"),
FullDetailedData = new List<object>() { new List<object>() { "Status", cMultiLanguageSupport.GetItem("QuickAction.Revision.ExecutionTime") } }
};
return new cDataCanvasDataModel()
{
RecommendationData = null,
QuickActionStatusMonitorData = new cQuickActionStatusMonitorModel()
{
ActionName = quickActionConfig.Names.GetValue(),
ActionSteps = new List<cQuickActionStatusMonitorModel.cQuickActionStep>()
{
new cQuickActionStatusMonitorModel.cQuickActionStep(cMultiLanguageSupport.GetItem("QuickAction.Remote.UserAcceptance"), quickActionConfig.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance),
new cQuickActionStatusMonitorModel.cQuickActionStep(cMultiLanguageSupport.GetItem("QuickAction.Phoenix.StartViewer"), quickActionConfig.Name, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.running)
},
QuickActionDefinition = quickActionConfig,
RunQuickAction = quickAction
},
DetailedData = detailedDataQuickActionHistory,
};
}
private static bool TryGetNamedParameterValue(cNamedParameterList namedParameters, string namedParameterName, string quickActionName, QuickActionStatusMonitor statusMonitor, out int namedParameterValue)
{
namedParameterValue = -1;
bool hasNamedParameterValue = true;
if (!namedParameters.TryGetValue(namedParameterName, out var namedParameter))
{
cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor.QuickActionData.ActionSteps);
statusMonitor.QuickActionOutputs.Add(new cF4sdQuickActionRevision.cOutput() { Values = $"Named parameter \"{namedParameterName}\" is missing. Try to refresh data." });
hasNamedParameterValue = false;
}
if (!int.TryParse(namedParameter.GetValue(), out namedParameterValue))
{
cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor.QuickActionData.ActionSteps);
statusMonitor.QuickActionOutputs.Add(new cF4sdQuickActionRevision.cOutput() { Values = $"Named parameter \"{namedParameterName}\" is missing. Try to refresh data." });
hasNamedParameterValue = false;
}
return hasNamedParameterValue;
}
private static bool TryGetClientInfo(string quickActionName, QuickActionStatusMonitor statusMonitor, cNamedParameterList namedParameters, out AgentRemoteClientInfo clientInfo)
{
clientInfo = null;
try
{
bool hasClientInfo = true;
if (!TryGetNamedParameterValue(namedParameters, "AgentUserId", quickActionName, statusMonitor, out var userId))
hasClientInfo = false;
if (!TryGetNamedParameterValue(namedParameters, "AgentDeviceId", quickActionName, statusMonitor, out var deviceId))
hasClientInfo = false;
int? organizationId = cCockpitConfiguration.Instance?.agentApiConfiguration?.OrganizationCode;
if (organizationId is null)
{
cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor.QuickActionData.ActionSteps);
hasClientInfo = false;
}
clientInfo = new AgentRemoteClientInfo() { AccountCode = userId, DeviceCode = deviceId, OrganisationCode = organizationId.Value };
return hasClientInfo;
}
catch (Exception ex)
{
LogException(ex);
return false;
}
}
internal static async Task<List<object>> RunQuickAction(string quickActionName, QuickActionStatusMonitor statusMonitor, cNamedParameterList namedParameters, CancellationToken token)
{
try
{
statusMonitor.QuickActionOutputs.Clear();
var errorOutput = new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
if (!TryGetClientInfo(quickActionName, statusMonitor, namedParameters, out var clientInfo))
return errorOutput;
AgentRemoteDesktopService.RemoteConnetionStatusChanged += HandleConnectionStatusChanged;
RemoteDesktopConnectionStatusResult connectionStatus = await AgentRemoteDesktopService.StartRemoteDesktopConnectionAsync(clientInfo, true, token);
switch (connectionStatus.Status)
{
case RemoteDesktopConnectionStatus.Accepted:
case RemoteDesktopConnectionStatus.Connected:
case RemoteDesktopConnectionStatus.Finished:
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedSuccessfull);
return new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedSuccessfull"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
case RemoteDesktopConnectionStatus.Canceled:
cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor?.QuickActionData?.ActionSteps);
return new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.Canceled"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
case RemoteDesktopConnectionStatus.Error:
foreach (var error in connectionStatus.Errors)
{
var quickactionOutput = new cF4sdQuickActionRevision.cOutput() { Values = error };
statusMonitor.QuickActionOutputs.Add(quickactionOutput);
}
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedWithError);
return new List<object>() { cMultiLanguageSupport.GetItem("QuickAction.Revision.Status.FinishedWithError"), cUtility.RawValueFormatter.GetDisplayValue(DateTime.UtcNow, RawValueType.DATETIME) };
default:
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedWithError);
return errorOutput;
}
}
finally
{
AgentRemoteDesktopService.RemoteConnetionStatusChanged -= HandleConnectionStatusChanged;
}
void HandleConnectionStatusChanged(object sender, RemoteDesktopConnectionStatus e)
{
switch (e)
{
case RemoteDesktopConnectionStatus.Accepted:
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.waitingForUserAcceptance, enumQuickActionRevisionStatus.finishedSuccessfull);
break;
case RemoteDesktopConnectionStatus.Connected:
cQuickActionStatusMonitorModel.cQuickActionStep.SetQuickActionStepStatuses(statusMonitor?.QuickActionData?.ActionSteps, quickActionName, cQuickActionStatusMonitorModel.cQuickActionStep.enumActionStepType.running, enumQuickActionRevisionStatus.finishedSuccessfull);
break;
case RemoteDesktopConnectionStatus.Canceled:
cQuickActionStatusMonitorModel.cQuickActionStep.CancelRemainingQuickActionSteps(statusMonitor?.QuickActionData?.ActionSteps);
break;
default:
break;
}
}
}
}
}