public virtual object Execute(T cmdlet) { var restCommand = RestService.ReverseLookup[cmdlet.GetType()]; var result = new PowershellReponse(); AsynchronouslyEnumerableList <ErrorRecord> errors = null; using (var dps = new DynamicPowershell(RestService.RunspacePool)) { if (cmdlet.Session != null && cmdlet.Session.HasRole("password_must_be_changed") && typeof(T) != typeof(SetServicePassword)) { result.Warnings = new string[] { "WARNING: USER PASSWORD SHOULD BE CHANGED.\r\n" }; } var dynamicResult = dps.Invoke(restCommand.Name, _persistableElements, cmdlet, restCommand.DefaultParameters, restCommand.ForcedParameters, out errors); result.Output = dynamicResult.ToArray(); result.LastIsTerminatingError = dynamicResult.LastIsTerminatingError; } if (errors != null && errors.Any()) { result.Error = errors.Select(e => new RemoteError { Category = e.CategoryInfo.Category, Message = e.FullyQualifiedErrorId, ExceptionType = e.Exception.GetType().Name, ExceptionMessage = e.Exception.Message, }).ToArray(); } return(result); }
internal DynamicPowershellResult InvokeAsyncIfPossible(out AsynchronouslyEnumerableList <ErrorRecord> errors) { CommandPipeline.Commands.Add(Command); CommandPipeline.Input.Close(); CommandPipeline.Output.DataReady += (sender, args) => { lock (Result) { if (Result.IsCompleted) { throw new ClrPlusException("Attempted to add to completed collection"); } var items = CommandPipeline.Output.NonBlockingRead(); foreach (var item in items) { Result.Add(item.ImmediateBaseObject); } } }; CommandPipeline.Error.DataReady += (sender, args) => { lock (ResultErrors) { if (ResultErrors.IsCompleted) { throw new ClrPlusException("Attempted to add to completed collection"); } var items = CommandPipeline.Error.NonBlockingRead(); foreach (var item in items) { if (item is PSObject) { var record = (item as PSObject).ImmediateBaseObject; if (record is ErrorRecord) { ResultErrors.Add(record as ErrorRecord); } } } if (CommandPipeline.PipelineStateInfo.State == PipelineState.Failed) { ResultErrors.Add(new ErrorRecord(CommandPipeline.PipelineStateInfo.Reason, "", ErrorCategory.InvalidArgument, null)); } } }; CommandPipeline.StateChanged += (x, y) => { switch (CommandPipeline.PipelineStateInfo.State) { case PipelineState.NotStarted: break; case PipelineState.Completed: // case PipelineState.Disconnected: case PipelineState.Failed: while (!CommandPipeline.Output.EndOfPipeline) { Thread.Sleep(1); } while (!CommandPipeline.Error.EndOfPipeline) { Thread.Sleep(1); } lock (ResultErrors) { ResultErrors.Completed(); } lock (Result) { Result.Completed(); if (CommandPipeline.PipelineStateInfo.State == PipelineState.Failed) { // the last error was a terminating error Result.LastIsTerminatingError = true; } Dispose(); } break; case PipelineState.Stopped: while (!CommandPipeline.Output.EndOfPipeline) { Thread.Sleep(1); } while (!CommandPipeline.Error.EndOfPipeline) { Thread.Sleep(1); } lock (ResultErrors) { ResultErrors.Completed(); } lock (Result) { Result.Completed(); Dispose(); } break; case PipelineState.Stopping: break; case PipelineState.Running: break; } }; if (CommandPipeline.IsNested) { // goofy-powershell doesn't let nested pipelines async. CommandPipeline.Invoke(); } else { CommandPipeline.InvokeAsync(); } errors = ResultErrors; return(Result); }
public DynamicPowershellResult Invoke(string functionName, IEnumerable <PersistablePropertyInformation> elements, object objectContainingParameters, IDictionary <string, object> defaults, IDictionary <string, object> forced, out AsynchronouslyEnumerableList <ErrorRecord> errors) { Wait(); // command _currentCommand = new DynamicPowershellCommand(CreatePipeline()) { Command = new Command(GetPropertyValue(LookupCommand(functionName), "Name")) }; // parameters _currentCommand.SetParameters(elements, objectContainingParameters, defaults, forced); // invoke return(_currentCommand.InvokeAsyncIfPossible(out errors)); }
public DynamicPowershellResult Invoke(string functionName, IEnumerable<PersistablePropertyInformation> elements, object objectContainingParameters, IDictionary<string, object> defaults, IDictionary<string, object> forced, out AsynchronouslyEnumerableList<ErrorRecord> errors) { Wait(); // command _currentCommand = new DynamicPowershellCommand(CreatePipeline()) { Command = new Command(GetPropertyValue(LookupCommand(functionName), "Name")) }; // parameters _currentCommand.SetParameters(elements, objectContainingParameters,defaults,forced); // invoke return _currentCommand.InvokeAsyncIfPossible(out errors); }