Ejemplo n.º 1
0
        public void Dispose()
        {
            if (!m_disposed)
            {
                using (var semaphoreReleaser = m_syncSemaphore.AcquireSemaphore())
                {
                    StopWaiting(semaphoreReleaser);
                    WaitUntilErrorAndOutputEof(true, semaphoreReleaser).GetAwaiter().GetResult();

                    if (m_processInjector != null)
                    {
                        // We may have already called Stop() in CompletionCallback, but that's okay.
                        m_processInjector.Stop().GetAwaiter().GetResult();
                        m_processInjector.Dispose();
                        m_processInjector = null;
                    }

                    if (m_processHandle != null)
                    {
                        m_processHandle.Dispose();
                        m_processHandle = null;
                    }

                    if (m_job != null)
                    {
                        m_job.Dispose();
                        m_job = null;
                    }
                }

                m_syncSemaphore.Dispose();

                m_disposed = true;
            }
        }
Ejemplo n.º 2
0
 private void Dispose(bool disposing)
 {
     if (disposing)
     {
         if (jobObject != null)
         {
             jobObject.Dispose();
         }
     }
 }
Ejemplo n.º 3
0
 public void Dispose()
 {
     jobObject.Dispose();
     userManager.DeleteUser(username);
     try
     {
         guardProcess.Kill();
     }
     catch (System.InvalidOperationException)
     {
     }
 }
Ejemplo n.º 4
0
        public void Destroy()
        {
            lock (_ioLock)
            {
                Stop(true);
                StopGuardAndWait(new TimeSpan(0, 0, 0, 10));


                foreach (var port in reservedPorts)
                {
                    tcpPortManager.ReleaseLocalPort(port, user.UserName);
                }
                tcpPortManager.RemoveFirewallRules(user.UserName);

                // BR - Unmap the mounted directories (Removes user ACLs)
                try
                {
                    jobObject.TerminateProcessesAndWait();
                }
                catch (ObjectDisposedException)
                {
                }
                jobObject.Dispose();

                if (directory != null)
                {
                    directory.Destroy();
                }

                deleteUserDiskQuota();

                if (user != null)
                {
                    user.Delete();
                }

                this.currentState = ContainerState.Destroyed;
            }
        }
Ejemplo n.º 5
0
        public void Destroy()
        {
            lock (_ioLock)
            {
                LogCompletionStatus();

                Stop(true);
                StopGuardAndWait(new TimeSpan(0, 0, 0, 10));

                foreach (var port in reservedPorts)
                {
                    tcpPortManager.ReleaseLocalPort(port, user.UserName);
                }
                tcpPortManager.RemoveFirewallRules(user.UserName);

                try
                {
                    jobObject.TerminateProcessesAndWait();
                }
                catch (ObjectDisposedException)
                {
                }
                jobObject.Dispose();

                directory.Destroy();

                if (user != null)
                {
                    directory.DeleteBindMounts(bindMounts, user);
                    user.DeleteProfile();
                    user.Delete();
                }

                deleteUserDiskQuota();

                this.currentState = ContainerState.Destroyed;
            }
        }
Ejemplo n.º 6
0
        public IContainer CreateContainer(ContainerSpec containerSpec)
        {
            Guard.NotNull(containerSpec, "containerSpec");

            UndoStack  undoStack = new UndoStack();
            IContainer container;

            try
            {
                var handle = containerSpec.Handle;
                if (String.IsNullOrEmpty(handle))
                {
                    handle = handleHelper.GenerateHandle();
                }

                var id = handleHelper.GenerateId(handle);

                var user = ContainerUser.Create(userManager, id);
                undoStack.Push(() => user.Delete());

                var directory = directoryFactory.Create(fileSystem, containerBasePath, id);
                directory.CreateSubdirectories(user);
                undoStack.Push(directory.Destroy);

                directory.CreateBindMounts(containerSpec.BindMounts, user);

                var jobObject = new JobObject(id);
                undoStack.Push(() => jobObject.Dispose());

                var containerHostClient = containerHostService.StartContainerHost(id, directory, jobObject, user.GetCredential());
                undoStack.Push(() => containerHostClient.Shutdown());

                var constrainedProcessRunner = new ConstrainedProcessRunner(containerHostClient);
                undoStack.Push(() => constrainedProcessRunner.Dispose());

                var processHelper    = new ProcessHelper();
                var dependencyHelper = new ContainerHostDependencyHelper();

                var diskQuotaControl = diskQuotaManager.CreateDiskQuotaControl(directory);

                container = new Container(
                    id,
                    handle,
                    user,
                    directory,
                    containerPropertiesService,
                    tcpPortManager,
                    jobObject,
                    diskQuotaControl,
                    processRunner,
                    constrainedProcessRunner,
                    processHelper,
                    containerSpec.Environment,
                    dependencyHelper);

                containerPropertiesService.SetProperties(container, containerSpec.Properties);
                lock (containers)
                {
                    containers.Add(container);
                }
            }
            catch (Exception e)
            {
                try
                {
                    undoStack.UndoAll();
                    throw;
                }
                catch (AggregateException undoException)
                {
                    throw new AggregateException(new[] { e, undoException });
                }
            }

            return(container);
        }