public async Task <bool> StopService(IProgressObject progress = null) { var disposeProgress = progress == null; var result = false; try { progress = progress ?? this.GetProgressObject(String.Empty); progress.Report(new ProgressDetails("Stopping Service")); await Task.Run(() => { result = ServiceControlInstance.TryStopService(); if (InMaintenanceMode) { ServiceControlInstance.DisableMaintenanceMode(); } }); UpdateServiceProperties(); return(result); } finally { if (disposeProgress) { progress.Dispose(); } } }
internal ReportCard Update(ServiceControlInstance instance, bool startService) { try { instance.ReportCard = new ReportCard(); instance.ValidateChanges(); if (instance.ReportCard.HasErrors) { instance.ReportCard.Status = Status.FailedValidation; return(instance.ReportCard); } if (!instance.TryStopService()) { instance.ReportCard.Errors.Add("Service failed to stop"); instance.ReportCard.Status = Status.Failed; return(instance.ReportCard); } instance.ApplyConfigChange(); if (!instance.ReportCard.HasErrors) { if (startService && !instance.TryStartService()) { instance.ReportCard.Warnings.Add($"Service did not start after changes - please check configuration for {instance.Name}"); } } instance.ReportCard.SetStatus(); return(instance.ReportCard); } finally { instance.Reload(); } }
public bool RemoveRemoteInstance(ServiceControlInstance instance, string[] remoteInstanceAddresses, ILogging log) { instance.ReportCard = new ReportCard(); var restartService = instance.Service.Status == ServiceControllerStatus.Running; if (!instance.TryStopService()) { logger.Error("Service failed to stop or service stop timed out"); } try { instance.RemoteInstances.RemoveAll(x => remoteInstanceAddresses.Contains(x.ApiUri, StringComparer.InvariantCultureIgnoreCase)); instance.ApplyConfigChange(); if (restartService && !instance.TryStartService()) { logger.Error("Service failed to start after removing remote instances - please check configuration for {0}", instance.Name); return(false); } } catch (Exception ex) { logger.Error("Removing remote instances Failed: {0}", ex.Message); return(false); } return(true); }
public bool Upgrade(ServiceControlInstance instance, InstanceUpgradeOptions options) { ZipInfo.ValidateZip(); var checkLicenseResult = CheckLicenseIsValid(); if (!checkLicenseResult.Valid) { logger.Error($"Upgrade aborted - {checkLicenseResult.Message}"); return(false); } instance.ReportCard = new ReportCard(); var restartService = instance.Service.Status == ServiceControllerStatus.Running; if (!instance.TryStopService()) { logger.Error("Service failed to stop or service stop timed out"); } try { var backupFile = instance.BackupAppConfig(); try { instance.UpgradeFiles(ZipInfo.FilePath); } finally { instance.RestoreAppConfig(backupFile); } options.ApplyChangesToInstance(instance); instance.SetupInstance(); if (instance.ReportCard.HasErrors) { foreach (var error in instance.ReportCard.Errors) { logger.Error(error); } return(false); } if (restartService && !instance.TryStartService()) { logger.Error("Service failed to start after update - please check configuration for {0}", instance.Name); return(false); } } catch (Exception ex) { logger.Error("Upgrade Failed: {0}", ex.Message); return(false); } return(true); }
internal ReportCard Upgrade(ServiceControlInstance instance, ServiceControlUpgradeOptions upgradeOptions, IProgress <ProgressDetails> progress = null) { progress = progress ?? new Progress <ProgressDetails>(); instance.ReportCard = new ReportCard(); ZipInfo.ValidateZip(); var totalSteps = 7 - (upgradeOptions.UpgradeInfo.DeleteIndexes ? 0 : 1) - (upgradeOptions.UpgradeInfo.DataBaseUpdate ? 0 : 1); var currentStep = 0; progress.Report(currentStep++, totalSteps, "Stopping instance..."); if (!instance.TryStopService()) { return(new ReportCard { Errors = { "Service failed to stop" }, Status = Status.Failed }); } progress.Report(currentStep++, totalSteps, "Backing up app.config..."); var backupFile = instance.BackupAppConfig(); try { progress.Report(currentStep++, totalSteps, "Upgrading Files..."); instance.UpgradeFiles(ZipInfo.FilePath); } finally { progress.Report(currentStep++, totalSteps, "Restoring app.config..."); instance.RestoreAppConfig(backupFile); } upgradeOptions.ApplyChangesToInstance(instance); if (upgradeOptions.UpgradeInfo.DeleteIndexes) { progress.Report(currentStep++, totalSteps, "Removing database indexes..."); instance.RemoveDatabaseIndexes(); } if (upgradeOptions.UpgradeInfo.DataBaseUpdate) { progress.Report(currentStep, totalSteps, "Updating Database..."); // ReSharper disable once AccessToModifiedClosure instance.UpdateDatabase(msg => progress.Report(currentStep, totalSteps, $"Updating Database...{Environment.NewLine}{msg}")); } progress.Report(++currentStep, totalSteps, "Running Queue Creation..."); instance.SetupInstance(); instance.ReportCard.SetStatus(); return(instance.ReportCard); }
internal bool Update(ServiceControlInstance instance, bool startService) { instance.ReportCard = new ReportCard(); instance.ValidateChanges(); if (instance.ReportCard.HasErrors) { foreach (var error in instance.ReportCard.Errors) { logger.Error(error); } return(false); } try { if (!instance.TryStopService()) { logger.Error("Service failed to stop"); return(false); } instance.ApplyConfigChange(); if (instance.ReportCard.HasErrors) { foreach (var error in instance.ReportCard.Errors) { logger.Error(error); } return(false); } if (startService && !instance.TryStartService()) { logger.Error("Service failed to start after changes - please check configuration for {0}", instance.Name); return(false); } } catch (Exception ex) { logger.Error("Update failed: {0}", ex.Message); return(false); } return(true); }
public bool AddRemoteInstance(ServiceControlInstance instance, string[] remoteInstanceAddresses, ILogging log) { if (Compatibility.RemoteInstancesDoNotNeedQueueAddress.SupportedFrom > instance.Version) { log.Error($"Cannot add remote instances to instances older than {Compatibility.RemoteInstancesDoNotNeedQueueAddress.SupportedFrom}"); return(false); } instance.ReportCard = new ReportCard(); var restartService = instance.Service.Status == ServiceControllerStatus.Running; if (!instance.TryStopService()) { logger.Error("Service failed to stop or service stop timed out"); } try { foreach (var remoteInstanceAddress in remoteInstanceAddresses) { instance.AddRemoteInstance(remoteInstanceAddress); } instance.ApplyConfigChange(); if (restartService && !instance.TryStartService()) { logger.Error("Service failed to start after adding remote instances - please check configuration for {0}", instance.Name); return(false); } } catch (Exception ex) { logger.Error("Adding remote instances Failed: {0}", ex.Message); return(false); } return(true); }
public bool Upgrade(ServiceControlInstance instance, ServiceControlUpgradeOptions options) { if (instance.Version < options.UpgradeInfo.CurrentMinimumVersion) { logger.Error($"Upgrade aborted. An interim upgrade to version {options.UpgradeInfo.RecommendedUpgradeVersion} is required before upgrading to version {ZipInfo.Version}. Download available at https://github.com/Particular/ServiceControl/releases/tag/{options.UpgradeInfo.RecommendedUpgradeVersion}"); return(false); } ZipInfo.ValidateZip(); var checkLicenseResult = CheckLicenseIsValid(); if (!checkLicenseResult.Valid) { logger.Error($"Upgrade aborted - {checkLicenseResult.Message}"); return(false); } instance.ReportCard = new ReportCard(); var restartService = instance.Service.Status == ServiceControllerStatus.Running; if (!instance.TryStopService()) { logger.Error("Service failed to stop or service stop timed out"); } try { var backupFile = instance.BackupAppConfig(); try { instance.UpgradeFiles(ZipInfo.FilePath); } finally { instance.RestoreAppConfig(backupFile); } options.ApplyChangesToInstance(instance); if (options.UpgradeInfo.DeleteIndexes) { instance.RemoveDatabaseIndexes(); } if (options.UpgradeInfo.DataBaseUpdate) { instance.UpdateDatabase(msg => { }); } instance.SetupInstance(); if (instance.ReportCard.HasErrors) { foreach (var error in instance.ReportCard.Errors) { logger.Error(error); } return(false); } if (restartService && !instance.TryStartService()) { logger.Error("Service failed to start after update - please check configuration for {0}", instance.Name); return(false); } } catch (Exception ex) { logger.Error("Upgrade Failed: {0}", ex.Message); return(false); } return(true); }