private void UnpackBuildpackCache() { Directory.CreateDirectory(this.workspace.Cache); if (File.Exists(this.workspace.DownloadBuildpackCachePath)) { Logger.Debug("Staging task {0}: Unpacking buildpack cache {1}", this.TaskId, this.workspace.DownloadBuildpackCachePath); DEAUtilities.UnzipFile(this.workspace.Cache, this.workspace.DownloadBuildpackCachePath); // Unzip string tarFileName = Directory.GetFiles(this.workspace.DownloadBuildpackCachePath, "*.tar")[0]; DEAUtilities.UnzipFile(this.workspace.Cache, Path.Combine(this.workspace.Cache, tarFileName)); // Untar File.Delete(Path.Combine(this.workspace.Cache, tarFileName)); } }
public void UnpackDroplet() { Directory.CreateDirectory(this.Workspace.UnstagedDir); if (File.Exists(this.Workspace.DownloadDropletPath)) { DEAUtilities.UnzipFile(this.Workspace.UnstagedDir, this.Workspace.DownloadDropletPath); } else { throw new Exception(string.Format("Could not find file {0}", this.Workspace.DownloadDropletPath)); } Directory.CreateDirectory(this.Workspace.Cache); if (File.Exists(this.Workspace.DownloadBuildpackCachePath)) { Logger.Debug("Staging task {0}: Unpacking buildpack cache {1}", this.Properties.TaskId, this.Workspace.DownloadBuildpackCachePath); DEAUtilities.UnzipFile(this.Workspace.Cache, this.Workspace.DownloadBuildpackCachePath); // Unzip string tarFileName = Directory.GetFiles(this.Workspace.DownloadBuildpackCachePath, "*.tar")[0]; DEAUtilities.UnzipFile(this.Workspace.Cache, Path.Combine(this.Workspace.Cache, tarFileName)); // Untar File.Delete(Path.Combine(this.Workspace.Cache, tarFileName)); } }
/// <summary> /// Prepares the app directory. /// </summary> /// <param name="bitsFile">The bits file.</param> /// <param name="bitsUri">The bits URI.</param> /// <param name="hash">The sha1.</param> /// <param name="tarZipFile">The TGZ file.</param> /// <param name="instance">The instance.</param> public void PrepareAppDirectory(string bitsFile, string bitsUri, string hash, string tarZipFile, DropletInstance instance) { if (instance == null) { throw new ArgumentNullException("instance"); } // What we do here, in order of preference.. // 1. Check our own staged directory. // 2. Check shared directory from CloudController that could be mounted (bits_file) // 3. Pull from http if needed. string instanceDir = instance.Properties.Directory; lock (this.stagerLock) { // check before downloading if (instance.Properties.StopProcessed) { return; } if (File.Exists(tarZipFile)) { Logger.Debug(Strings.FoundStagedBitsInLocalCache); } else { // If we have a shared volume from the CloudController we can see the bits directly, just link into our staged version. DateTime start = DateTime.Now; if (File.Exists(bitsFile)) { Logger.Debug(Strings.SharingCloudControllerStagingDirectory); File.Copy(bitsFile, tarZipFile); Logger.Debug(Strings.TookXSecondsToCopyFromShared, DateTime.Now - start); } else { Uri downloadUri = new Uri(bitsUri); Logger.Debug(Strings.Needtodownloadappbitsfrom, downloadUri); this.DownloadAppBits(downloadUri, hash, tarZipFile); Logger.Debug(Strings.TookXSecondsToDownloadAndWrite, DateTime.Now - start); } } // check before extracting if (instance.Properties.StopProcessed) { return; } DateTime startStageing = DateTime.Now; // Explode the app into its directory and optionally bind its local runtime. Directory.CreateDirectory(instance.Properties.Directory); DirectoryInfo deploymentDirInfo = new DirectoryInfo(instance.Properties.Directory); DirectorySecurity deploymentDirSecurity = deploymentDirInfo.GetAccessControl(); // Owner is important to account for disk quota deploymentDirSecurity.SetOwner(new NTAccount(instance.Properties.WindowsUserName)); deploymentDirSecurity.SetAccessRule( new FileSystemAccessRule( instance.Properties.WindowsUserName, FileSystemRights.Write | FileSystemRights.Read | FileSystemRights.Delete | FileSystemRights.Modify | FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None | PropagationFlags.InheritOnly, AccessControlType.Allow)); // Taking ownership of a file has to be executed with restore privilege elevated privilages using (new ProcessPrivileges.PrivilegeEnabler(Process.GetCurrentProcess(), ProcessPrivileges.Privilege.Restore)) { deploymentDirInfo.SetAccessControl(deploymentDirSecurity); } // Impersonate user to cascade the owernship to every file // Neccessary for windows disk quota using (new UserImpersonator(instance.Properties.WindowsUserName, ".", instance.Properties.WindowsPassword, true)) { DEAUtilities.UnzipFile(instanceDir, tarZipFile); // Unzip string tarFileName = Directory.GetFiles(instanceDir, "*.tar")[0]; DEAUtilities.UnzipFile(instanceDir, Path.Combine(instanceDir, tarFileName)); // Untar File.Delete(Path.Combine(instanceDir, tarFileName)); } Logger.Debug(Strings.TookXSecondsToStageTheApp, DateTime.Now - startStageing); } }
/// <summary> /// Stages the app directory. /// </summary> /// <param name="bitsFile">The bits file.</param> /// <param name="bitsUri">The bits URI.</param> /// <param name="hash">The sha1.</param> /// <param name="tarZipFile">The TGZ file.</param> /// <param name="instance">The instance.</param> public void StageAppDirectory(string bitsFile, Uri bitsUri, string hash, string tarZipFile, DropletInstance instance) { if (instance == null) { throw new ArgumentNullException("instance"); } // What we do here, in order of preference.. // 1. Check our own staged directory. // 2. Check shared directory from CloudController that could be mounted (bits_file) // 3. Pull from http if needed. string instanceDir = instance.Properties.Directory; lock (this.stagerLock) { // check before downloading if (instance.Properties.StopProcessed) { return; } if (File.Exists(tarZipFile)) { Logger.Debug(Strings.FoundStagedBitsInLocalCache); } else { // If we have a shared volume from the CloudController we can see the bits directly, just link into our staged version. DateTime start = DateTime.Now; if (!this.ForceHttpFileSharing && File.Exists(bitsFile)) { Logger.Debug(Strings.SharingCloudControllerStagingDirectory); File.Copy(bitsFile, tarZipFile); Logger.Debug(Strings.TookXSecondsToCopyFromShared, DateTime.Now - start); } else { Logger.Debug(Strings.Needtodownloadappbitsfrom, bitsUri); this.DownloadAppBits(bitsUri, hash, tarZipFile); Logger.Debug(Strings.TookXSecondsToDownloadAndWrite, DateTime.Now - start); } } // check before extracting if (instance.Properties.StopProcessed) { return; } DateTime startStageing = DateTime.Now; // Explode the app into its directory and optionally bind its local runtime. Directory.CreateDirectory(instanceDir); string tarFileName = Path.GetFileName(tarZipFile); tarFileName = Path.ChangeExtension(tarFileName, ".tar"); DEAUtilities.UnzipFile(instanceDir, tarZipFile); // Unzip DEAUtilities.UnzipFile(instanceDir, Path.Combine(instanceDir, tarFileName)); // Untar File.Delete(Path.Combine(instanceDir, tarFileName)); Logger.Debug(Strings.TookXSecondsToStageTheApp, DateTime.Now - startStageing); } }
private void UnpackApp() { Directory.CreateDirectory(this.workspace.UnstagedDir); DEAUtilities.UnzipFile(this.workspace.UnstagedDir, this.workspace.DownloadDropletPath); }