diff --git a/stdservice/console_log.go b/stdservice/console_log.go new file mode 100644 index 0000000..c5d2d14 --- /dev/null +++ b/stdservice/console_log.go @@ -0,0 +1,18 @@ +package stdservice + +import "fmt" + +type ConsoleLogger struct{} + +func (ConsoleLogger) LogError(format string, a ...interface{}) error { + fmt.Printf(format, a...) + return nil +} +func (ConsoleLogger) LogWarning(format string, a ...interface{}) error { + fmt.Printf(format, a...) + return nil +} +func (ConsoleLogger) LogInfo(format string, a ...interface{}) error { + fmt.Printf(format, a...) + return nil +} diff --git a/stdservice/stdservice.go b/stdservice/stdservice.go new file mode 100644 index 0000000..0f3222b --- /dev/null +++ b/stdservice/stdservice.go @@ -0,0 +1,96 @@ +package stdservice + +import ( + "bitbucket.org/kardianos/service" + "fmt" + "os" +) + +// Standard service configuration. Start() can block as long as desired, +// Stop() should not block for more then a second or two. +type Config struct { + // Used to register the service with the operating system. + Name, DisplayName, LongDescription string + + // Called when the service starts or stops. + Start, Stop func() + + s service.Service + l service.Logger +} + +// Get service after Run() has been called. +func (c *Config) Service() service.Service { + return c.s +} + +// Get logger after Run() has been called. +func (c *Config) Logger() service.Logger { + return c.l +} + +// Fill in configuration, then call Run() to setup basic handling. +// Blocks until program completes. Is intended to handle the standard +// simple cases for running a service. +func Run(c *Config) { + var s, err = service.NewService(c.Name, c.DisplayName, c.LongDescription) + c.s = s + c.l = s + + if err != nil { + fmt.Printf("%s unable to start: %s", c.DisplayName, err) + return + } + + if len(os.Args) > 1 { + var err error + verb := os.Args[1] + switch verb { + case "install": + err = s.Install() + if err != nil { + fmt.Printf("Failed to install: %s\n", err) + return + } + fmt.Printf("Service \"%s\" installed.\n", c.DisplayName) + case "remove": + err = s.Remove() + if err != nil { + fmt.Printf("Failed to remove: %s\n", err) + return + } + fmt.Printf("Service \"%s\" removed.\n", c.DisplayName) + case "run": + c.l = ConsoleLogger{} + defer c.Stop() + c.Start() + case "start": + err = s.Start() + if err != nil { + fmt.Printf("Failed to start: %s\n", err) + return + } + fmt.Printf("Service \"%s\" started.\n", c.DisplayName) + case "stop": + err = s.Stop() + if err != nil { + fmt.Printf("Failed to stop: %s\n", err) + return + } + fmt.Printf("Service \"%s\" stopped.\n", c.DisplayName) + } + return + } + err = s.Run(func() error { + // start + go c.Start() + return nil + }, func() error { + // stop + c.Stop() + return nil + }) + if err != nil { + c.l.LogError(err.Error()) + } +}