diff --git a/cmd/root.go b/cmd/root.go index 05918688a5d..bb7be2afb1e 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" "os" "os/signal" + "runtime" ) const ( @@ -14,8 +15,9 @@ const ( ) var ( - configPath string - logLevel string + configPath string + defaultConfigPath string + logLevel string rootCmd = &cobra.Command{ Use: "wiretrustee", @@ -28,16 +30,20 @@ var ( func Execute() error { return rootCmd.Execute() } - func init() { - rootCmd.PersistentFlags().StringVar(&configPath, "config", "/etc/wiretrustee/config.json", "Wiretrustee config file location to write new config to") + defaultConfigPath = "/etc/wiretrustee/config.json" + if runtime.GOOS == "windows" { + defaultConfigPath = os.Getenv("PROGRAMDATA") + "Wiretrustee" + "config.json" + } + rootCmd.PersistentFlags().StringVar(&configPath, "config", defaultConfigPath, "Wiretrustee config file location to write new config to") rootCmd.PersistentFlags().StringVar(&logLevel, "log-level", "info", "") rootCmd.AddCommand(initCmd) rootCmd.AddCommand(addPeerCmd) rootCmd.AddCommand(upCmd) rootCmd.AddCommand(signalCmd) rootCmd.AddCommand(serviceCmd) - serviceCmd.AddCommand(runCmd) // run is a subcommand of service + serviceCmd.AddCommand(runCmd, startCmd, stopCmd, restartCmd) // service control commands are subcommands of service + serviceCmd.AddCommand(installCmd, uninstallCmd) // service installer commands are subcommands of service } // SetupCloseHandler handles SIGTERM signal and exits with success diff --git a/cmd/service.go b/cmd/service.go index 397899123d1..2faacad115a 100644 --- a/cmd/service.go +++ b/cmd/service.go @@ -2,9 +2,17 @@ package cmd import ( "github.com/kardianos/service" + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) +type program struct { + cmd *cobra.Command + args []string +} + +var logger service.Logger + func newSVCConfig() *service.Config { return &service.Config{ Name: "wiretrustee", @@ -13,6 +21,20 @@ func newSVCConfig() *service.Config { } } +func newSVC(prg *program, conf *service.Config) (service.Service, error) { + s, err := service.New(prg, conf) + if err != nil { + log.Fatal(err) + return nil, err + } + logger, err = s.Logger(nil) + if err != nil { + log.Fatal(err) + return nil, err + } + return s, nil +} + var ( serviceCmd = &cobra.Command{ Use: "service", diff --git a/cmd/service_controller.go b/cmd/service_controller.go new file mode 100644 index 00000000000..e47ba493f9a --- /dev/null +++ b/cmd/service_controller.go @@ -0,0 +1,99 @@ +package cmd + +import ( + "github.com/kardianos/service" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func (p *program) Start(s service.Service) error { + // Start should not block. Do the actual work async. + logger.Info("Starting service") //nolint + go upCmd.Run(p.cmd, p.args) + return nil +} + +func (p *program) Stop(s service.Service) error { + stopUP <- 1 + return nil +} + +var ( + runCmd = &cobra.Command{ + Use: "run", + Short: "runs wiretrustee as service", + Run: func(cmd *cobra.Command, args []string) { + + prg := &program{ + cmd: cmd, + args: args, + } + + s, err := newSVC(prg, newSVCConfig()) + if err != nil { + log.Fatal(err) + } + err = s.Run() + if err != nil { + logger.Error(err) //nolint + } + }, + } +) + +var ( + startCmd = &cobra.Command{ + Use: "start", + Short: "starts wiretrustee service", + Run: func(cmd *cobra.Command, args []string) { + + s, err := newSVC(&program{}, newSVCConfig()) + if err != nil { + log.Fatal(err) + } + err = s.Start() + if err != nil { + logger.Error(err) //nolint + } + }, + } +) + +var ( + stopCmd = &cobra.Command{ + Use: "stop", + Short: "stops wiretrustee service", + Run: func(cmd *cobra.Command, args []string) { + + s, err := newSVC(&program{}, newSVCConfig()) + if err != nil { + log.Fatal(err) + } + err = s.Stop() + if err != nil { + logger.Error(err) //nolint + } + }, + } +) + +var ( + restartCmd = &cobra.Command{ + Use: "restart", + Short: "restarts wiretrustee service", + Run: func(cmd *cobra.Command, args []string) { + + s, err := newSVC(&program{}, newSVCConfig()) + if err != nil { + log.Fatal(err) + } + err = s.Restart() + if err != nil { + logger.Error(err) //nolint + } + }, + } +) + +func init() { +} diff --git a/cmd/service_installer.go b/cmd/service_installer.go new file mode 100644 index 00000000000..b5a2aaf86ea --- /dev/null +++ b/cmd/service_installer.go @@ -0,0 +1,64 @@ +package cmd + +import ( + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "runtime" +) + +var ( + installCmd = &cobra.Command{ + Use: "install", + Short: "installs wiretrustee service", + Run: func(cmd *cobra.Command, args []string) { + + svcConfig := newSVCConfig() + + svcConfig.Arguments = []string{ + "service", + "run", + "--config", + configPath, + "--log-level", + logLevel, + } + + if runtime.GOOS == "linux" { + // Respected only by systemd systems + svcConfig.Dependencies = []string{"After=network.target syslog.target"} + } + + s, err := newSVC(&program{}, svcConfig) + if err != nil { + log.Fatal(err) + } + + err = s.Install() + if err != nil { + log.Error(err) + } + }, + } +) + +var ( + uninstallCmd = &cobra.Command{ + Use: "uninstall", + Short: "uninstalls wiretrustee service from system", + Run: func(cmd *cobra.Command, args []string) { + + s, err := newSVC(&program{}, newSVCConfig()) + if err != nil { + log.Fatal(err) + } + + err = s.Uninstall() + if err != nil { + log.Error(err) + } + }, + } +) + +func init() { +} diff --git a/cmd/service_run.go b/cmd/service_run.go deleted file mode 100644 index b524a859476..00000000000 --- a/cmd/service_run.go +++ /dev/null @@ -1,58 +0,0 @@ -package cmd - -import ( - "github.com/kardianos/service" - log "github.com/sirupsen/logrus" - "github.com/spf13/cobra" -) - -type program struct { - cmd *cobra.Command - args []string -} - -var logger service.Logger - -func (p *program) Start(s service.Service) error { - // Start should not block. Do the actual work async. - logger.Info("Starting service") //nolint - go upCmd.Run(p.cmd, p.args) - return nil -} - -func (p *program) Stop(s service.Service) error { - stopUP <- 1 - return nil -} - -var ( - runCmd = &cobra.Command{ - Use: "run", - Short: "runs wiretrustee as service", - Run: func(cmd *cobra.Command, args []string) { - - svcConfig := newSVCConfig() - - prg := &program{ - cmd: cmd, - args: args, - } - s, err := service.New(prg, svcConfig) - if err != nil { - log.Fatal(err) - } - logger, err = s.Logger(nil) - if err != nil { - log.Fatal(err) - } - - err = s.Run() - if err != nil { - logger.Error(err) //nolint - } - }, - } -) - -func init() { -}