public bool InitializeAdminBuildpack(StagingStartRequestAdminBuildpack adminBuildpack, string adminBuildpackDir, bool checkWindowsCompatibility)
        {
            var dir = Path.Combine(adminBuildpackDir, adminBuildpack.Key);
            var buildpackMutex = new Mutex(false, AdminBuildpackMutexName(adminBuildpack.Key));

            try
            {
                buildpackMutex.WaitOne();

                DownloadAdminBuildpack(adminBuildpack, adminBuildpackDir);

                if (checkWindowsCompatibility)
                {
                    var winBuildpack = BuildpackHasWindowsCompatibleBinaries(dir);
                    if (!winBuildpack)
                    {
                        Logger.Info("Ignoring buildpack {1}. Staging task {0}. Unable to detect compatible windows executables in buildpack bin.", this.Properties.TaskId, dir);
                        return false;
                    }
                }

                DEAUtilities.DirectoryCopy(dir, Path.Combine(this.Workspace.TempDir, "buildpack"), true);
            }

            finally
            {
                buildpackMutex.ReleaseMutex();
                buildpackMutex.Dispose();
            }

            return true;
        }
        private void TryCleanupUnusedAdminBuildpacks(StagingStartRequestAdminBuildpack[] adminBuildpacks, string adminBuildpackDir)
        {
            if (!Directory.Exists(adminBuildpackDir))
            {
                return;
            }

            var cachedAdminBuilpacks = new DirectoryInfo(adminBuildpackDir).EnumerateDirectories().ToDictionary(di => di.Name, di => di.FullName);

            var adminBuildpacksLookup = adminBuildpacks.ToLookup(ab => ab.Key);

            foreach (var cachedBuildpack in cachedAdminBuilpacks)
            {
                if (adminBuildpacksLookup.Contains(cachedBuildpack.Key))
                {
                    continue;
                }

                bool signaled = false;
                var buildpackMutex = new Mutex(false, AdminBuildpackMutexName(cachedBuildpack.Key));

                try
                {
                    signaled = buildpackMutex.WaitOne(0);

                    if (signaled)
                    {
                        Logger.Info("Deleting old admin buildpack {0} from {1}", cachedBuildpack.Key, cachedBuildpack.Value);

                        Directory.Delete(cachedBuildpack.Value, true);
                    }
                }
                finally
                {
                    if (signaled)
                    {
                        buildpackMutex.ReleaseMutex();
                    }

                    buildpackMutex.Dispose();
                }
            }
        }
        public void DownloadAdminBuildpack(StagingStartRequestAdminBuildpack adminBuildpack, string adminBuildpackDir)
        {
            string archiveFile = Path.Combine(adminBuildpackDir, adminBuildpack.Key + ".zip");
            string destDir = Path.Combine(adminBuildpackDir, adminBuildpack.Key);

            if (Directory.Exists(destDir))
            {
                Logger.Info("Skipping download for admin buildpack {0} because it was previously downloaded in {1}", adminBuildpack.Key, destDir);
                return;
            }

            Directory.CreateDirectory(destDir);

            WebClient client = new WebClient();

            try
            {
                Logger.Info("Downloading admin buildpack {0} in {1} from {2}", adminBuildpack.Key, destDir, adminBuildpack.Url);

                var downloadUri = new Uri(adminBuildpack.Url);
                client.Headers[HttpRequestHeader.Authorization] = "Basic " + System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(downloadUri.UserInfo));
                client.DownloadFile(downloadUri, archiveFile);

                ZipFile.ExtractToDirectory(archiveFile, destDir);
            }
            catch
            {
                Directory.Delete(destDir, true);
                File.Delete(archiveFile);

                throw;
            }
            finally
            {
                client.Dispose();
            }

            File.Delete(archiveFile);
        }