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); } }
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); } }
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); } }