public override async Task ExecuteAsync(InstanceDetailsViewModel model) { if (LicenseChecks) { var licenseCheckResult = serviceControlInstaller.CheckLicenseIsValid(); if (!licenseCheckResult.Valid) { windowManager.ShowMessage("LICENSE ERROR", $"Upgrade could not continue due to an issue with the current license. {licenseCheckResult.Message}. Contact [email protected]", hideCancel: true); return; } } var instance = InstanceFinder.FindInstanceByName <ServiceControlAuditInstance>(model.Name); instance.Service.Refresh(); var upgradeInfo = UpgradeControl.GetUpgradeInfoForTargetVersion(serviceControlInstaller.ZipInfo.Version, instance.Version); var upgradeOptions = new ServiceControlUpgradeOptions { UpgradeInfo = upgradeInfo }; if (instance.Service.Status != ServiceControllerStatus.Stopped && !windowManager.ShowYesNoDialog($"STOP INSTANCE AND UPGRADE TO {serviceControlInstaller.ZipInfo.Version}", $"{model.Name} needs to be stopped in order to upgrade to version {serviceControlInstaller.ZipInfo.Version}.", "Do you want to proceed?", "Yes, I want to proceed", "No")) { return; } await UpgradeAuditInstance(model, instance, upgradeOptions); eventAggregator.PublishOnUIThread(new RefreshInstances()); }
public void ChangeConfigTests() { var logger = new TestLogger(); var installer = new UnattendServiceControlInstaller(logger, DeploymentCache); logger.Info("Deleting instances"); DeleteInstance(); logger.Info("Removing the test queue instances"); RemoveAltMSMQQueues(); logger.Info("Recreating the MSMQ instance"); CreateInstanceMSMQ(); logger.Info("Changing the URLACL"); var msmqTestInstance = InstanceFinder.ServiceControlInstances().First(p => p.Name.Equals("Test.ServiceControl.MSMQ", StringComparison.OrdinalIgnoreCase)); msmqTestInstance.HostName = Environment.MachineName; msmqTestInstance.Port = 33338; installer.Update(msmqTestInstance, true); Assert.IsTrue(msmqTestInstance.Service.Status == ServiceControllerStatus.Running, "Update URL change failed"); logger.Info("Changing LogPath"); msmqTestInstance = InstanceFinder.ServiceControlInstances().First(p => p.Name.Equals("Test.ServiceControl.MSMQ", StringComparison.OrdinalIgnoreCase)); msmqTestInstance.LogPath = @"c:\temp\testloggingchange"; installer.Update(msmqTestInstance, true); Assert.IsTrue(msmqTestInstance.Service.Status == ServiceControllerStatus.Running, "Update Logging changed failed"); logger.Info("Updating Queue paths"); msmqTestInstance = InstanceFinder.ServiceControlInstances().First(p => p.Name.Equals("Test.ServiceControl.MSMQ", StringComparison.OrdinalIgnoreCase)); msmqTestInstance.AuditQueue = "alternateAudit"; msmqTestInstance.ErrorQueue = "alternateError"; installer.Update(msmqTestInstance, true); Assert.IsTrue(msmqTestInstance.Service.Status == ServiceControllerStatus.Running, "Update Queues changed failed"); }
protected override void ProcessRecord() { var psPath = SessionState.Path.GetUnresolvedProviderPathFromPSPath(UnattendFile, out _, out _); var details = ServiceControlNewInstance.Load(psPath); details.ServiceAccount = ServiceAccount; details.ServiceAccountPwd = Password; var zipfolder = Path.GetDirectoryName(MyInvocation.MyCommand.Module.Path); var logger = new PSLogger(Host); var installer = new UnattendServiceControlInstaller(logger, zipfolder); try { logger.Info("Installing Service Control instance..."); if (installer.Add(details, PromptToProceed)) { var instance = InstanceFinder.FindServiceControlInstance(details.Name); if (instance != null) { WriteObject(PsServiceControl.FromInstance(instance)); } else { throw new Exception("Unknown error creating instance"); } } } catch (Exception ex) { ThrowTerminatingError(new ErrorRecord(ex, null, ErrorCategory.NotSpecified, null)); } }
public MonitoringAddViewModel() { DisplayName = "ADD MONITORING INSTANCE"; SelectDestinationPath = new SelectPathCommand(p => DestinationPath = p, isFolderPicker: true, defaultPath: DestinationPath); SelectLogPath = new SelectPathCommand(p => LogPath = p, isFolderPicker: true, defaultPath: LogPath); var monitoringInstances = InstanceFinder.MonitoringInstances(); if (!monitoringInstances.Any()) { InstanceName = "Particular.Monitoring"; PortNumber = "33633"; } else { var i = 0; while (true) { InstanceName = $"Particular.Monitoring.{++i}"; if (!monitoringInstances.Any(p => p.Name.Equals(InstanceName, StringComparison.OrdinalIgnoreCase))) { break; } } } Description = "A Monitoring Instance"; HostName = "localhost"; ErrorQueueName = "error"; UseSystemAccount = true; }
protected override void ProcessRecord() { var logger = new PSLogger(Host); var zipFolder = Path.GetDirectoryName(MyInvocation.MyCommand.Module.Path); var installer = new UnattendServiceControlInstaller(logger, zipFolder); var instance = InstanceFinder.FindInstanceByName <ServiceControlInstance>(Name); if (instance == null) { WriteWarning($"No action taken. An instance called {Name} was not found"); return; } var requiredUpgradeAction = instance.GetRequiredUpgradeAction(installer.ZipInfo.Version); switch (requiredUpgradeAction) { case RequiredUpgradeAction.Upgrade: PerformUpgrade(instance, installer); break; case RequiredUpgradeAction.SplitOutAudit: PerformSplit(instance, logger, zipFolder); break; default: ThrowTerminatingError(new ErrorRecord(new Exception($"Upgrade of {instance.Name} aborted. This instance cannot be upgraded."), "UpgradeFailure", ErrorCategory.InvalidResult, null)); break; } }
public static List <string> UsedPaths(string instanceName = null) { var monitoringInstances = InstanceFinder.MonitoringInstances(); var serviceControlAuditInstances = InstanceFinder.ServiceControlAuditInstances(); var serviceControlInstances = InstanceFinder.ServiceControlInstances(); var result = new List <string>(); result.AddRange(monitoringInstances .Where(p => string.IsNullOrWhiteSpace(instanceName) || p.Name != instanceName) .SelectMany(p => new[] { p.LogPath, p.InstallPath })); result.AddRange(serviceControlAuditInstances .Where(p => string.IsNullOrWhiteSpace(instanceName) || p.Name != instanceName) .SelectMany(p => new[] { p.LogPath, p.DBPath, p.InstallPath })); result.AddRange(serviceControlInstances .Where(p => string.IsNullOrWhiteSpace(instanceName) || p.Name != instanceName) .SelectMany(p => new[] { p.LogPath, p.DBPath, p.InstallPath })); return(result.Distinct().ToList()); }
public static List <string> UsedPorts(string instanceName = null) { var monitoringInstances = InstanceFinder.MonitoringInstances(); var serviceControlAuditInstances = InstanceFinder.ServiceControlAuditInstances(); var serviceControlInstances = InstanceFinder.ServiceControlInstances(); var result = new List <string>(); result.AddRange(monitoringInstances .Where(p => string.IsNullOrWhiteSpace(instanceName) || p.Name != instanceName) .Select(p => p.Port.ToString())); result.AddRange(serviceControlInstances .Where(p => string.IsNullOrWhiteSpace(instanceName) || p.Name != instanceName) .SelectMany(p => new[] { p.Port.ToString(), p.DatabaseMaintenancePort.ToString() })); result.AddRange(serviceControlAuditInstances .Where(p => string.IsNullOrWhiteSpace(instanceName) || p.Name != instanceName) .SelectMany(p => new[] { p.Port.ToString(), p.DatabaseMaintenancePort.ToString() })); return(result.Distinct().ToList()); }
protected SharedServiceControlEditorViewModelValidator() { ServiceControlInstances = InstanceFinder.ServiceControlInstances(); RuleFor(x => x.InstanceName) .NotEmpty() .MustNotContainWhitespace() .When(x => x.SubmitAttempted); RuleFor(x => x.HostName) .NotEmpty().When(x => x.SubmitAttempted); RuleFor(x => x.PortNumber) .NotEmpty() .ValidPort() .MustNotBeIn(x => UsedPorts(x.InstanceName)) .WithMessage(Validations.MSG_MUST_BE_UNIQUE, "Ports") .When(x => x.SubmitAttempted); RuleFor(x => x.LogPath) .NotEmpty() .ValidPath() .MustNotBeIn(x => UsedPaths(x.InstanceName)) .WithMessage(Validations.MSG_MUST_BE_UNIQUE, "Paths") .When(x => x.SubmitAttempted); }
private void RefreshInstances() { Instances.Clear(); foreach (var item in InstanceFinder.AllInstances()) { Instances.Add(instanceDetailsFunc(item)); } }
public void Handle(ResetInstances message) { Instances.Clear(); foreach (var item in InstanceFinder.AllInstances()) { Instances.Add(instanceDetailsFunc(item)); } }
public static ActionResult ServiceControlInstanceCount(Session session) { var instanceCount = InstanceFinder.ServiceControlInstances().Count + InstanceFinder.MonitoringInstances().Count; session["SCINSTANCECOUNT"] = instanceCount.ToString(); return(ActionResult.Success); }
public static void Validate(ServiceControlInstance instance) { var validator = new ServiceControlQueueNameValidator(instance) { Instances = InstanceFinder.ServiceControlInstances().Where(p => p.Name != instance.Name & p.TransportPackage.Equals(instance.TransportPackage, StringComparison.OrdinalIgnoreCase)).AsEnumerable <IServiceControlTransportConfig>().ToList() }; validator.RunValidation(); }
void RefreshInstances() { var missingInstances = InstanceFinder.AllInstances().Where(i => !Instances.Any(existingInstance => existingInstance.Name == i.Name)); foreach (var item in missingInstances) { Instances.Add(instanceDetailsFunc(item)); } }
public void Handle(ResetInstances message) { Instances.Clear(); foreach (var item in InstanceFinder.AllInstances().OrderBy(i => i.Name)) { Instances.Add(instanceDetailsFunc(item)); } NotifyOfPropertyChange(nameof(OrderedInstances)); }
public void DeleteInstance() { var installer = new UnattendServiceControlInstaller(new TestLogger(), DeploymentCache); foreach (var instance in InstanceFinder.ServiceControlInstances().Where(p => p.Name.StartsWith("Test.ServiceControl", StringComparison.OrdinalIgnoreCase))) { installer.Delete(instance.Name, true, true); } }
public MaintenancePortValidator() { ServiceControlInstances = InstanceFinder.ServiceControlInstances(); RuleFor(x => x.Value) .NotEmpty() .ValidPort() .MustNotBeIn(x => UsedPorts()) .WithMessage(Validations.MSG_MUST_BE_UNIQUE, "Ports"); }
public static void Validate(IServiceControlAuditInstance instance) { var validator = new QueueNameValidator(instance) { SCInstances = InstanceFinder.ServiceControlInstances().Where(p => p.Name != instance.Name & p.TransportPackage.Equals(instance.TransportPackage)).AsEnumerable <IServiceControlInstance>().ToList(), AuditInstances = InstanceFinder.ServiceControlAuditInstances().Where(p => p.Name != instance.Name & p.TransportPackage.Equals(instance.TransportPackage)).AsEnumerable <IServiceControlAuditInstance>().ToList(), }; validator.RunValidation(); }
protected override void ProcessRecord() { var logger = new PSLogger(Host); var zipFolder = Path.GetDirectoryName(MyInvocation.MyCommand.Module.Path); var installer = new UnattendServiceControlInstaller(logger, zipFolder); foreach (var name in Name) { var options = new ServiceControlUpgradeOptions { AuditRetentionPeriod = AuditRetentionPeriod, ErrorRetentionPeriod = ErrorRetentionPeriod, OverrideEnableErrorForwarding = ForwardErrorMessages, SkipQueueCreation = SkipQueueCreation }; var instance = InstanceFinder.FindServiceControlInstance(name); if (instance == null) { WriteWarning($"No action taken. An instance called {name} was not found"); break; } options.OverrideEnableErrorForwarding = ForwardErrorMessages; // Migrate Value if (!options.AuditRetentionPeriod.HasValue) { if (instance.AppConfig.AppSettingExists(SettingsList.HoursToKeepMessagesBeforeExpiring.Name)) { var i = instance.AppConfig.Read(SettingsList.HoursToKeepMessagesBeforeExpiring.Name, -1); if (i != -1) { options.AuditRetentionPeriod = TimeSpan.FromHours(i); } } } if (!options.OverrideEnableErrorForwarding.HasValue & !instance.AppConfig.AppSettingExists(SettingsList.ForwardErrorMessages.Name)) { ThrowTerminatingError(new ErrorRecord(new Exception($"Upgrade of {instance.Name} aborted. ForwardErrorMessages parameter must be set to true or false because the configuration file has no setting for ForwardErrorMessages. This setting is mandatory as of version 1.12"), "UpgradeFailure", ErrorCategory.InvalidArgument, null)); } if (!options.ErrorRetentionPeriod.HasValue & !instance.AppConfig.AppSettingExists(SettingsList.ErrorRetentionPeriod.Name)) { ThrowTerminatingError(new ErrorRecord(new Exception($"Upgrade of {instance.Name} aborted. ErrorRetentionPeriod parameter must be set to timespan because the configuration file has no setting for ErrorRetentionPeriod. This setting is mandatory as of version 1.13"), "UpgradeFailure", ErrorCategory.InvalidArgument, null)); } if (!options.AuditRetentionPeriod.HasValue & !instance.AppConfig.AppSettingExists(SettingsList.AuditRetentionPeriod.Name)) { ThrowTerminatingError(new ErrorRecord(new Exception($"Upgrade of {instance.Name} aborted. AuditRetentionPeriod parameter must be set to timespan because the configuration file has no setting for AuditRetentionPeriod. This setting is mandatory as of version 1.13"), "UpgradeFailure", ErrorCategory.InvalidArgument, null)); } if (!installer.Upgrade(instance, options)) { ThrowTerminatingError(new ErrorRecord(new Exception($"Upgrade of {instance.Name} failed"), "UpgradeFailure", ErrorCategory.InvalidResult, null)); } } }
protected override void ProcessRecord() { var details = new ServiceControlNewInstance { InstallPath = InstallPath, LogPath = LogPath, DBPath = DBPath, Name = Name, DisplayName = string.IsNullOrWhiteSpace(DisplayName) ? Name : DisplayName, ServiceDescription = Description, ServiceAccount = ServiceAccount, ServiceAccountPwd = ServiceAccountPassword, HostName = HostName, Port = Port, DatabaseMaintenancePort = DatabaseMaintenancePort, VirtualDirectory = VirtualDirectory, AuditQueue = AuditQueue, ErrorQueue = ErrorQueue, AuditLogQueue = string.IsNullOrWhiteSpace(AuditLogQueue) ? null : AuditLogQueue, ErrorLogQueue = string.IsNullOrWhiteSpace(ErrorLogQueue) ? null : ErrorLogQueue, ForwardAuditMessages = ForwardAuditMessages.ToBool(), ForwardErrorMessages = ForwardErrorMessages.ToBool(), AuditRetentionPeriod = AuditRetentionPeriod, ErrorRetentionPeriod = ErrorRetentionPeriod, ConnectionString = ConnectionString, TransportPackage = ServiceControlCoreTransports.All.First(t => t.Matches(Transport)), SkipQueueCreation = SkipQueueCreation }; var zipfolder = Path.GetDirectoryName(MyInvocation.MyCommand.Module.Path); var logger = new PSLogger(Host); var installer = new UnattendServiceControlInstaller(logger, zipfolder); try { logger.Info("Installing Service Control instance..."); if (installer.Add(details, PromptToProceed)) { var instance = InstanceFinder.FindServiceControlInstance(details.Name); if (instance != null) { WriteObject(PsServiceControl.FromInstance(instance)); } else { throw new Exception("Unknown error creating instance"); } } } catch (Exception ex) { ThrowTerminatingError(new ErrorRecord(ex, null, ErrorCategory.NotSpecified, null)); } }
void AddMissingInstances() { var missingInstances = InstanceFinder.AllInstances().Where(i => !Instances.Any(existingInstance => existingInstance.Name == i.Name)); foreach (var item in missingInstances) { Instances.Add(instanceDetailsFunc(item)); } NotifyOfPropertyChange(nameof(OrderedInstances)); }
public void UpgradeInstance() { var installer = new UnattendServiceControlInstaller(new TestLogger(), DeploymentCache); foreach (var instance in InstanceFinder.ServiceControlInstances().Where(p => p.Name.StartsWith("Test.ServiceControl", StringComparison.OrdinalIgnoreCase))) { installer.Upgrade(instance, new ServiceControlUpgradeOptions { AuditRetentionPeriod = TimeSpan.FromDays(30), ErrorRetentionPeriod = TimeSpan.FromDays(15), OverrideEnableErrorForwarding = true }); } }
protected override void ProcessRecord() { var instance = InstanceFinder.FindInstanceByName <ServiceControlInstance>(Name); if (instance == null) { WriteWarning($"No action taken. An instance called {Name} was not found"); return; } WriteObject(instance.RemoteInstances.Select(PsServiceControlRemote.FromRemote), true); }
// We need this to ignore the instance that represents the edit screen protected List <string> UsedPorts(string instanceName = null) { return(InstanceFinder.ServiceControlInstances() .Where(p => string.IsNullOrWhiteSpace(instanceName) || p.Name != instanceName) .SelectMany(p => new[] { p.Port.ToString(), p.DatabaseMaintenancePort.ToString() }) .Distinct() .ToList()); }
// We need this to ignore the instance that represents the edit screen protected List <string> UsedPaths(string instanceName = null) { return(InstanceFinder.ServiceControlInstances() .Where(p => string.IsNullOrWhiteSpace(instanceName) || p.Name != instanceName) .SelectMany(p => new[] { p.DBPath, p.LogPath, p.InstallPath }) .Distinct() .ToList()); }
// ReSharper disable once UnusedMethodReturnValue.Global public bool Delete(string instanceName, bool removeDB, bool removeLogs) { var instance = InstanceFinder.FindServiceControlInstance(instanceName); instance.ReportCard = new ReportCard(); if (!instance.TryStopService()) { logger.Error("Service failed to stop"); return(false); } try { instance.BackupAppConfig(); instance.Service.SetStartupMode("Disabled"); instance.Service.Delete(); instance.RemoveUrlAcl(); instance.RemoveBinFolder(); if (removeLogs) { instance.RemoveLogsFolder(); } if (removeDB) { instance.RemoveDataBaseFolder(); } foreach (var warning in instance.ReportCard.Warnings) { logger.Warn(warning); } if (instance.ReportCard.HasErrors) { foreach (var error in instance.ReportCard.Errors) { logger.Error(error); } return(false); } } catch (Exception ex) { logger.Error(ex.Message); return(false); } return(true); }
internal ReportCard Delete(string instanceName, bool removeDB, bool removeLogs, IProgress <ProgressDetails> progress = null) { progress = progress ?? new Progress <ProgressDetails>(); progress.Report(0, 7, "Stopping instance..."); var instance = InstanceFinder.FindServiceControlInstance(instanceName); instance.ReportCard = new ReportCard(); if (!instance.TryStopService()) { return(new ReportCard { Errors = { "Service failed to stop" }, Status = Status.Failed }); } instance.BackupAppConfig(); progress.Report(1, 7, "Disabling startup..."); instance.Service.SetStartupMode("Disabled"); progress.Report(2, 7, "Deleting service..."); instance.Service.Delete(); progress.Report(3, 7, "Removing URL ACL..."); instance.RemoveUrlAcl(); progress.Report(4, 7, "Deleting install..."); instance.RemoveBinFolder(); if (removeLogs) { progress.Report(5, 7, "Deleting logs..."); instance.RemoveLogsFolder(); } if (removeDB) { progress.Report(6, 7, "Deleting database..."); instance.RemoveDataBaseFolder(); } progress.Report(new ProgressDetails()); instance.ReportCard.SetStatus(); return(instance.ReportCard); }
internal ReportCard Upgrade(string instanceName, ServiceControlUpgradeOptions upgradeOptions, IProgress <ProgressDetails> progress = null) { progress = progress ?? new Progress <ProgressDetails>(); var instance = InstanceFinder.FindServiceControlInstance(instanceName); instance.ReportCard = new ReportCard(); ZipInfo.ValidateZip(); progress.Report(0, 7, "Stopping instance..."); if (!instance.TryStopService()) { return(new ReportCard { Errors = { "Service failed to stop" }, Status = Status.Failed }); } progress.Report(1, 7, "Backing up app.config..."); var backupFile = instance.BackupAppConfig(); try { progress.Report(2, 7, "Upgrading Files..."); instance.UpgradeFiles(ZipInfo.FilePath); } finally { progress.Report(3, 7, "Restoring app.config..."); instance.RestoreAppConfig(backupFile); } upgradeOptions.ApplyChangesToInstance(instance); progress.Report(4, 6, "Removing database indexes..."); instance.RemoveDatabaseIndexes(); progress.Report(4, 6, "Updating Database..."); instance.UpdateDatabase(msg => progress.Report(5, 7, $"Updating Database...{Environment.NewLine}{msg}")); progress.Report(6, 7, "Running Queue Creation..."); instance.SetupInstance(); instance.ReportCard.SetStatus(); return(instance.ReportCard); }
protected override void ProcessRecord() { var logger = new PSLogger(Host); var zipFolder = Path.GetDirectoryName(MyInvocation.MyCommand.Module.Path); var installer = new UnattendServiceControlInstaller(logger, zipFolder); var instance = InstanceFinder.FindInstanceByName <ServiceControlInstance>(Name); if (instance == null) { WriteWarning($"No action taken. An instance called {Name} was not found"); return; } WriteObject(installer.AddRemoteInstance(instance, RemoteInstanceAddress, logger)); }
public static List <string> UsedAuditQueueNames(TransportInfo transportInfo = null, string instanceName = null, string connectionString = null) { var serviceControlInstances = InstanceFinder.ServiceControlAuditInstances(); var instancesByTransport = serviceControlInstances.Where(p => p.TransportPackage.Equals(transportInfo) && string.Equals(p.ConnectionString, connectionString, StringComparison.OrdinalIgnoreCase)).ToList(); return(instancesByTransport .Where(p => string.IsNullOrWhiteSpace(instanceName) || p.Name != instanceName) .SelectMany(p => new[] { p.AuditQueue, p.AuditLogQueue }).Where(queuename => string.Compare(queuename, "!disable", StringComparison.OrdinalIgnoreCase) != 0 && string.Compare(queuename, "!disable.log", StringComparison.OrdinalIgnoreCase) != 0) .Distinct() .ToList()); }
protected override void ProcessRecord() { var logger = new PSLogger(Host); var zipfolder = Path.GetDirectoryName(MyInvocation.MyCommand.Module.Path); var installer = new UnattendMonitoringInstaller(logger, zipfolder); foreach (var name in Name) { var instance = InstanceFinder.FindMonitoringInstance(name); if (instance == null) { WriteWarning($"No action taken. An instance called {name} was not found"); break; } WriteObject(installer.Delete(instance.Name, RemoveLogs.ToBool())); } }