Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }