Example #1
0
        public virtual void InvalidUpgradeRing()
        {
            this.SetUpgradeRing("Invalid");

            string expectedError = "Invalid upgrade ring `Invalid` specified in gvfs config.";
            string errorString;

            GitHubUpgrader.Create(this.LocalConfig, this.Tracer, out errorString).ShouldBeNull();
            errorString.ShouldContain(expectedError);
        }
Example #2
0
        public virtual void InvalidUpgradeRing()
        {
            this.SetUpgradeRing("Invalid");

            string expectedError = "Invalid upgrade ring `Invalid` specified in scalar config.";
            string errorString;

            GitHubUpgrader.Create(
                this.Tracer,
                this.FileSystem,
                dryRun: false,
                noVerify: false,
                localConfig: this.LocalConfig,
                error: out errorString).ShouldBeNull();

            errorString.ShouldContain(expectedError);
        }
        private bool TryQueryForNewerVersion(ITracer tracer, GitHubUpgrader productUpgrader, out Version newVersion, out string errorMessage)
        {
            errorMessage = null;
            tracer.RelatedInfo($"Querying server for latest version in ring {productUpgrader.Config.UpgradeRing}...");

            if (!productUpgrader.TryQueryNewestVersion(out newVersion, out string detailedError))
            {
                errorMessage = "Could not fetch new version info. " + detailedError;
                return(false);
            }

            string logMessage = newVersion == null ? "No newer versions available." : $"Newer version available: {newVersion}.";

            tracer.RelatedInfo(logMessage);

            return(true);
        }
