Exemple #1
0
        public async Task <List <CertificateRequestResult> > PerformRenewalAllManagedSites(bool autoRenewalOnly = true, Dictionary <string, Progress <RequestProgressState> > progressTrackers = null)
        {
            await Task.Delay(200); //allow UI to update

            //currently the vault won't let us run parallel requests due to file locks
            bool performRequestsInParallel = false;
            bool testModeOnly = false;

            siteManager.LoadSettings();

            IEnumerable <ManagedSite> sites = siteManager.GetManagedSites();

            if (autoRenewalOnly)
            {
                sites = sites.Where(s => s.IncludeInAutoRenew == true);
            }

            //check site list and examine current certificates. If certificate is less than 7 days old, don't attempt to renew it
            var sitesToRenew = new List <ManagedSite>();

            var renewalTasks = new List <Task <CertificateRequestResult> >();

            foreach (var s in sites.Where(s => s.IncludeInAutoRenew == true))
            {
                //if we know the last renewal date, check whether we shoudl renew again, otherwise assume it's more than 30 days ago by default and attempt renewal
                var timeSinceLastRenewal = (s.DateRenewed != null ? s.DateRenewed : DateTime.Now.AddDays(-30)) - DateTime.Now;
                if (Math.Abs(timeSinceLastRenewal.Value.TotalDays) > RENEWAL_THRESHOLD_DAYS)
                {
                    //get matching progress tracker for this site
                    IProgress <RequestProgressState> tracker = null;
                    if (progressTrackers != null)
                    {
                        tracker = progressTrackers[s.Id];
                    }
                    if (testModeOnly)
                    {
                        //simulated request for UI testing
                        renewalTasks.Add(this.PerformDummyCertificateRequest(null, s, tracker));
                    }
                    else
                    {
                        renewalTasks.Add(this.PerformCertificateRequest(null, s, tracker));
                    }
                }
                else
                {
                    if (progressTrackers != null)
                    {
                        //send progress back to report skip
                        var progress = (IProgress <RequestProgressState>)progressTrackers[s.Id];
                        if (progress != null)
                        {
                            progress.Report(new RequestProgressState {
                                CurrentState = RequestState.Success, Message = "Skipping Renewal, existing certificate still OK."
                            });
                        }
                    }

                    ManagedSiteLog.AppendLog(s.Id, new ManagedSiteLogItem {
                        EventDate = DateTime.UtcNow, LogItemType = LogItemType.GeneralInfo, Message = "Skipping Renewal, existing certificate still OK: " + s.Name
                    });
                }
            }

            if (!renewalTasks.Any())
            {
                //nothing to do
                return(new List <CertificateRequestResult>());
            }

            if (performRequestsInParallel)
            {
                var results = await Task.WhenAll(renewalTasks);

                //siteManager.StoreSettings();
                return(results.ToList());
            }
            else
            {
                var results = new List <CertificateRequestResult>();
                foreach (var t in renewalTasks)
                {
                    results.Add(await t);
                }

                return(results);
            }
        }
Exemple #2
0
        public async Task <List <CertificateRequestResult> > PerformRenewalAllManagedSites(bool autoRenewalOnly = true, Dictionary <string, Progress <RequestProgressState> > progressTrackers = null)
        {
            await Task.Delay(200); //allow UI to update

            //currently the vault won't let us run parallel requests due to file locks
            bool performRequestsInParallel = false;

            bool testModeOnly = false;

            _siteManager.LoadSettings();

            IEnumerable <ManagedSite> sites = _siteManager.GetManagedSites();

            if (autoRenewalOnly)
            {
                sites = sites.Where(s => s.IncludeInAutoRenew == true);
            }

            // check site list and examine current certificates. If certificate is less than n days
            // old, don't attempt to renew it
            var sitesToRenew        = new List <ManagedSite>();
            var renewalIntervalDays = CoreAppSettings.Current.RenewalIntervalDays;

            int numRenewalTasks = 0;
            int maxRenewalTasks = CoreAppSettings.Current.MaxRenewalRequests;

            var renewalTasks = new List <Task <CertificateRequestResult> >();

            foreach (var s in sites.Where(s => s.IncludeInAutoRenew == true))
            {
                // determine if this site requires renewal
                bool isRenewalRequired = IsRenewalRequired(s, renewalIntervalDays);

                //if we care about stopped sites being stopped, check for that
                bool isSiteRunning = true;
                if (!CoreAppSettings.Current.IgnoreStoppedSites)
                {
                    isSiteRunning = IsManagedSiteRunning(s.Id);
                }

                if (isRenewalRequired && isSiteRunning)
                {
                    //get matching progress tracker for this site
                    IProgress <RequestProgressState> tracker = null;
                    if (progressTrackers != null)
                    {
                        tracker = progressTrackers[s.Id];
                    }

                    // optionally limit the number of renewal tasks to attempt in this pass
                    if (maxRenewalTasks == 0 || maxRenewalTasks > 0 && numRenewalTasks < maxRenewalTasks)
                    {
                        if (testModeOnly)
                        {
                            //simulated request for UI testing
                            renewalTasks.Add(this.PerformDummyCertificateRequest(s, tracker));
                        }
                        else
                        {
                            renewalTasks.Add(this.PerformCertificateRequest(s, tracker));
                        }
                    }
                    numRenewalTasks++;
                }
                else
                {
                    var msg = CoreSR.CertifyManager_SkipRenewalOk;

                    if (isRenewalRequired && !isSiteRunning)
                    {
                        //TODO: show this as warning rather than success
                        msg = CoreSR.CertifyManager_SiteStopped;
                    }

                    if (progressTrackers != null)
                    {
                        //send progress back to report skip
                        var progress = (IProgress <RequestProgressState>)progressTrackers[s.Id];
                        if (progress != null)
                        {
                            progress.Report(new RequestProgressState {
                                CurrentState = RequestState.Success, Message = msg
                            });
                        }
                    }

                    ManagedSiteLog.AppendLog(s.Id, new ManagedSiteLogItem {
                        EventDate = DateTime.UtcNow, LogItemType = LogItemType.GeneralInfo, Message = msg + s.Name
                    });
                }
            }

            if (!renewalTasks.Any())
            {
                //nothing to do
                return(new List <CertificateRequestResult>());
            }

            if (performRequestsInParallel)
            {
                var results = await Task.WhenAll(renewalTasks);

                //siteManager.StoreSettings();
                return(results.ToList());
            }
            else
            {
                var results = new List <CertificateRequestResult>();
                foreach (var t in renewalTasks)
                {
                    results.Add(await t);
                }

                return(results);
            }
        }
Exemple #3
0
        public async Task <List <CertificateRequestResult> > PerformRenewalAllManagedSites(bool autoRenewalOnly = true, Dictionary <string, Progress <RequestProgressState> > progressTrackers = null)
        {
            await Task.Delay(200); //allow UI to update

            //currently the vault won't let us run parallel requests due to file locks
            bool performRequestsInParallel = false;
            bool testModeOnly = false;

            siteManager.LoadSettings();

            IEnumerable <ManagedSite> sites = siteManager.GetManagedSites();

            if (autoRenewalOnly)
            {
                sites = sites.Where(s => s.IncludeInAutoRenew == true);
            }

            //check site list and examine current certificates. If certificate is less than n days old, don't attempt to renew it
            var sitesToRenew        = new List <ManagedSite>();
            var renewalIntervalDays = Properties.Settings.Default.RenewalIntervalDays;

#if DEBUG
            //in debug mode we renew every time instead of skipping based on days old
            renewalIntervalDays = 0;
#endif

            var renewalTasks = new List <Task <CertificateRequestResult> >();
            foreach (var s in sites.Where(s => s.IncludeInAutoRenew == true))
            {
                //if we know the last renewal date, check whether we should renew again, otherwise assume it's more than 30 days ago by default and attempt renewal
                var timeSinceLastRenewal = (s.DateRenewed != null ? s.DateRenewed : DateTime.Now.AddDays(-30)) - DateTime.Now;

                bool isRenewalRequired = Math.Abs(timeSinceLastRenewal.Value.TotalDays) > renewalIntervalDays;
                bool isSiteRunning     = true;

                //if we care about stopped sites being stopped, check for that
                if (Properties.Settings.Default.IgnoreStoppedSites)
                {
                    isSiteRunning = IsManagedSiteRunning(s.Id);
                }

                if (isRenewalRequired && isSiteRunning)
                {
                    //get matching progress tracker for this site
                    IProgress <RequestProgressState> tracker = null;
                    if (progressTrackers != null)
                    {
                        tracker = progressTrackers[s.Id];
                    }

                    if (testModeOnly)
                    {
                        //simulated request for UI testing
                        renewalTasks.Add(this.PerformDummyCertificateRequest(null, s, tracker));
                    }
                    else
                    {
                        renewalTasks.Add(this.PerformCertificateRequest(null, s, tracker));
                    }
                }
                else
                {
                    var msg = "Skipping Renewal, existing certificate still OK. ";

                    if (isRenewalRequired && !isSiteRunning)
                    {
                        //TODO: show this as warning rather than success
                        msg = "Site stopped, renewal skipped as domain validation cannot be performed. ";
                    }

                    if (progressTrackers != null)
                    {
                        //send progress back to report skip
                        var progress = (IProgress <RequestProgressState>)progressTrackers[s.Id];
                        if (progress != null)
                        {
                            progress.Report(new RequestProgressState {
                                CurrentState = RequestState.Success, Message = msg
                            });
                        }
                    }

                    ManagedSiteLog.AppendLog(s.Id, new ManagedSiteLogItem {
                        EventDate = DateTime.UtcNow, LogItemType = LogItemType.GeneralInfo, Message = msg + s.Name
                    });
                }
            }

            if (!renewalTasks.Any())
            {
                //nothing to do
                return(new List <CertificateRequestResult>());
            }

            if (performRequestsInParallel)
            {
                var results = await Task.WhenAll(renewalTasks);

                //siteManager.StoreSettings();
                return(results.ToList());
            }
            else
            {
                var results = new List <CertificateRequestResult>();
                foreach (var t in renewalTasks)
                {
                    results.Add(await t);
                }

                return(results);
            }
        }