public void TestHandle()
        {
            var runner = new ImpersonationProcessRunner();
            var spec   = new ProcessRunSpec()
            {
                ExecutablePath      = "powershell",
                Arguments           = new[] { "-Command", "$x = [Console]::In.ReadLine()" },
                BufferedInputOutput = true,
                Credentials         = creds
            };
            var proc = runner.Run(spec);

            Assert.NotNull(proc.Handle);
            var pid      = GetProcessId(proc.Handle);
            var realProc = Process.GetProcessById(pid);

            try
            {
                Assert.NotNull(realProc);
                Assert.Equal("powershell", realProc.ProcessName);
            }
            finally
            {
                realProc.Kill();
            }
        }
Пример #2
0
        public IProcess Run(ProcessRunSpec runSpec)
        {
            Guid processKey = Guid.NewGuid();

            var defaultEnvironmentBlock = EnvironmentBlock.CreateSystemDefault();
            var environment             = defaultEnvironmentBlock.Merge(runSpec.Environment).ToDictionary();

            CreateProcessParams @params = new CreateProcessParams
            {
                key              = processKey,
                executablePath   = runSpec.ExecutablePath,
                arguments        = runSpec.Arguments,
                environment      = environment,
                workingDirectory = runSpec.WorkingDirectory
            };

            var processDataCallback = BuildProcessDataCallback(runSpec.OutputCallback, runSpec.ErrorCallback);

            hostClient.SubscribeToProcessData(processKey, processDataCallback);

            var result  = hostClient.CreateProcess(@params);
            var process = new ConstrainedProcess(hostClient, processKey, result.id, environment);

            return(process);
        }
Пример #3
0
        public Task <CreateProcessResult> ExecuteAsync(CreateProcessParams p)
        {
            var runSpec = new ProcessRunSpec
            {
                ExecutablePath   = p.executablePath,
                Arguments        = p.arguments,
                Environment      = p.environment,
                WorkingDirectory = p.workingDirectory,
                OutputCallback   = (data) =>
                {
                    processTracker.HandleProcessData(p.key, ProcessDataType.STDOUT, data);
                },
                ErrorCallback = (data) =>
                {
                    processTracker.HandleProcessData(p.key, ProcessDataType.STDERR, data);
                },
            };

            var process = processRunner.Run(runSpec);

            processTracker.TrackProcess(p.key, process);

            var result = new CreateProcessResult
            {
                id = process.Id,
            };

            return(Task.FromResult(result));
        }
Пример #4
0
        public IContainerHostClient StartContainerHost(string containerId, IContainerDirectory directory, JobObject jobObject, NetworkCredential credentials)
        {
            CopyHostToContainer(directory);

            var hostRunSpec = new ProcessRunSpec
            {
                ExecutablePath      = directory.MapBinPath(dependencyHelper.ContainerHostExe),
                Arguments           = new[] { containerId },
                BufferedInputOutput = true,
                WorkingDirectory    = directory.UserPath,
                Credentials         = credentials,
            };

            // Order here is important.
            // - Start the process
            // - Add the process to the job object
            // - Verify that the process is healthy
            // - Start the RPC message pump
            //
            // We need to ensure that the host process cannot create any new processes before
            // it's added to the job object.

            var hostProcess = processRunner.Run(hostRunSpec);

            jobObject.AssignProcessToJob(hostProcess.Handle);
            WaitForProcessToStart(hostProcess, HostProcessStartTimeout);

            var messageTransport = MessageTransport.Create(hostProcess.StandardOutput, hostProcess.StandardInput);
            var messagingClient  = MessagingClient.Create(async message =>
            {
                await messageTransport.PublishRequestAsync(message);
            });

            messageTransport.SubscribeResponse(message =>
            {
                messagingClient.PublishResponse(message);
                return(Task.FromResult(0));
            });

            messageTransport.SubscribeEvent(@event =>
            {
                try
                {
                    messagingClient.PublishEvent(@event);
                }
                catch (Exception e)
                {
                    log.Log(LogLevel.Error, e.ToString(), e);
                }
                return(Task.FromResult(0));
            });

            var containerHostClient = new ContainerHostClient(hostProcess, messageTransport, messagingClient, jobObject);

            messageTransport.Start();

            return(containerHostClient);
        }
        public void TestStdout()
        {
            var runner = new ImpersonationProcessRunner();
            var spec   = new ProcessRunSpec()
            {
                ExecutablePath      = "whoami",
                BufferedInputOutput = true,
                Credentials         = creds
            };
            var proc = runner.Run(spec);

            Assert.Matches(new Regex(username), proc.StandardOutput.ReadToEnd());
        }
        public void TestStderr()
        {
            var runner = new ImpersonationProcessRunner();
            var spec   = new ProcessRunSpec()
            {
                ExecutablePath      = "powershell",
                Arguments           = new[] { "-Command", "[Console]::Error.WriteLine('hi')" },
                BufferedInputOutput = true,
                Credentials         = creds
            };
            var proc = runner.Run(spec);

            Assert.Equal("hi", proc.StandardError.ReadToEnd().Trim());
        }
        public void TestExited()
        {
            var exited = false;
            var runner = new ImpersonationProcessRunner();
            var spec   = new ProcessRunSpec()
            {
                ExecutablePath      = "whoami",
                BufferedInputOutput = true,
                Credentials         = creds,
                ExitHandler         = (sender, args) => exited = true
            };
            var process = runner.Run(spec);

            process.WaitForExit();
            Assert.True(exited);
        }
            public void SetsDefaultEnvironmentBlock()
            {
                var spec = new ProcessRunSpec
                {
                    ExecutablePath   = "exe",
                    Arguments        = new[] { "arg1", "arg2" },
                    WorkingDirectory = @"\WorkdirDir",
                    Environment      = new Dictionary <string, string>(),
                };

                Runner.Run(spec);

                Client.Received(1).CreateProcess(
                    Arg.Is <CreateProcessParams>(actual =>
                                                 actual.environment.ContainsKey("TEMP") &&
                                                 actual.environment.ContainsKey("PATH")
                                                 )
                    );
            }
