Add service controllers and installers commands

This commit is contained in:
mlsmaycon 2021-06-20 23:01:44 +02:00
parent 06c7af058b
commit a66cdccda9
5 changed files with 196 additions and 63 deletions

View File

@ -6,6 +6,7 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"os" "os"
"os/signal" "os/signal"
"runtime"
) )
const ( const (
@ -14,8 +15,9 @@ const (
) )
var ( var (
configPath string configPath string
logLevel string defaultConfigPath string
logLevel string
rootCmd = &cobra.Command{ rootCmd = &cobra.Command{
Use: "wiretrustee", Use: "wiretrustee",
@ -28,16 +30,20 @@ var (
func Execute() error { func Execute() error {
return rootCmd.Execute() return rootCmd.Execute()
} }
func init() { 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.PersistentFlags().StringVar(&logLevel, "log-level", "info", "")
rootCmd.AddCommand(initCmd) rootCmd.AddCommand(initCmd)
rootCmd.AddCommand(addPeerCmd) rootCmd.AddCommand(addPeerCmd)
rootCmd.AddCommand(upCmd) rootCmd.AddCommand(upCmd)
rootCmd.AddCommand(signalCmd) rootCmd.AddCommand(signalCmd)
rootCmd.AddCommand(serviceCmd) 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 // SetupCloseHandler handles SIGTERM signal and exits with success

View File

@ -2,9 +2,17 @@ package cmd
import ( import (
"github.com/kardianos/service" "github.com/kardianos/service"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
type program struct {
cmd *cobra.Command
args []string
}
var logger service.Logger
func newSVCConfig() *service.Config { func newSVCConfig() *service.Config {
return &service.Config{ return &service.Config{
Name: "wiretrustee", 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 ( var (
serviceCmd = &cobra.Command{ serviceCmd = &cobra.Command{
Use: "service", Use: "service",

99
cmd/service_controller.go Normal file
View File

@ -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() {
}

64
cmd/service_installer.go Normal file
View File

@ -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() {
}

View File

@ -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() {
}