Пример #1
0
 private static void Stop(HostConfiguration <SERVICE> config)
 {
     try
     {
         config.OnServiceStop(config.Service);
     }
     catch (Exception e)
     {
         Error(config, e);
     }
 }
Пример #2
0
 private static void Start(HostConfiguration <SERVICE> config)
 {
     try
     {
         config.OnServiceStart(config.Service, config.ExtraArguments);
     }
     catch (Exception e)
     {
         Error(config, e);
     }
 }
Пример #3
0
 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.");
     }
 }
Пример #4
0
        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.");
            }
        }
Пример #5
0
 private static void Error(HostConfiguration <SERVICE> config, Exception e = null)
 {
     config.OnServiceError(e);
 }
Пример #6
0
 private static void Reinstall(HostConfiguration <SERVICE> config, ServiceController sc)
 {
     StopService(config, sc);
     Uninstall(config, sc);
     Install(config, sc);
 }
Пример #7
0
        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);
            }
        }
Пример #8
0
        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;
                }
            }
        }
Пример #9
0
 public HostConfigurator(HostConfiguration <SERVICE> innerConfig)
 {
     this.innerConfig = innerConfig;
 }