Пример #9
0
            public Run()
            {
                Spec = new ProcessSpec
                {
                    ExecutablePath = "/.iishost/iishost.exe",
                    Arguments      = new[] { "-p", "3000", "-r", @"/www" },
                };

                var containerUserPath = @"C:\Containers\handle\user\";

                ExpectedRunSpec = new ProcessRunSpec
                {
                    ExecutablePath   = @"C:\Containers\handle\user\.iishost\iishost.exe",
                    Arguments        = Spec.Arguments,
                    WorkingDirectory = containerUserPath,
                };

                Directory.MapUserPath("/.iishost/iishost.exe").Returns(ExpectedRunSpec.ExecutablePath);
                Directory.MapUserPath("/").Returns(containerUserPath);
            }
Пример #10
0
        public IContainerProcess Run(ProcessSpec spec, IProcessIO io)
        {
            lock (_ioLock)
            {
                ThrowIfNotActive();

                var runner = spec.Privileged
                    ? processRunner
                    : constrainedProcessRunner;

                var executablePath = !spec.DisablePathMapping
                    ? directory.MapUserPath(spec.ExecutablePath)
                    : spec.ExecutablePath;

                var specEnvironment    = spec.Environment ?? new Dictionary <string, string>();
                var processEnvironment = this.defaultEnvironment.Merge(specEnvironment);

                Action <string> stdOut = io == null || io.StandardOutput == null
                    ? (Action <string>)null
                    : data => io.StandardOutput.Write(data);

                Action <string> stdErr = io == null || io.StandardError == null
                    ? (Action <string>)null
                    : data => io.StandardError.Write(data);

                var runSpec = new ProcessRunSpec
                {
                    ExecutablePath   = executablePath,
                    Arguments        = spec.Arguments,
                    Environment      = processEnvironment,
                    WorkingDirectory = directory.MapUserPath(spec.WorkingDirectory ?? DefaultWorkingDirectory),
                    OutputCallback   = stdOut,
                    ErrorCallback    = stdErr,
                };

                var process = runner.Run(runSpec);

                return(new ContainerProcess(process));
            }
        }
            public void SendsCreateProcessMessage()
            {
                var spec = new ProcessRunSpec
                {
                    ExecutablePath   = "exe",
                    Arguments        = new[] { "arg1", "arg2" },
                    WorkingDirectory = @"\WorkdirDir",
                    Environment      = new Dictionary <string, string> {
                        { "env1", "val1" }
                    },
                };

                Runner.Run(spec);

                Client.Received(1).CreateProcess(
                    Arg.Is <CreateProcessParams>(actual =>
                                                 actual.executablePath == spec.ExecutablePath &&
                                                 actual.arguments == spec.Arguments &&
                                                 actual.environment.ContainsKey("env1") &&
                                                 actual.workingDirectory == spec.WorkingDirectory &&
                                                 actual.key != Guid.Empty
                                                 )
                    );
            }
            public void ReturnsProcessWithEnvironment()
            {
                int expectedId = 123;

                Client.CreateProcess(Arg.Any <CreateProcessParams>()).Returns(
                    new CreateProcessResult()
                {
                    id = expectedId
                }
                    );

                var spec = new ProcessRunSpec
                {
                    Environment = new Dictionary <string, string> {
                        { "FOO", "BAR" }
                    }
                };

                var process = Runner.Run(spec);

                Assert.NotNull(process.Environment);
                Assert.True(process.Environment.Count > 0);
                Assert.Equal("BAR", process.Environment["FOO"]);
            }