Example #1
0
        private static void FetchUpdates(QueryFilter queryToRun, CompressedMetadataStore destinationResult)
        {
            var server = new UpstreamServerClient(destinationResult.UpstreamSource);

            server.MetadataQueryProgress += Server_MetadataQueryProgress;

            Console.WriteLine("Fetching categories ...");

            server.GetCategories(destinationResult).GetAwaiter().GetResult();

            if (queryToRun != null)
            {
                Console.WriteLine("Running query with filters:");

                MetadataQuery.PrintFilter(queryToRun, destinationResult);

                server.GetUpdates(queryToRun, destinationResult).GetAwaiter().GetResult();
            }

            Console.WriteLine();
            destinationResult.CommitProgress += Program.MetadataSourceOperationProgressHandler;
            destinationResult.Commit();

            Console.WriteLine();
            ConsoleOutput.WriteGreen($"Query result saved to file {destinationResult.FilePath}");
        }
Example #2
0
        /// <summary>
        /// Initialize a new instance of UpstreamServerStartup.
        /// </summary>
        /// <param name="config">
        /// <para>ASP.NET configuration.</para>
        ///
        /// <para>Must contain a string entry "metadata-path" with the path to the metadata source to use</para>
        ///
        /// <para>Must contain a string entry "updates-filter" with a JSON serialized updates metadata filter</para>
        ///
        /// <para>Must contain a string entry "service-config-path" with the path to the service configuration JSON</para>
        ///
        /// <para>Can contain a string entry "content-path" with the path to the content store to use if serving update content</para>
        /// </param>
        public UpstreamServerStartup(IConfiguration config)
        {
            // Get the metadata source path from the configuration
            var sourcePath = config.GetValue <string>("metadata-path");

            var contentPath = config.GetValue <string>("content-path");

            // Get the filteres to apply to updates; restricts which updates are shared with downstream servers
            Filter = MetadataFilter.FromJson(config.GetValue <string>("updates-filter"));

            // Open the updates metadata source. It must exist
            LocalMetadataSource = CompressedMetadataStore.Open(sourcePath);
            if (LocalMetadataSource == null)
            {
                throw new System.Exception($"Cannot open the specified metadata source at {sourcePath}");
            }

            var serviceConfigPath = config.GetValue <string>("service-config-path");

            ServiceConfiguration = JsonConvert.DeserializeObject <ServerSyncConfigData>(
                File.OpenText(serviceConfigPath).ReadToEnd());

            if (!string.IsNullOrEmpty(contentPath))
            {
                LocalContentSource = new FileSystemContentStore(contentPath);
                ServiceConfiguration.CatalogOnlySync = false;
            }
            else
            {
                ServiceConfiguration.CatalogOnlySync = true;
            }
        }
Example #3
0
        /// <summary>
        /// Initialize a new instance of UpdateServerStartup.
        /// </summary>
        /// <param name="config">
        /// <para>ASP.NET configuration.</para>
        /// <list type="bullet">
        /// <item><description>Required: string entry "metadata-source" with the path to file containing updates metadata.</description></item>
        /// <item><description>Required: string entry "server-config" containing the server configuration in JSON format. A reference server configuration file is provided.</description></item>
        /// <item><description>Optional: string entry "content-source" containing the path where update content is stored.</description></item>
        /// <item><description>Optional: string entry "content-http-root" with the root URL where update content is serverd from (e.g. http://my-update-server.com). Usually this set to the address/name of the server. Required if "content-source" is specified.</description></item>
        /// </list>
        /// </param>
        public UpdateServerStartup(IConfiguration config)
        {
            // Get the repository path from the configuration
            var metadataSourceFile = config.GetValue <string>("metadata-source");

            MetadataSource = CompressedMetadataStore.Open(metadataSourceFile);
            if (MetadataSource == null)
            {
                throw new System.Exception($"Cannot open updates metadata source from path {metadataSourceFile}");
            }

            UpdateServiceConfiguration = Newtonsoft.Json.JsonConvert.DeserializeObject <Config>(config.GetValue <string>("server-config"));

            // A file that contains mapping of update identity to a 32 bit, locally assigned revision ID.
            var contentPath = config.GetValue <string>("content-source");

            if (!string.IsNullOrEmpty(contentPath))
            {
                ContentSource = new FileSystemContentStore(contentPath);
                if (ContentSource == null)
                {
                    throw new System.Exception($"Cannot open updates content source from path {contentPath}");
                }
            }

            ContentRoot = config.GetValue <string>("content-http-root");
        }
Example #4
0
        /// <summary>
        /// Gets updates matching the query filter from an upstream update server.
        /// </summary>
        /// <param name="updatesFilter">Updates filter. See <see cref="QueryFilter"/> for details.</param>
        /// <returns>An updates metadata source containing updates that match the filter.</returns>
        public async Task <CompressedMetadataStore> GetUpdates(QueryFilter updatesFilter)
        {
            var queryResult = new CompressedMetadataStore(GetQueryResultFileName(), UpstreamEndpoint);

            await GetUpdates(updatesFilter, queryResult);

            queryResult.Commit();

            return(queryResult);
        }
