internal static ForgeJsonMetadata CreateJsonMetadata(ForgeData forgeData, FilesToPack filesToPack) { if (null == forgeData) { throw new ArgumentNullException("forgeData"); } if (null == filesToPack) { throw new ArgumentNullException("filesToPack"); } ForgeJsonMetadata forgeJsonMetadata = null; if (filesToPack.Count > 0) { var forgeUserName = forgeData[Conatants.PuppetForgeUserName]; var forgeModuleName = forgeData[Conatants.PuppetForgeModuleName]; var forgeModuleVersion = forgeData[Conatants.PuppetForgeModuleVersion]; var forgeModuleDependency = forgeData[Conatants.PuppetForgeModuleDependency]; var forgeModuleSummary = forgeData[Conatants.PuppetForgeModuleSummary]; var forgeModuleDescription = forgeData[Conatants.PuppetForgeModuleDescription]; forgeJsonMetadata = new ForgeJsonMetadata { name = string.Format("{0}-{1}", forgeUserName, forgeModuleName.ToLower()), author = forgeUserName, version = forgeModuleVersion, summary = forgeModuleSummary, description = forgeModuleDescription }; // Parse dependency forgeJsonMetadata.dependencies.Add(SELF.ParseDependency(forgeModuleDependency)); // Add MD5 checksums to json using (var md5 = MD5.Create()) { foreach (var fileToPack in filesToPack) { var fileInfo = fileToPack.Item1; var subdir = fileToPack.Item2; var combinedName = string.IsNullOrWhiteSpace(subdir) ? fileInfo.Name : string.Format("{0}/{1}", subdir.Replace(Path.DirectorySeparatorChar, '/'), fileInfo.Name); using (var stream = File.OpenRead(fileToPack.Item1.FullName)) { var byteArray = md5.ComputeHash(stream); forgeJsonMetadata.checksums.Add(combinedName, string.Join("", byteArray.Select(b => b.ToString("x2")))); } } } } return(forgeJsonMetadata); }
private static ForgeData TurnIntoDict(PuppetProjectNode puppetProjectNode) { var forgeData = new ForgeData { { Conatants.PuppetForgeUserName, puppetProjectNode.ProjectMgr.GetProjectProperty(Conatants.PuppetForgeUserName, false) }, { Conatants.PuppetForgeModuleName, puppetProjectNode.ProjectMgr.GetProjectProperty(Conatants.PuppetForgeModuleName, false) }, { Conatants.PuppetForgeModuleVersion, puppetProjectNode.ProjectMgr.GetProjectProperty(Conatants.PuppetForgeModuleVersion, false) }, { Conatants.PuppetForgeModuleDependency, puppetProjectNode.ProjectMgr.GetProjectProperty(Conatants.PuppetForgeModuleDependency, false) }, { Conatants.PuppetForgeModuleSummary, puppetProjectNode.ProjectMgr.GetProjectProperty(Conatants.PuppetForgeModuleSummary, false) }, { Conatants.PuppetForgeModuleDescription, puppetProjectNode.ProjectMgr.GetProjectProperty(Conatants.PuppetForgeModuleDescription, false) }, }; return(forgeData); }
private async void UploadToPuppetForgeAsync(ForgeData forgeData, string tarballName) { if (null == forgeData) { throw new ArgumentNullException("forgeData"); } if (string.IsNullOrEmpty(tarballName)) { throw new ArgumentNullException("tarballName"); } var cancelationSource = new CancellationTokenSource(); var cancelationToken = cancelationSource.Token; var uploadProgressWindow = new UploadProgressWindow(cancelationSource); try { var username = forgeData[Conatants.PuppetForgeUserName]; var forgeModuleName = forgeData[Conatants.PuppetForgeModuleName]; var modulename = forgeModuleName.ToLower(); var moduleversion = forgeData[Conatants.PuppetForgeModuleVersion];; var forgePublishWindow = new ForgePublishWindow { tbAccountName = { Text = username }, tbModuleName = { Text = modulename }, tbModuleVersion = { Text = moduleversion } }; if (this.password != null && this.password.Length != 0) { forgePublishWindow.pwdAcountPassword.Password = SELF.ConvertToUnsecureString(this.password); forgePublishWindow.btnPublish.IsEnabled = true; } var res = forgePublishWindow.ShowDialog(); if (!res.HasValue || res.Value == false) { return; } this.password = forgePublishWindow.pwdAcountPassword.SecurePassword; uploadProgressWindow.Show(); var accessToken = await System.Threading.Tasks.Task.Run(() => { cancelationToken.ThrowIfCancellationRequested(); return(SELF.GetAccessToken(username, this.password)); }, cancelationToken); await System.Threading.Tasks.Task.Run(() => { cancelationToken.ThrowIfCancellationRequested(); SELF.UploadTarball(accessToken, username, modulename, tarballName); }, cancelationToken); uploadProgressWindow.lblStatus.Content = Resources.PuppetModuleUploadedSuccessfully; uploadProgressWindow.progressBar.Value = 100; } catch (OperationCanceledException) { Debug.WriteLine("Canceled"); uploadProgressWindow.lblStatus.Content = "Canceled by user."; uploadProgressWindow.progressBar.Value = 0; } catch (WebException ex) { // This exception will be raised if the server didn't return 200 - OK // Retrieve more information about the error if (ex.Response != null) { using (var err = (HttpWebResponse)ex.Response) { var info = string.Format(Resources.ServerReturnedTemplate, err.StatusDescription, err.StatusCode, err.StatusCode); uploadProgressWindow.lblStatus.Content = info; } } else { uploadProgressWindow.lblStatus.Content = ex.Message; } uploadProgressWindow.progressBar.Value = 0; } catch (Exception ex) { uploadProgressWindow.lblStatus.Content = ex.Message; uploadProgressWindow.progressBar.Value = 0; } uploadProgressWindow.progressBar.IsIndeterminate = false; uploadProgressWindow.btnCancel.Content = "Close"; }
private static string TarGz(ForgeData forgeData, FilesToPack filesToPack, ForgeJsonMetadata forgeJsonMetadata) { if (null == forgeData) { throw new ArgumentNullException("forgeData"); } if (null == filesToPack) { throw new ArgumentNullException("filesToPack"); } if (null == forgeJsonMetadata) { throw new ArgumentNullException("forgeJsonMetadata"); } // Add files to a Tarball if (filesToPack.Count <= 0) { return(null); } var forgeUserName = forgeData[Conatants.PuppetForgeUserName]; var forgeModuleName = forgeData[Conatants.PuppetForgeModuleName]; var forgeModuleVersion = forgeData[Conatants.PuppetForgeModuleVersion]; // Create a temp directory. var tmpDir = new DirectoryInfo(Path.GetTempPath()); var puppetTmpDir = tmpDir.CreateSubdirectory("PuppetLab"); var rndDir = puppetTmpDir.CreateSubdirectory(Path.GetRandomFileName()); var moduleDirName = string.Format("{0}-{1}-{2}", forgeUserName, forgeModuleName, forgeModuleVersion).ToLower(); var moduleDir = rndDir.CreateSubdirectory(moduleDirName); Directory.SetCurrentDirectory(rndDir.ToString()); // Create json metadata file in module directory MemoryStream ms = null; FileStream fs = null; try { ms = new MemoryStream(); fs = File.Create(Path.Combine(moduleDir.ToString(), "metadata.json")); var sr = new StreamReader(ms); var sw = new StreamWriter(fs); var s = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true }; var jonSerializer = new DataContractJsonSerializer(typeof(ForgeJsonMetadata), s); jonSerializer.WriteObject(ms, forgeJsonMetadata); // Remove backslashes that DataContractJsonSerializer adds before forward slashes (don't know how to disable this) ms.Position = 0; sw.WriteLine(sr.ReadToEnd().Replace("\\", string.Empty)); sw.Close(); sr.Close(); ms = null; fs = null; } finally { if (ms != null) { ms.Dispose(); } if (fs != null) { fs.Dispose(); } } // Copy module's files to a tmp dir considering module dir tree foreach (var fileToPack in filesToPack) { var srcFileInfo = fileToPack.Item1; var relSubdir = fileToPack.Item2; if (!string.IsNullOrEmpty(relSubdir)) { moduleDir.CreateSubdirectory(relSubdir); } var absSubdir = Path.Combine(moduleDir.ToString(), relSubdir); var dstFileName = Path.Combine(absSubdir, srcFileInfo.Name); srcFileInfo.CopyTo(dstFileName); } // Create a TAR GZ archive var tarFileName = moduleDirName + ".tar"; var gzFileName = tarFileName + ".gz"; CreateTarGz(gzFileName, moduleDir.ToString()); return(gzFileName); }