fix(task/cron): use the correct pointer to build structure

feat(init): included enviroment variable and working directory
test(cron): wip
This commit is contained in:
Suyono 2024-03-29 11:30:36 +00:00
parent f2bfd6e60b
commit 3bdca8c540
8 changed files with 85 additions and 21 deletions

View File

@ -7,38 +7,37 @@ import (
"os/exec" "os/exec"
"gitea.suyono.dev/suyono/wingmate" "gitea.suyono.dev/suyono/wingmate"
"gitea.suyono.dev/suyono/wingmate/cmd/cli"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
const ( const (
// DummyPath = "/workspaces/wingmate/cmd/experiment/dummy/dummy"
DummyPath = "/usr/local/bin/wmdummy"
EnvDummyPath = "DUMMY_PATH"
EnvLog = "LOG" EnvLog = "LOG"
EnvLogMessage = "LOG_MESSAGE" EnvLogMessage = "LOG_MESSAGE"
EnvDefaultLogMessage = "oneshot executed" EnvDefaultLogMessage = "oneshot executed"
EnvInstanceNum = "INSTANCE_NUM" EnvInstanceNum = "INSTANCE_NUM"
EnvDefaultInstances = -1 EnvDefaultInstances = 0
) )
func main() { func main() {
viper.SetEnvPrefix(wingmate.EnvPrefix) viper.SetEnvPrefix(wingmate.EnvPrefix)
viper.BindEnv(EnvDummyPath)
viper.BindEnv(EnvLog) viper.BindEnv(EnvLog)
viper.BindEnv(EnvLogMessage) viper.BindEnv(EnvLogMessage)
viper.BindEnv(EnvInstanceNum) viper.BindEnv(EnvInstanceNum)
viper.SetDefault(EnvDummyPath, DummyPath)
viper.SetDefault(EnvLogMessage, EnvDefaultLogMessage) viper.SetDefault(EnvLogMessage, EnvDefaultLogMessage)
viper.SetDefault(EnvInstanceNum, EnvDefaultInstances) viper.SetDefault(EnvInstanceNum, EnvDefaultInstances)
exePath := viper.GetString(EnvDummyPath) _, childArgs, err := cli.SplitArgs(os.Args)
if err != nil {
log.Printf("splitargs: %+v", err)
os.Exit(2)
}
logPath := viper.GetString(EnvLog) logPath := viper.GetString(EnvLog)
logMessage := viper.GetString(EnvLogMessage) logMessage := viper.GetString(EnvLogMessage)
log.Println("log path:", logPath) log.Println("log path:", logPath)
if logPath != "" { if logPath != "" {
var ( var (
err error
file *os.File file *os.File
) )
@ -53,10 +52,12 @@ func main() {
} }
} }
StartInstances(exePath) if len(childArgs) > 0 {
StartInstances(childArgs[0], childArgs[1:]...)
}
} }
func StartInstances(exePath string) { func StartInstances(exePath string, args ...string) {
num := (rand.Uint32() % 16) + 16 num := (rand.Uint32() % 16) + 16
iNum := viper.GetInt(EnvInstanceNum) iNum := viper.GetInt(EnvInstanceNum)
@ -70,7 +71,7 @@ func StartInstances(exePath string) {
err error err error
) )
for ctr = 0; ctr < num; ctr++ { for ctr = 0; ctr < num; ctr++ {
cmd = exec.Command(exePath) cmd = exec.Command(exePath, args...)
if err = cmd.Start(); err != nil { if err = cmd.Start(); err != nil {
log.Printf("failed to run %s: %+v\n", exePath, err) log.Printf("failed to run %s: %+v\n", exePath, err)
} }

View File

@ -28,7 +28,7 @@ func main() {
t = time.NewTicker(time.Second * 5) t = time.NewTicker(time.Second * 5)
for { for {
cmd = exec.Command(exePath) cmd = exec.Command(exePath, "--", "wmdummy")
if err = cmd.Run(); err != nil { if err = cmd.Run(); err != nil {
log.Printf("failed to run %s: %+v\n", exePath, err) log.Printf("failed to run %s: %+v\n", exePath, err)
} else { } else {

View File

@ -25,3 +25,35 @@ service:
- "--pid-file" - "--pid-file"
- "/var/run/wmbg.pid" - "/var/run/wmbg.pid"
pidfile: "/var/run/wmbg.pid" pidfile: "/var/run/wmbg.pid"
cron:
cron1:
command:
- "wmoneshot"
- "--"
- "sleep"
- "5"
schedule: "*/5 * * * *"
environ:
- "WINGMATE_LOG=/var/log/cron1.log"
- "WINGMATE_LOG_MESSAGE=cron executed in minute 5,10,15,20,25,30,35,40,45,50,55"
cron2:
command:
- "wmoneshot"
- "--"
- "sleep"
- "5"
schedule: "17,42 */2 * * *"
environ:
- "WINGMATE_LOG=/var/log/cron2.log"
- "WINGMATE_LOG_MESSAGE=cron scheduled using 17,42 */2 * * *"
cron3:
command:
- "wmoneshot"
- "--"
- "sleep"
- "5"
schedule: "7,19,23,47 22 * * *"
environ:
- "WINGMATE_LOG=/var/log/cron3.log"
- "WINGMATE_LOG_MESSAGE=cron scheduled using 7,19,23,47 22 * * *"

View File

@ -2,6 +2,7 @@ package init
import ( import (
"io" "io"
"os"
"os/exec" "os/exec"
"sync" "sync"
"time" "time"
@ -34,6 +35,15 @@ cron:
goto fail goto fail
} }
cmd = exec.Command(cron.Command(), cron.Arguments()...) cmd = exec.Command(cron.Command(), cron.Arguments()...)
cmd.Env = os.Environ()
if cron.EnvLen() > 0 {
cmd.Env = append(cmd.Env, cron.Environ()...)
}
if len(cron.WorkingDir()) > 0 {
cmd.Dir = cron.WorkingDir()
}
iwg = &sync.WaitGroup{} iwg = &sync.WaitGroup{}
if stdout, err = cmd.StdoutPipe(); err != nil { if stdout, err = cmd.StdoutPipe(); err != nil {

View File

@ -25,6 +25,7 @@ type Task interface {
Name() string Name() string
Command() string Command() string
Arguments() []string Arguments() []string
EnvLen() int
Environ() []string Environ() []string
Setsid() bool Setsid() bool
UserGroup() UserGroup UserGroup() UserGroup

View File

@ -3,6 +3,7 @@ package init
import ( import (
"bufio" "bufio"
"io" "io"
"os"
"os/exec" "os/exec"
"sync" "sync"
"time" "time"
@ -39,6 +40,15 @@ service:
goto fail goto fail
} }
cmd = exec.Command(task.Command(), task.Arguments()...) cmd = exec.Command(task.Command(), task.Arguments()...)
cmd.Env = os.Environ()
if task.EnvLen() > 0 {
cmd.Env = append(cmd.Env, task.Environ()...)
}
if len(task.WorkingDir()) > 0 {
cmd.Dir = task.WorkingDir()
}
iwg = &sync.WaitGroup{} iwg = &sync.WaitGroup{}
if stdout, err = cmd.StdoutPipe(); err != nil { if stdout, err = cmd.StdoutPipe(); err != nil {

View File

@ -4,9 +4,10 @@ import (
"crypto/sha256" "crypto/sha256"
"encoding/json" "encoding/json"
"fmt" "fmt"
"gitea.suyono.dev/suyono/wingmate"
"time" "time"
"gitea.suyono.dev/suyono/wingmate"
wminit "gitea.suyono.dev/suyono/wingmate/init" wminit "gitea.suyono.dev/suyono/wingmate/init"
) )
@ -154,14 +155,14 @@ func (c *CronTask) Equals(another *CronTask) bool {
cmpStruct := func(p *CronTask) ([]byte, error) { cmpStruct := func(p *CronTask) ([]byte, error) {
s := &toCompare{ s := &toCompare{
Name: c.Name(), Name: p.Name(),
Command: c.Command(), Command: p.Command(),
Arguments: c.Arguments(), Arguments: p.Arguments(),
Environ: c.Environ(), Environ: p.Environ(),
Setsid: c.Setsid(), Setsid: p.Setsid(),
UserGroup: c.UserGroup().String(), UserGroup: p.UserGroup().String(),
WorkingDir: c.WorkingDir(), WorkingDir: p.WorkingDir(),
Schedule: c.cronScheduleString, Schedule: p.cronScheduleString,
} }
return json.Marshal(s) return json.Marshal(s)
@ -238,6 +239,10 @@ func (c *CronTask) Arguments() []string {
return retval return retval
} }
func (c *CronTask) EnvLen() int {
return len(c.environ)
}
func (c *CronTask) Environ() []string { func (c *CronTask) Environ() []string {
retval := make([]string, len(c.environ)) retval := make([]string, len(c.environ))
copy(retval, c.environ) copy(retval, c.environ)

View File

@ -4,6 +4,7 @@ import (
"crypto/sha256" "crypto/sha256"
"encoding/json" "encoding/json"
"fmt" "fmt"
"gitea.suyono.dev/suyono/wingmate" "gitea.suyono.dev/suyono/wingmate"
wminit "gitea.suyono.dev/suyono/wingmate/init" wminit "gitea.suyono.dev/suyono/wingmate/init"
@ -293,6 +294,10 @@ func (t *ServiceTask) Arguments() []string {
return retval return retval
} }
func (t *ServiceTask) EnvLen() int {
return len(t.environ)
}
func (t *ServiceTask) Environ() []string { func (t *ServiceTask) Environ() []string {
retval := make([]string, len(t.environ)) retval := make([]string, len(t.environ))
copy(retval, t.environ) copy(retval, t.environ)