Example #4
0
        private void TimerCallback(object unusedState)
        {
            string errorMessage = null;

            using (ITracer activity = this.tracer.StartActivity("Checking for product upgrades.", EventLevel.Informational))
            {
                try
                {
                    ProductUpgraderInfo info = new ProductUpgraderInfo(
                        this.tracer,
                        this.fileSystem);

                    ProductUpgrader.TryCreateUpgrader(
                        this.tracer,
                        this.fileSystem,
                        new LocalScalarConfig(),
                        credentialStore: null,
                        dryRun: false,
                        noVerify: false,
                        newUpgrader: out ProductUpgrader productUpgrader,
                        error: out errorMessage);

                    if (productUpgrader == null)
                    {
                        string message = string.Format(
                            "{0}.{1}: failed to create upgrader: {2}",
                            nameof(ProductUpgradeTimer),
                            nameof(this.TimerCallback),
                            errorMessage);

                        activity.RelatedWarning(
                            metadata: new EventMetadata(),
                            message: message,
                            keywords: Keywords.Telemetry);

                        info.RecordHighestAvailableVersion(highestAvailableVersion: null);
                        return;
                    }

                    if (!productUpgrader.SupportsAnonymousVersionQuery)
                    {
                        // If this is a NuGetUpgrader that does not support anonymous version query,
                        // fall back to using the GitHubUpgrader, to preserve existing behavior.
                        // Once we have completely transitioned to using the anonymous endpoint,
                        // we can remove this code.
                        if (productUpgrader is NuGetUpgrader)
                        {
                            productUpgrader = GitHubUpgrader.Create(
                                this.tracer,
                                this.fileSystem,
                                new LocalScalarConfig(),
                                dryRun: false,
                                noVerify: false,
                                error: out errorMessage);

                            if (productUpgrader == null)
                            {
                                string gitHubUpgraderFailedMessage = string.Format(
                                    "{0}.{1}: GitHubUpgrader.Create failed to create upgrader: {2}",
                                    nameof(ProductUpgradeTimer),
                                    nameof(this.TimerCallback),
                                    errorMessage);

                                activity.RelatedWarning(
                                    metadata: new EventMetadata(),
                                    message: gitHubUpgraderFailedMessage,
                                    keywords: Keywords.Telemetry);

                                info.RecordHighestAvailableVersion(highestAvailableVersion: null);
                                return;
                            }
                        }
                        else
                        {
                            errorMessage = string.Format(
                                "{0}.{1}: Configured Product Upgrader does not support anonymous version queries.",
                                nameof(ProductUpgradeTimer),
                                nameof(this.TimerCallback),
                                errorMessage);

                            activity.RelatedWarning(
                                metadata: new EventMetadata(),
                                message: errorMessage,
                                keywords: Keywords.Telemetry);

                            info.RecordHighestAvailableVersion(highestAvailableVersion: null);
                            return;
                        }
                    }

                    InstallerPreRunChecker prerunChecker = new InstallerPreRunChecker(this.tracer, string.Empty);
                    if (!prerunChecker.TryRunPreUpgradeChecks(out errorMessage))
                    {
                        string message = string.Format(
                            "{0}.{1}: PreUpgradeChecks failed with: {2}",
                            nameof(ProductUpgradeTimer),
                            nameof(this.TimerCallback),
                            errorMessage);

                        activity.RelatedWarning(
                            metadata: new EventMetadata(),
                            message: message,
                            keywords: Keywords.Telemetry);

                        info.RecordHighestAvailableVersion(highestAvailableVersion: null);
                        return;
                    }

                    if (!productUpgrader.UpgradeAllowed(out errorMessage))
                    {
                        errorMessage = errorMessage ??
                                       $"{nameof(ProductUpgradeTimer)}.{nameof(this.TimerCallback)}: Upgrade is not allowed, but no reason provided.";
                        activity.RelatedWarning(
                            metadata: new EventMetadata(),
                            message: errorMessage,
                            keywords: Keywords.Telemetry);

                        info.RecordHighestAvailableVersion(highestAvailableVersion: null);
                        return;
                    }

                    if (!this.TryQueryForNewerVersion(
                            activity,
                            productUpgrader,
                            out Version newerVersion,
                            out errorMessage))
                    {
                        string message = string.Format(
                            "{0}.{1}: TryQueryForNewerVersion failed with: {2}",
                            nameof(ProductUpgradeTimer),
                            nameof(this.TimerCallback),
                            errorMessage);

                        activity.RelatedWarning(
                            metadata: new EventMetadata(),
                            message: message,
                            keywords: Keywords.Telemetry);

                        info.RecordHighestAvailableVersion(highestAvailableVersion: null);
                        return;
                    }

                    info.RecordHighestAvailableVersion(highestAvailableVersion: newerVersion);

                    this.DisplayUpgradeAvailableToast(newerVersion.ToString());
                }
                catch (Exception ex) when(
                    ex is IOException ||
                    ex is UnauthorizedAccessException ||
                    ex is NotSupportedException)
                {
                    this.tracer.RelatedWarning(
                        CreateEventMetadata(ex),
                        "Exception encountered recording highest available version");
                }
                catch (Exception ex)
                {
                    this.tracer.RelatedError(
                        CreateEventMetadata(ex),
                        "Unhanlded exception encountered recording highest available version");
                    Environment.Exit((int)ReturnCode.GenericError);
                }
            }
        }
        private void TimerCallback(object unusedState)
        {
            string errorMessage = null;

            using (ITracer activity = this.tracer.StartActivity("Checking for product upgrades.", EventLevel.Informational))
            {
                try
                {
                    ProductUpgraderInfo info = new ProductUpgraderInfo(
                        this.tracer,
                        this.fileSystem);

                    // The upgrade check always goes against GitHub
                    GitHubUpgrader productUpgrader = GitHubUpgrader.Create(
                        this.tracer,
                        this.fileSystem,
                        dryRun: false,
                        noVerify: false,
                        error: out errorMessage);

                    if (productUpgrader == null)
                    {
                        string message = string.Format(
                            "{0}.{1}: GitHubUpgrader.Create failed to create upgrader: {2}",
                            nameof(ProductUpgradeTimer),
                            nameof(this.TimerCallback),
                            errorMessage);

                        activity.RelatedWarning(
                            metadata: new EventMetadata(),
                            message: message,
                            keywords: Keywords.Telemetry);

                        info.RecordHighestAvailableVersion(highestAvailableVersion: null);
                        return;
                    }

                    InstallerPreRunChecker prerunChecker = new InstallerPreRunChecker(this.tracer, string.Empty);
                    if (!prerunChecker.TryRunPreUpgradeChecks(out errorMessage))
                    {
                        string message = string.Format(
                            "{0}.{1}: PreUpgradeChecks failed with: {2}",
                            nameof(ProductUpgradeTimer),
                            nameof(this.TimerCallback),
                            errorMessage);

                        activity.RelatedWarning(
                            metadata: new EventMetadata(),
                            message: message,
                            keywords: Keywords.Telemetry);

                        info.RecordHighestAvailableVersion(highestAvailableVersion: null);
                        return;
                    }

                    if (!productUpgrader.UpgradeAllowed(out errorMessage))
                    {
                        errorMessage = errorMessage ??
                                       $"{nameof(ProductUpgradeTimer)}.{nameof(this.TimerCallback)}: Upgrade is not allowed, but no reason provided.";
                        activity.RelatedWarning(
                            metadata: new EventMetadata(),
                            message: errorMessage,
                            keywords: Keywords.Telemetry);

                        info.RecordHighestAvailableVersion(highestAvailableVersion: null);
                        return;
                    }

                    if (!this.TryQueryForNewerVersion(
                            activity,
                            productUpgrader,
                            out Version newerVersion,
                            out errorMessage))
                    {
                        string message = string.Format(
                            "{0}.{1}: TryQueryForNewerVersion failed with: {2}",
                            nameof(ProductUpgradeTimer),
                            nameof(this.TimerCallback),
                            errorMessage);

                        activity.RelatedWarning(
                            metadata: new EventMetadata(),
                            message: message,
                            keywords: Keywords.Telemetry);

                        info.RecordHighestAvailableVersion(highestAvailableVersion: null);
                        return;
                    }

                    info.RecordHighestAvailableVersion(highestAvailableVersion: newerVersion);
                }
                catch (Exception ex) when(
                    ex is IOException ||
                    ex is UnauthorizedAccessException ||
                    ex is NotSupportedException)
                {
                    this.tracer.RelatedWarning(
                        CreateEventMetadata(ex),
                        "Exception encountered recording highest available version");
                }
                catch (Exception ex)
                {
                    this.tracer.RelatedError(
                        CreateEventMetadata(ex),
                        "Unhanlded exception encountered recording highest available version");
                    Environment.Exit((int)ReturnCode.GenericError);
                }
            }
        }