Example #1
0
        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();
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }