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); }