Added a convenient Service type

This commit is contained in:
Sasha Koshka 2023-05-26 20:01:27 -04:00
parent 53e7e00f80
commit 3d0a69d5a3
1 changed files with 59 additions and 0 deletions

View File

@ -1,2 +1,61 @@
// Package service provides a toolkit for creating Hnakra services.
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
}