test: prepare

This commit is contained in:
2023-12-09 08:40:07 +00:00
parent d5eb872b13
commit dd66cb9f1e
12 changed files with 221 additions and 35 deletions

View File

@@ -1,6 +1,7 @@
package init
import (
"io"
"os/exec"
"sync"
"time"
@@ -8,19 +9,60 @@ import (
"gitea.suyono.dev/suyono/wingmate"
)
const (
cronTag = "cron"
)
func (i *Init) cron(wg *sync.WaitGroup, cron Cron, exitFlag <-chan any) {
defer wg.Done()
var (
iwg *sync.WaitGroup
err error
stdout io.ReadCloser
stderr io.ReadCloser
)
ticker := time.NewTicker(time.Second * 20)
cron:
for {
if cron.TimeToRun(time.Now()) {
cmd := exec.Command(cron.Command().Path())
if err := cmd.Run(); err != nil {
wingmate.Log().Error().Msgf("running cron %s error %#v", cron.Command().Path(), err)
iwg = &sync.WaitGroup{}
if stdout, err = cmd.StdoutPipe(); err != nil {
wingmate.Log().Error().Str(cronTag, cron.Command().Path()).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)
_ = stdout.Close()
goto fail
}
iwg.Add(1)
go i.pipeReader(iwg, stdout, cronTag, cron.Command().Path())
iwg.Add(1)
go i.pipeReader(iwg, stderr, cronTag, cron.Command().Path())
if err := cmd.Start(); err != nil {
wingmate.Log().Error().Msgf("starting cron %s error %+v", cron.Command().Path(), err)
_ = stdout.Close()
_ = stderr.Close()
iwg.Wait()
goto fail
}
iwg.Wait()
if err = cmd.Wait(); err != nil {
wingmate.Log().Error().Str(cronTag, cron.Command().Path()).Msgf("got error when waiting: %+v", err)
}
}
fail:
select {
case <-exitFlag:
ticker.Stop()

View File

@@ -29,9 +29,9 @@ func (i *Init) service(wg *sync.WaitGroup, path Path, exitFlag <-chan any) {
wingmate.Log().Info().Str(serviceTag, path.Path()).Msg("stopped")
}()
failStatus = false
service:
for {
failStatus = false
cmd := exec.Command(path.Path())
iwg = &sync.WaitGroup{}
@@ -41,7 +41,7 @@ service:
goto fail
}
iwg.Add(1)
go i.pipeReader(iwg, stdout, path.Path())
go i.pipeReader(iwg, stdout, serviceTag, path.Path())
if stderr, err = cmd.StderrPipe(); err != nil {
wingmate.Log().Error().Str(serviceTag, path.Path()).Msgf("stderr pipe: %#v", err)
@@ -50,11 +50,14 @@ service:
goto fail
}
iwg.Add(1)
go i.pipeReader(iwg, stderr, path.Path())
go i.pipeReader(iwg, stderr, serviceTag, path.Path())
if err = cmd.Start(); err != nil {
wingmate.Log().Error().Msgf("starting service %s error %#v", path.Path(), err)
failStatus = true
_ = stdout.Close()
_ = stderr.Close()
iwg.Wait()
goto fail
}
@@ -77,17 +80,17 @@ service:
}
func (i *Init) pipeReader(wg *sync.WaitGroup, pipe io.ReadCloser, serviceName string) {
func (i *Init) pipeReader(wg *sync.WaitGroup, pipe io.ReadCloser, tag, serviceName string) {
defer wg.Done()
scanner := bufio.NewScanner(pipe)
for scanner.Scan() {
wingmate.Log().Info().Str(serviceTag, serviceName).Msg(scanner.Text())
wingmate.Log().Info().Str(tag, serviceName).Msg(scanner.Text())
}
if err := scanner.Err(); err != nil {
wingmate.Log().Error().Str(serviceTag, serviceName).Msgf("got error when reading pipe: %#v", err)
wingmate.Log().Error().Str(tag, serviceName).Msgf("got error when reading pipe: %#v", err)
}
wingmate.Log().Info().Str(serviceTag, serviceName).Msg("closing pipe")
wingmate.Log().Info().Str(tag, serviceName).Msg("closing pipe")
}

View File

@@ -27,11 +27,13 @@ func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag
flagged = true
wait:
for {
select {
case <-runningFlag:
wingmate.Log().Info().Msg("waiter received shutdown signal...")
running = false
default:
if running {
select {
case <-runningFlag:
wingmate.Log().Info().Msg("waiter received shutdown signal...")
running = false
default:
}
}
if _, err = unix.Wait4(-1, &ws, 0, nil); err != nil {