Example #5
0
        /// <summary>
        /// Gets the list of categories from the upstream update server.
        /// </summary>
        /// <returns>An updates metadata source containing all.</returns>
        public async Task <CompressedMetadataStore> GetCategories()
        {
            var queryResult = new CompressedMetadataStore(GetQueryResultFileName(), UpstreamEndpoint);

            await GetCategories(queryResult);

            queryResult.Commit();

            return(queryResult);
        }
Example #6
0
        /// <summary>
        /// Runs the sync command
        /// </summary>
        /// <param name="options">Fetch command options</param>
        public static void FetchUpdates(FetchUpdatesOptions options)
        {
            Endpoint upstreamEndpoint;
            CompressedMetadataStore baselineSource;

            Console.WriteLine("Opening query results file");
            baselineSource = CompressedMetadataStore.Open(options.MetadataSourcePath);
            if (baselineSource == null)
            {
                ConsoleOutput.WriteRed("Cannot open the query result file!");
                return;
            }

            ConsoleOutput.WriteGreen("Done!");
            upstreamEndpoint = baselineSource.UpstreamSource;

            // The filter to apply when fetching updates
            QueryFilter queryToRun = null;

            queryToRun = baselineSource.Filters.FirstOrDefault();
            if (queryToRun != null)
            {
                ConsoleOutput.WriteCyan("Using the filter from the baseline source. Command line filters are ignored!");
            }

            if (queryToRun == null)
            {
                // A new query will be created based on command line options
                try
                {
                    queryToRun = MetadataSync.CreateValidFilterFromOptions(options, baselineSource);
                }
                catch (Exception ex)
                {
                    ConsoleOutput.WriteRed(ex.Message);
                    return;
                }
            }

            using (var syncResult = new CompressedMetadataStore(baselineSource))
            {
                if (!string.IsNullOrEmpty(options.AccountName) && !string.IsNullOrEmpty(options.AccountGuid))
                {
                    if (!Guid.TryParse(options.AccountGuid, out Guid accountGuid))
                    {
                        ConsoleOutput.WriteRed("The account GUID must be a valid GUID string");
                        return;
                    }

                    syncResult.SetUpstreamCredentials(options.AccountName, accountGuid);
                }

                FetchUpdates(queryToRun, syncResult);
            }
        }
Example #7
0
        /// <summary>
        /// Fetches categories from an upstream server
        /// </summary>
        /// <param name="options">Pre-Fetch command options</param>
        public static void FetchCategories(FetchCategoriesOptions options)
        {
            Endpoint upstreamEndpoint;

            if (!string.IsNullOrEmpty(options.UpstreamEndpoint))
            {
                upstreamEndpoint = new Endpoint(options.UpstreamEndpoint);
            }
            else
            {
                upstreamEndpoint = Endpoint.Default;
            }

            CompressedMetadataStore syncResult;

            string destinationFile;

            if (!string.IsNullOrEmpty(options.OutFile))
            {
                if (Path.GetExtension(options.OutFile).ToLower() != ".zip")
                {
                    ConsoleOutput.WriteRed("The out file must have .zip extension");
                    return;
                }

                destinationFile = options.OutFile;
            }
            else
            {
                destinationFile = $"QueryResult-{DateTime.Now.ToFileTime()}.zip";
            }

            Console.WriteLine($"Creating compressed metadata store {destinationFile}");
            syncResult = new CompressedMetadataStore(destinationFile, upstreamEndpoint);

            if (!string.IsNullOrEmpty(options.AccountName) &&
                !string.IsNullOrEmpty(options.AccountGuid))
            {
                if (!Guid.TryParse(options.AccountGuid, out Guid accountGuid))
                {
                    ConsoleOutput.WriteRed("The account GUID must be a valid GUID string");
                    return;
                }

                syncResult.SetUpstreamCredentials(options.AccountName, accountGuid);
            }

            FetchUpdates(null, syncResult);
        }
        /// <summary>
        /// Opens an updates metadata source the path specified on the command line
        /// </summary>
        /// <param name="sourceOptions">The command line switch that contains the path</param>
        /// <returns>A open updates metadata source</returns>
        public static IMetadataSource LoadMetadataSourceFromOptions(IMetadataSourceOptions sourceOptions)
        {
            IMetadataSource source = null;

            Console.Write("Opening update metadata source file... ");
            try
            {
                source = CompressedMetadataStore.Open(sourceOptions.MetadataSourcePath);
                ConsoleOutput.WriteGreen("Done!");
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                ConsoleOutput.WriteRed("Cannot open the query result file:");
                ConsoleOutput.WriteRed(ex.Message);
            }


            return(source);
        }