Added a convenient Service type
This commit is contained in:
parent
53e7e00f80
commit
3d0a69d5a3
@ -1,2 +1,61 @@
|
|||||||
// Package service provides a toolkit for creating Hnakra services.
|
// Package service provides a toolkit for creating Hnakra services.
|
||||||
package service
|
package service
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
import "log"
|
||||||
|
import "time"
|
||||||
|
import "hnakra/rotate"
|
||||||
|
import "hnakra/routines"
|
||||||
|
|
||||||
|
// Service is capable of managing multiple mounts. It also sets up logging
|
||||||
|
// automatically.
|
||||||
|
type Service []Mount
|
||||||
|
|
||||||
|
// Run runs the mounts within the service, and only exits when all of them have
|
||||||
|
// exited. It will automatically start logging to the directory specified by
|
||||||
|
// $HNAKRA_LOG_DIR. If that variable is unset, it will just log to stdout.
|
||||||
|
func (service Service) Run () error {
|
||||||
|
// set up logging
|
||||||
|
logDir := os.Getenv("HNAKRA_LOG_DIR")
|
||||||
|
if logDir != "" {
|
||||||
|
logger, err := rotate.New(logDir)
|
||||||
|
if err != nil { log.Fatal("cannot access log dir:", err) }
|
||||||
|
log.SetOutput(logger)
|
||||||
|
}
|
||||||
|
|
||||||
|
// set up routine manager
|
||||||
|
manager := routines.Manager { RestartDeadline: time.Second * 8 }
|
||||||
|
manager.Routines = make([]routines.Routine, len(service))
|
||||||
|
for index, mount := range manager.Routines {
|
||||||
|
manager.Routines[index] = mount
|
||||||
|
}
|
||||||
|
|
||||||
|
// send it
|
||||||
|
err := manager.Run()
|
||||||
|
if err != nil { log.Println("XXX", err) }
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close abruptly closes all mounts in the service. This will cause Run() to
|
||||||
|
// exit.
|
||||||
|
func (service Service) Close () (err error) {
|
||||||
|
for _, mount := range service {
|
||||||
|
singleErr := mount.Close()
|
||||||
|
if singleErr != nil {
|
||||||
|
err = singleErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shutdown gracefully shuts down each mount in the service. This will cause
|
||||||
|
// Run() to exit.
|
||||||
|
func (service Service) Shutdown () (err error) {
|
||||||
|
for _, mount := range service {
|
||||||
|
singleErr := mount.Shutdown()
|
||||||
|
if singleErr != nil {
|
||||||
|
err = singleErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user