15 lines
1.7 KiB
C#
15 lines
1.7 KiB
C#
using System.Diagnostics;
|
|
using Launcher.Next.Core;
|
|
namespace Launcher.Next.Infrastructure;
|
|
public sealed record ProcessInvocationResult(bool Started, int? ProcessId, string? BlockCode);
|
|
public interface IOperatingSystemProcessInvoker { ProcessInvocationResult Start(ProcessLaunchSpecification specification); }
|
|
public interface IAutoCadProcessProbe { bool IsAcadRunning(); }
|
|
public sealed class OperatingSystemProcessInvoker : IOperatingSystemProcessInvoker
|
|
{ public ProcessInvocationResult Start(ProcessLaunchSpecification s) { var info = new ProcessStartInfo { FileName=s.ExecutablePath, WorkingDirectory=s.WorkingDirectory, UseShellExecute=false }; foreach(var a in s.Arguments) info.ArgumentList.Add(a); foreach(var e in s.EnvironmentVariables) info.Environment[e.Key]=e.Value; var p=Process.Start(info); return new(p is not null,p?.Id,null); } }
|
|
public sealed class GuardedAutodeskProcessLauncher(INextPilotSafetyGate gate, IAutoCadProcessProbe probe, IOperatingSystemProcessInvoker invoker)
|
|
{
|
|
public static readonly bool RealExecutionReleaseEnabled = false;
|
|
public ProcessInvocationResult Start(PilotSafetyContext context, PilotLaunchPlan plan, ExecutionPermit? permit, IExecutionPermitService permits)
|
|
{ var checkedContext = context with { AcadRunning = probe.IsAcadRunning() }; var decision = gate.Evaluate(checkedContext, true); if (!decision.IsAllowed) return new(false, null, decision.Violations.First()); if (permit is null || !permits.Validate(permit, plan, DateTimeOffset.UtcNow)) return new(false,null,"EXECUTION_PERMIT_MISSING"); if (!RealExecutionReleaseEnabled) return new(false,null,"REAL_EXECUTION_RELEASE_NOT_ENABLED"); return invoker.Start(plan.Process); }
|
|
}
|