Adding standard service use case.
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user