wip: refactor for new config format
This commit is contained in:
23
init/cron.go
23
init/cron.go
@@ -13,7 +13,7 @@ const (
|
||||
cronTag = "cron"
|
||||
)
|
||||
|
||||
func (i *Init) cron(wg *sync.WaitGroup, cron Cron, exitFlag <-chan any) {
|
||||
func (i *Init) cron(wg *sync.WaitGroup, cron CronTask, exitFlag <-chan any) {
|
||||
defer wg.Done()
|
||||
|
||||
var (
|
||||
@@ -21,35 +21,40 @@ func (i *Init) cron(wg *sync.WaitGroup, cron Cron, exitFlag <-chan any) {
|
||||
err error
|
||||
stdout io.ReadCloser
|
||||
stderr io.ReadCloser
|
||||
cmd *exec.Cmd
|
||||
)
|
||||
|
||||
ticker := time.NewTicker(time.Second * 30)
|
||||
cron:
|
||||
for {
|
||||
if cron.TimeToRun(time.Now()) {
|
||||
wingmate.Log().Info().Str(cronTag, cron.Command().Path()).Msg("executing")
|
||||
cmd := exec.Command(cron.Command().Path())
|
||||
wingmate.Log().Info().Str(cronTag, cron.Name()).Msg("executing")
|
||||
if len(cron.Command()) == 1 {
|
||||
cmd = exec.Command(cron.Command()[0])
|
||||
} else {
|
||||
cmd = exec.Command(cron.Command()[0], cron.Command()[1:]...)
|
||||
}
|
||||
iwg = &sync.WaitGroup{}
|
||||
|
||||
if stdout, err = cmd.StdoutPipe(); err != nil {
|
||||
wingmate.Log().Error().Str(cronTag, cron.Command().Path()).Msgf("stdout pipe: %+v", err)
|
||||
wingmate.Log().Error().Str(cronTag, cron.Name()).Msgf("stdout pipe: %+v", err)
|
||||
goto fail
|
||||
}
|
||||
|
||||
if stderr, err = cmd.StderrPipe(); err != nil {
|
||||
wingmate.Log().Error().Str(cronTag, cron.Command().Path()).Msgf("stderr pipe: %+v", err)
|
||||
wingmate.Log().Error().Str(cronTag, cron.Name()).Msgf("stderr pipe: %+v", err)
|
||||
_ = stdout.Close()
|
||||
goto fail
|
||||
}
|
||||
|
||||
iwg.Add(1)
|
||||
go i.pipeReader(iwg, stdout, cronTag, cron.Command().Path())
|
||||
go i.pipeReader(iwg, stdout, cronTag, cron.Name())
|
||||
|
||||
iwg.Add(1)
|
||||
go i.pipeReader(iwg, stderr, cronTag, cron.Command().Path())
|
||||
go i.pipeReader(iwg, stderr, cronTag, cron.Name())
|
||||
|
||||
if err := cmd.Start(); err != nil {
|
||||
wingmate.Log().Error().Msgf("starting cron %s error %+v", cron.Command().Path(), err)
|
||||
wingmate.Log().Error().Msgf("starting cron %s error %+v", cron.Name(), err)
|
||||
_ = stdout.Close()
|
||||
_ = stderr.Close()
|
||||
iwg.Wait()
|
||||
@@ -59,7 +64,7 @@ cron:
|
||||
iwg.Wait()
|
||||
|
||||
if err = cmd.Wait(); err != nil {
|
||||
wingmate.Log().Error().Str(cronTag, cron.Command().Path()).Msgf("got error when waiting: %+v", err)
|
||||
wingmate.Log().Error().Str(cronTag, cron.Name()).Msgf("got error when waiting: %+v", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
35
init/init.go
35
init/init.go
@@ -6,18 +6,37 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
type Path interface {
|
||||
Path() string
|
||||
type Tasks interface {
|
||||
List() []Task
|
||||
Services() []Task
|
||||
Crones() []CronTask
|
||||
Get(string) (Task, error)
|
||||
}
|
||||
|
||||
type Cron interface {
|
||||
Command() Path
|
||||
type UserGroup interface {
|
||||
}
|
||||
|
||||
type TaskStatus interface {
|
||||
}
|
||||
|
||||
type Task interface {
|
||||
Name() string
|
||||
Command() []string
|
||||
Environ() []string
|
||||
Setsid() bool
|
||||
UserGroup() UserGroup
|
||||
Background() bool
|
||||
WorkingDir() string
|
||||
Status() TaskStatus
|
||||
}
|
||||
|
||||
type CronTask interface {
|
||||
Task
|
||||
TimeToRun(time.Time) bool
|
||||
}
|
||||
|
||||
type Config interface {
|
||||
Services() []Path
|
||||
Cron() []Cron
|
||||
Tasks() Tasks
|
||||
}
|
||||
|
||||
type Init struct {
|
||||
@@ -49,12 +68,12 @@ func (i *Init) Start() {
|
||||
wg.Add(1)
|
||||
go i.sighandler(wg, signalTrigger, sighandlerExit, sigchld)
|
||||
|
||||
for _, s := range i.config.Services() {
|
||||
for _, s := range i.config.Tasks().Services() {
|
||||
wg.Add(1)
|
||||
go i.service(wg, s, signalTrigger)
|
||||
}
|
||||
|
||||
for _, c := range i.config.Cron() {
|
||||
for _, c := range i.config.Tasks().Crones() {
|
||||
wg.Add(1)
|
||||
go i.cron(wg, c, signalTrigger)
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ const (
|
||||
serviceTag = "service"
|
||||
)
|
||||
|
||||
func (i *Init) service(wg *sync.WaitGroup, path Path, exitFlag <-chan any) {
|
||||
func (i *Init) service(wg *sync.WaitGroup, task Task, exitFlag <-chan any) {
|
||||
defer wg.Done()
|
||||
|
||||
var (
|
||||
@@ -23,37 +23,42 @@ func (i *Init) service(wg *sync.WaitGroup, path Path, exitFlag <-chan any) {
|
||||
stderr io.ReadCloser
|
||||
stdout io.ReadCloser
|
||||
failStatus bool
|
||||
cmd *exec.Cmd
|
||||
)
|
||||
|
||||
defer func() {
|
||||
wingmate.Log().Info().Str(serviceTag, path.Path()).Msg("stopped")
|
||||
wingmate.Log().Info().Str(serviceTag, task.Name()).Msg("stopped")
|
||||
}()
|
||||
|
||||
service:
|
||||
for {
|
||||
failStatus = false
|
||||
cmd := exec.Command(path.Path())
|
||||
if len(task.Command()) == 1 {
|
||||
cmd = exec.Command(task.Command()[0])
|
||||
} else {
|
||||
cmd = exec.Command(task.Command()[0], task.Command()[1:]...)
|
||||
}
|
||||
iwg = &sync.WaitGroup{}
|
||||
|
||||
if stdout, err = cmd.StdoutPipe(); err != nil {
|
||||
wingmate.Log().Error().Str(serviceTag, path.Path()).Msgf("stdout pipe: %#v", err)
|
||||
wingmate.Log().Error().Str(serviceTag, task.Name()).Msgf("stdout pipe: %#v", err)
|
||||
failStatus = true
|
||||
goto fail
|
||||
}
|
||||
iwg.Add(1)
|
||||
go i.pipeReader(iwg, stdout, serviceTag, path.Path())
|
||||
go i.pipeReader(iwg, stdout, serviceTag, task.Name())
|
||||
|
||||
if stderr, err = cmd.StderrPipe(); err != nil {
|
||||
wingmate.Log().Error().Str(serviceTag, path.Path()).Msgf("stderr pipe: %#v", err)
|
||||
wingmate.Log().Error().Str(serviceTag, task.Name()).Msgf("stderr pipe: %#v", err)
|
||||
_ = stdout.Close()
|
||||
failStatus = true
|
||||
goto fail
|
||||
}
|
||||
iwg.Add(1)
|
||||
go i.pipeReader(iwg, stderr, serviceTag, path.Path())
|
||||
go i.pipeReader(iwg, stderr, serviceTag, task.Name())
|
||||
|
||||
if err = cmd.Start(); err != nil {
|
||||
wingmate.Log().Error().Msgf("starting service %s error %#v", path.Path(), err)
|
||||
wingmate.Log().Error().Msgf("starting service %s error %#v", task.Name(), err)
|
||||
failStatus = true
|
||||
_ = stdout.Close()
|
||||
_ = stderr.Close()
|
||||
@@ -64,7 +69,7 @@ service:
|
||||
iwg.Wait()
|
||||
|
||||
if err = cmd.Wait(); err != nil {
|
||||
wingmate.Log().Error().Str(serviceTag, path.Path()).Msgf("got error when waiting: %+v", err)
|
||||
wingmate.Log().Error().Str(serviceTag, task.Name()).Msgf("got error when waiting: %+v", err)
|
||||
}
|
||||
fail:
|
||||
if failStatus {
|
||||
|
||||
Reference in New Issue
Block a user