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.");
     }
 }
Ejemplo n.º 6
0
 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);
            }
        }
Ejemplo n.º 11
0
        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");
            });
Ejemplo n.º 12
0
        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);
            }
        }