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 StopService(HostConfiguration <SERVICE> config, ServiceController sc) { if (!(sc.Status == ServiceControllerStatus.Stopped | sc.Status == ServiceControllerStatus.StopPending)) { sc.Stop(); sc.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromMilliseconds(1000)); _trace.TraceEvent(TraceEventType.Warning, 2, $@"Successfully stopped service ""{config.Name}"" (""{config.Description}"")"); } else { _trace.TraceEvent(TraceEventType.Warning, 2, $@"Service ""{config.Name}"" (""{config.Description}"") is already stopped or stop 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; } Console.WriteLine($@"Service ""{config.Name}"" (""{config.Description}"") does not exist. No action taken."); } }
public HostConfigurator(HostConfiguration <SERVICE> innerConfig) { this.innerConfig = innerConfig; }
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); }
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; } } else { throw; } } }
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() { Key = "username", Description = "Username for the service account", Value = val => { innerConfig.Username = val; } }); config.AddParameter(new CmdArgParam() { Key = "password", Description = "Password for the service account", Value = val => { innerConfig.Password = val; } }); config.AddParameter(new CmdArgParam() { Key = "name", Description = "Service name", Value = val => { innerConfig.Name = val; } }); config.AddParameter(new CmdArgParam() { Key = "description", Description = "Service description", Value = val => { innerConfig.Description = val; } }); config.AddParameter(new CmdArgParam() { Key = "displayName", Description = "Service display name", Value = val => { innerConfig.DisplayName = val; } }); config.AddParameter(new CmdArgParam() { Key = "action", Description = "Installs the service. It's run like console application otherwise", Value = val => { switch (val) { case "install": innerConfig.Action = ActionEnum.Install; break; case "start": innerConfig.Action = ActionEnum.Start; break; case "stop": innerConfig.Action = ActionEnum.Stop; break; case "uninstall": innerConfig.Action = ActionEnum.Uninstall; break; case "run": innerConfig.Action = ActionEnum.Run; break; case "run-interactive": innerConfig.Action = ActionEnum.RunInteractive; break; default: Console.WriteLine("{0} is unrecognized, will run the app as console application instead"); innerConfig.Action = ActionEnum.RunInteractive; break; } } }); 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) { innerConfig.Service = innerConfig.ServiceFactory(innerConfig.ExtraArguments); } ConfigureService(innerConfig); return(0); } catch (Exception e) { Error(innerConfig, e); return(-1); } }
public static int Run(string serverName, Action <HostConfigurator <SERVICE> > runAction) { Directory.SetCurrentDirectory(PlatformServices.Default.Application.ApplicationBasePath); var innerConfig = new HostConfiguration <SERVICE>(); innerConfig.Name = serverName; innerConfig.Description = serverName; innerConfig.DisplayName = serverName; innerConfig.ExtraArguments = new List <string>(); innerConfig.Action = ActionEnum.Install; innerConfig.ExtraArguments = Parser.Parse(config => { config.AddParameter(new CmdArgParam() { Key = "username", Description = "Username for the service account", Value = val => { innerConfig.Username = val; } }); config.AddParameter(new CmdArgParam() { Key = "password", Description = "Password for the service account", Value = val => { innerConfig.Password = val; } }); config.AddParameter(new CmdArgParam() { Key = "built-in-account", Description = "Password for the service account", Value = val => { switch (val.ToLower()) { case "localsystem": innerConfig.DefaultCred = Win32ServiceCredentials.LocalSystem; break; case "localservice": innerConfig.DefaultCred = Win32ServiceCredentials.LocalService; break; case "networkservice": innerConfig.DefaultCred = Win32ServiceCredentials.NetworkService; break; default: innerConfig.DefaultCred = Win32ServiceCredentials.LocalSystem; break; } } }); config.AddParameter(new CmdArgParam() { Key = "start-immediately", Description = "Start the service immediately when installing.", Value = val => { if (bool.TryParse(val, out var startImmediately)) { innerConfig.StartImmediately = startImmediately; } } }); config.AddParameter(new CmdArgParam() { Key = "name", Description = "Service name", Value = val => { innerConfig.Name = val; } }); config.AddParameter(new CmdArgParam() { Key = "description", Description = "Service description", Value = val => { innerConfig.Description = val; } }); config.AddParameter(new CmdArgParam() { Key = "display-name", Description = "Service display name", Value = val => { innerConfig.DisplayName = val; } }); config.AddParameter(new CmdArgParam() { Key = "action", Description = "Installs the service. It's run like console application otherwise", Value = val => { switch (val) { case "install": innerConfig.Action = ActionEnum.Install; break; case "start": innerConfig.Action = ActionEnum.Start; break; case "stop": innerConfig.Action = ActionEnum.Stop; break; case "uninstall": innerConfig.Action = ActionEnum.Uninstall; break; case "run": innerConfig.Action = ActionEnum.Run; break; case "run-interactive": innerConfig.Action = ActionEnum.RunInteractive; break; default: Console.WriteLine("{0} is unrecognized, will run the app as console application instead"); innerConfig.Action = ActionEnum.RunInteractive; break; } } }); config.UseDefaultHelp(); config.UseAppDescription("Sample microservice application"); });
public static int Run(Action <HostConfigurator <SERVICE> > runAction) { Directory.SetCurrentDirectory(PlatformServices.Default.Application.ApplicationBasePath); var innerConfig = new HostConfiguration <SERVICE>(); innerConfig.Action = ActionEnum.RunInteractive; innerConfig.Name = typeof(SERVICE).FullName; innerConfig.ExtraArguments = Parser.Parse(config => { config.AddParameter(new CmdArgParam() { Key = "username", Description = "Username for the service account", Value = val => { innerConfig.Username = val; } }); config.AddParameter(new CmdArgParam() { Key = "password", Description = "Password for the service account", Value = val => { innerConfig.Password = val; } }); config.AddParameter(new CmdArgParam() { Key = "built-in-account", Description = "Password for the service account", Value = val => { switch (val.ToLower()) { case "localsystem": innerConfig.DefaultCred = Win32ServiceCredentials.LocalSystem; break; case "localservice": innerConfig.DefaultCred = Win32ServiceCredentials.LocalService; break; case "networkservice": innerConfig.DefaultCred = Win32ServiceCredentials.NetworkService; break; default: innerConfig.DefaultCred = Win32ServiceCredentials.LocalSystem; break; } } }); config.AddParameter(new CmdArgParam() { Key = "start-immediately", Description = "Start the service immediately when installing.", Value = val => { if (bool.TryParse(val, out var startImmediately)) { innerConfig.StartImmediately = startImmediately; } } }); config.AddParameter(new CmdArgParam() { Key = "name", Description = "Service name", Value = val => { innerConfig.Name = val; } }); config.AddParameter(new CmdArgParam() { Key = "description", Description = "Service description", Value = val => { innerConfig.Description = val; } }); config.AddParameter(new CmdArgParam() { Key = "display-name", Description = "Service display name", Value = val => { innerConfig.DisplayName = val; } }); config.AddParameter(new CmdArgParam() { Key = "command", Description = "Send a custom command to the service.", Value = val => { if (int.TryParse(val, out var command)) { innerConfig.CustomCommand = command; } } });
public HostConfigurator(HostConfiguration <SERVICE> hostConfiguration) { HostConfiguration = hostConfiguration; }
public static int Run(Action <HostConfigurator <SERVICE> > runAction) { Directory.SetCurrentDirectory(PlatformServices.Default.Application.ApplicationBasePath); var innerConfig = new HostConfiguration <SERVICE>(); innerConfig.Action = ActionEnum.RunInteractive; innerConfig.Name = typeof(SERVICE).FullName; innerConfig.ExtraArguments = Parser.Parse(config => { config.AddParameter(new CmdArgParam() { Key = "username", Description = "Username for the service account", Value = val => { innerConfig.Username = val; } }); config.AddParameter(new CmdArgParam() { Key = "password", Description = "Password for the service account", Value = val => { innerConfig.Password = val; } }); config.AddParameter(new CmdArgParam() { Key = "name", Description = "Service name", Value = val => { innerConfig.Name = val; } }); config.AddParameter(new CmdArgParam() { Key = "description", Description = "Service description", Value = val => { innerConfig.Description = val; } }); config.AddParameter(new CmdArgParam() { Key = "displayName", Description = "Service display name", Value = val => { innerConfig.DisplayName = val; } }); config.AddParameter(new CmdArgParam() { Key = "action", Description = "Installs the service. It's run like console application otherwise", Value = val => { switch (val) { case "install": innerConfig.Action = ActionEnum.Install; break; case "start": innerConfig.Action = ActionEnum.Start; break; case "stop": innerConfig.Action = ActionEnum.Stop; break; case "uninstall": innerConfig.Action = ActionEnum.Uninstall; break; case "run": innerConfig.Action = ActionEnum.Run; break; case "run-interactive": innerConfig.Action = ActionEnum.RunInteractive; break; default: Console.WriteLine("{0} is unrecognized, will run the app as console application instead"); innerConfig.Action = ActionEnum.RunInteractive; break; } } }); 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.Service = innerConfig.ServiceFactory(innerConfig.ExtraArguments, new MicroServiceController(() => { var task = Task.Factory.StartNew(() => { UsingServiceController(innerConfig, (sc, cfg) => StopService(cfg, sc)); }); } )); } else if (innerConfig.Action == ActionEnum.RunInteractive) { var consoleService = new InnerService(innerConfig.Name, () => Start(innerConfig), () => Stop(innerConfig)); var consoleHost = new ConsoleServiceHost <SERVICE>(consoleService, innerConfig); innerConfig.Service = innerConfig.ServiceFactory(innerConfig.ExtraArguments, new MicroServiceController(() => { var task = Task.Factory.StartNew(() => { consoleHost.StopService(); }); } )); // Return the console host run result, so we get some idea what failed if result is not OK return((int)consoleHost.Run()); } ConfigureService(innerConfig); return(0); } catch (Exception e) { Error(innerConfig, e); return(-1); } }
public static int Run(Action <HostConfigurator <SERVICE> > runAction) { var innerConfiguration = new HostConfiguration <SERVICE>(_trace) { Action = ActionEnum.RunInteractive, Name = typeof(SERVICE).FullName }; innerConfiguration.ExtraArguments = Parser.Parse(config => { config.AddParameter(new CmdArgParam { Key = "username", Description = "Username for the service account", Value = val => { innerConfiguration.Username = val; } }); config.AddParameter(new CmdArgParam { Key = "password", Description = "Password for the service account", Value = val => { innerConfiguration.Password = val; } }); config.AddParameter(new CmdArgParam { Key = "name", Description = "Service name", Value = val => { innerConfiguration.Name = val; } }); config.AddParameter(new CmdArgParam { Key = "description", Description = "Service description", Value = val => { innerConfiguration.Description = val; } }); config.AddParameter(new CmdArgParam { Key = "displayName", Description = "Service display name", Value = val => { innerConfiguration.DisplayName = val; } }); config.AddParameter(new CmdArgParam { Key = "action", Description = "Installs the service. It's run like console application otherwise", Value = val => { switch (val) { case "install": innerConfiguration.Action = ActionEnum.Install; break; case "start": innerConfiguration.Action = ActionEnum.Start; break; case "stop": innerConfiguration.Action = ActionEnum.Stop; break; case "uninstall": innerConfiguration.Action = ActionEnum.Uninstall; break; case "run": innerConfiguration.Action = ActionEnum.Run; break; case "run-interactive": innerConfiguration.Action = ActionEnum.RunInteractive; break; default: Console.WriteLine("{0} is unrecognized, will run the app as console application instead"); _trace.TraceEvent(TraceEventType.Warning, 2, "{0} is unrecognized, will run the app as console application instead"); innerConfiguration.Action = ActionEnum.RunInteractive; break; } } }); config.UseDefaultHelp(); config.UseAppDescription("Sample microservice application"); }); if (string.IsNullOrEmpty(innerConfiguration.Name)) { innerConfiguration.Name = typeof(SERVICE).FullName; } if (string.IsNullOrEmpty(innerConfiguration.DisplayName)) { innerConfiguration.DisplayName = innerConfiguration.Name; } if (string.IsNullOrEmpty(innerConfiguration.Description)) { innerConfiguration.Description = "No description"; } var hostConfiguration = new HostConfigurator <SERVICE>(innerConfiguration); try { runAction?.Invoke(hostConfiguration); if (innerConfiguration.Action == ActionEnum.Run || innerConfiguration.Action == ActionEnum.RunInteractive) { var controller = new MicroServiceController( () => { var task = Task.Factory.StartNew(() => { UsingServiceController(innerConfiguration, (sc, cfg) => StopService(cfg, sc)); }); //task.Wait(); } ); innerConfiguration.Service = innerConfiguration.ServiceFactory(innerConfiguration.ExtraArguments, controller); } ConfigureService(innerConfiguration); return(0); } catch (Exception e) { Error(innerConfiguration, e); return(-1); } }