private static void Stop(HostConfiguration <SERVICE> config) { try { config.OnServiceStop(config.Service); } catch (Exception e) { Error(config, e); } }
private static void Start(HostConfiguration <SERVICE> config) { try { config.OnServiceStart(config.Service, config.ExtraArguments); } catch (Exception e) { Error(config, e); } }
private static void StartService(HostConfiguration <SERVICE> config, ServiceController sc) { if (!(sc.Status == ServiceControllerStatus.StartPending | sc.Status == ServiceControllerStatus.Running)) { sc.Start(); sc.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromMilliseconds(1000)); Console.WriteLine($@"Successfully started service ""{config.Name}"" (""{config.Description}"")"); } else { Console.WriteLine($@"Service ""{config.Name}"" (""{config.Description}"") is already running or start is pending."); } }
private static void Uninstall(HostConfiguration <SERVICE> config, ServiceController sc) { try { if (!(sc.Status == ServiceControllerStatus.Stopped || sc.Status == ServiceControllerStatus.StopPending)) { StopService(config, sc); } new Win32ServiceManager().DeleteService(config.Name); Console.WriteLine($@"Successfully unregistered service ""{config.Name}"" (""{config.Description}"")"); } catch (Exception e) { if (!e.Message.Contains("does not exist")) { throw e; } Console.WriteLine($@"Service ""{config.Name}"" (""{config.Description}"") does not exist. No action taken."); } }
private static void Error(HostConfiguration <SERVICE> config, Exception e = null) { config.OnServiceError(e); }
private static void Reinstall(HostConfiguration <SERVICE> config, ServiceController sc) { StopService(config, sc); Uninstall(config, sc); Install(config, sc); }
public static int Run(Action <HostConfigurator <SERVICE> > runAction) { var innerConfig = new HostConfiguration <SERVICE>(); innerConfig.Action = ActionEnum.RunInteractive; innerConfig.Name = typeof(SERVICE).FullName; innerConfig.ExtraArguments = Parser.Parse(config => { config.AddParameter(new CmdArgParam("Username for the service account", "username") .SetValue(val => { innerConfig.Username = val; })); config.AddParameter(new CmdArgParam("Password for the service account", "password") .SetValue(val => { innerConfig.Password = val; })); config.AddParameter(new CmdArgParam("Service name", "name") .SetValue(val => { innerConfig.Name = val; })); config.AddParameter(new CmdArgParam("Service description", "description") .SetValue(val => { innerConfig.Description = val; })); config.AddParameter(new CmdArgParam("Service display name", "displayName") .SetValue(val => { innerConfig.DisplayName = val; })); config.AddParameter(new CmdArgParam("Installs the service. It's run like console application otherwise", "action") .SetValue(val => { ChooseCommandOfArgs(val, innerConfig); })); config.UseDefaultHelp(); config.UseAppDescription("Sample microservice application"); }); if (string.IsNullOrEmpty(innerConfig.Name)) { innerConfig.Name = typeof(SERVICE).FullName; } if (string.IsNullOrEmpty(innerConfig.DisplayName)) { innerConfig.DisplayName = innerConfig.Name; } if (string.IsNullOrEmpty(innerConfig.Description)) { innerConfig.Description = "No description"; } var hostConfiguration = new HostConfigurator <SERVICE>(innerConfig); try { runAction(hostConfiguration); if (innerConfig.Action == ActionEnum.Run || innerConfig.Action == ActionEnum.RunInteractive) { var controller = new MicroServiceController(() => { var task = Task.Factory.StartNew(() => { UsingServiceController(innerConfig, (sc, cfg) => StopService(cfg, sc)); }); //task.Wait(); } ); innerConfig.Service = innerConfig.ServiceFactory(innerConfig.ExtraArguments); } ConfigureService(innerConfig); return(0); } catch (Exception e) { Error(innerConfig, e); return(-1); } }
private static void Install(HostConfiguration <SERVICE> config, ServiceController sc, int counter = 0) { Win32ServiceCredentials cred = Win32ServiceCredentials.LocalSystem; if (!string.IsNullOrEmpty(config.Username)) { cred = new Win32ServiceCredentials(config.Username, config.Password); } try { new Win32ServiceManager().CreateService( config.Name, config.DisplayName, config.Description, GetServiceCommand(config.ExtraArguments), cred, autoStart: true, startImmediately: true, errorSeverity: ErrorSeverity.Normal); Console.WriteLine($@"Successfully registered and started service ""{config.Name}"" (""{config.Description}"")"); } catch (Exception e) { if (e.Message.Contains("already exists")) { Console.WriteLine($@"Service ""{config.Name}"" (""{config.Description}"") was already installed. Reinstalling..."); Reinstall(config, sc); } else if (e.Message.Contains("The specified service has been marked for deletion")) { if (counter < 10) { System.Threading.Thread.Sleep(500); counter++; string suffix = "th"; if (counter == 1) { suffix = "st"; } else if (counter == 2) { suffix = "nd"; } else if (counter == 3) { suffix = "rd"; } Console.WriteLine("The specified service has been marked for deletion. Retrying {0}{1} time", counter, suffix); Install(config, sc, counter); } else { throw e; } } else { throw e; } } }
public HostConfigurator(HostConfiguration <SERVICE> innerConfig) { this.innerConfig = innerConfig; }