public static void Save() { Settings.Cache?.Clean(); //Patch exe //Patcher.Run("http://" + CASContainer.Settings.Host); // Entries var entries = SaveEntries().Result; // CDN Archives Settings.Logger.LogInformation("Starting CDN Index."); CDNIndexHandler?.CreateArchive(entries); // Root Settings.Logger.LogInformation("Starting Root."); foreach (var entry in entries) { RootHandler.AddEntry(entry.Path, entry); } entries.Add(RootHandler.Write()); //Add to entry list // Download if (DownloadHandler != null) { Settings.Logger.LogInformation("Starting Download."); foreach (var entry in entries) { DownloadHandler.AddEntry(entry); } entries.Add(DownloadHandler.Write()); //Add to entry list } if (InstallHandler != null) { Settings.Logger.LogInformation("Starting Install."); var installManifest = InstallHandler.Write(entries); if (installManifest != null) { entries.Add(installManifest); //Add to entry list } } // Encoding Settings.Logger.LogInformation("Starting Encoding."); foreach (var entry in entries) { EncodingHandler.AddEntry(entry); } entries.Insert(0, EncodingHandler.Write()); Settings.Logger.LogInformation("Starting Configs."); // CDN Config CDNConfig.Remove("archive-group"); CDNConfig.Remove("patch-archives"); CDNConfig.Remove("patch-archive-group"); // Build Config BuildConfig.Set("patch", ""); BuildConfig.Set("patch-size", "0"); BuildConfig.Set("patch-config", ""); string buildconfig = BuildConfig.Write(); string cdnconfig = CDNConfig.Write(); string version = BuildInfo["Version"]; // Build Info - redundant BuildInfo["Build Key"] = buildconfig; BuildInfo["CDN Key"] = cdnconfig; BuildInfo["CDN Hosts"] = string.Join(" ", Settings.CDNs); BuildInfo.Write(); // CDNs file CDNs["Hosts"] = string.Join(" ", Settings.CDNs); CDNs.Write(); // Versions file Versions["BuildConfig"] = buildconfig; Versions["CDNConfig"] = cdnconfig; Versions["VersionsName"] = version; Versions["BuildId"] = version.Split('.').Last(); Versions.Write(); // Done! Logger.LogInformation("CDN Config: " + cdnconfig); Logger.LogInformation("Build Config: " + buildconfig); // update Cache files Settings.Cache?.Save(); // cleanup entries.Clear(); entries.TrimExcess(); Close(); }
public void Update(bool silent) { Version = new Versions(ChannelName); CDN = new CDNs(ChannelName); // Walk through versions foreach (var versionInfo in Version.Records) { var versionName = versionInfo.Value.GetName(DisplayName); // Get CDN data. if (!CDN.Records.TryGetValue(versionInfo.Value.Region, out var serverInfo)) { continue; } var currentBuildInfo = RemoteBuildManager.GetBuild(versionName); var isNewBuild = currentBuildInfo == null; if (!isNewBuild) { currentBuildInfo.Regions.Add(versionInfo.Value.Region); } else { currentBuildInfo = new BuildInfo { Version = versionInfo.Value, CDN = serverInfo, VersionName = versionName }; RemoteBuildManager.AddBuild(currentBuildInfo); } // Get build info currentBuildInfo.BuildConfiguration = new BuildConfiguration(serverInfo, versionInfo.Value.BuildConfig); currentBuildInfo.ContentConfiguration = new ContentConfiguration(serverInfo, versionInfo.Value.CDNConfig); if (currentBuildInfo.BuildConfiguration.Encoding == null || currentBuildInfo.ContentConfiguration.Archives == null) { Scanner.WriteLine($"[{versionName}] Error retrieving either CDN or build configuration file."); } else if (isNewBuild) { Scanner.QueueInitialUpdate(currentBuildInfo); } } foreach (var currentBuild in RemoteBuildManager.Builds.Values.Where(b => b.JustDeployed && b.Channel == ChannelName)) { currentBuild.JustDeployed = false; var coalescedRegions = string.Join(", ", currentBuild.Regions).ToUpperInvariant(); if (!silent) { BuildDeployed?.Invoke(ChannelName, currentBuild.VersionName, coalescedRegions); } Scanner.WriteLine($"[{currentBuild.VersionName}] Deployed to regions {coalescedRegions}."); } // Sleep half a second to make sure every message goes through. Thread.Sleep(500); }
public override bool Initialize(string region) { var versions = new Versions(Game.ProgramCode); var cdns = new CDNs(Game.ProgramCode); if (!cdns.Records.TryGetValue(region, out ServerInfo)) { return(false); } Versions.Record versionInfo; if (!versions.Records.TryGetValue(region, out versionInfo)) { return(false); } BuildConfig = new BuildConfiguration(ServerInfo.Hosts[0], versionInfo.BuildConfig); ContentConfig = new ContentConfiguration(ServerInfo.Hosts[0], versionInfo.CDNConfig); _rootKey = BuildConfig.Root.ToByteArray(); _encodingKey = BuildConfig.Encoding[1].ToByteArray(); using (var encodingClient = new AsyncClient(ServerInfo.Hosts[0])) { encodingClient.Send($"/{ServerInfo.Path}/data/{_encodingKey[0]:x2}/{_encodingKey[1]:x2}/{_encodingKey}"); if (!encodingClient.Failed) { using (var encodingPack = new BLTE(encodingClient.Stream, 0, encodingClient.ContentLength)) if (!LoadEncoding(encodingPack)) { throw new InvalidOperationException("Unable to find encoding!"); } } } for (var i = 0; i < ContentConfig.Archives.Length; ++i) { var archiveHash = ContentConfig.Archives[i]; using (var archiveClient = new AsyncClient(ServerInfo.Hosts[0])) { archiveClient.Send($"/{ServerInfo.Path}/data/{archiveHash[0]:x2}/{archiveHash[1]:x2}/{archiveHash.ToHexString()}.index"); if (!archiveClient.Failed) { LoadIndex(archiveClient.Stream, archiveClient.ContentLength, i); } } } if (!_encodingEntries.ContainsKey(_rootKey)) { throw new InvalidOperationException("Root entry not found in encoding!"); } var encodingEntry = _encodingEntries[_rootKey]; foreach (var rootEncodingEntry in encodingEntry) { using (var rootClient = new AsyncClient(ServerInfo.Hosts[0])) { rootClient.Send($"/{ServerInfo.Path}/data/{rootEncodingEntry.Item2[0]:x2}/{rootEncodingEntry.Item2[1]:x2}/{rootEncodingEntry.Item2.ToHexString()}"); if (rootClient.Failed) { continue; } using (var rootBlte = new BLTE(rootClient.Stream, 0, rootClient.ContentLength)) if (LoadRoot(rootBlte)) { break; } } } return(_rootEntries.Count != 0); }