WIP: added fallback env

This commit is contained in:
Suyono 2025-05-26 21:05:12 +10:00
parent 1827cf2e3e
commit 438e48c6fe
5 changed files with 68 additions and 20 deletions

View File

@ -32,7 +32,7 @@ func convert(cfg *config.Config) *wConfig {
for _, s := range cfg.Service { for _, s := range cfg.Service {
st := task.NewServiceTask(s.Name).SetCommand(s.Command...).SetEnv(s.Environ...) st := task.NewServiceTask(s.Name).SetCommand(s.Command...).SetEnv(s.Environ...)
st.SetFlagSetsid(s.Setsid).SetWorkingDir(s.WorkingDir) st.SetFallbackEnv(s.FallbackEnv...).SetFlagSetsid(s.Setsid).SetWorkingDir(s.WorkingDir)
st.SetUser(s.User).SetGroup(s.Group).SetStartSecs(s.StartSecs).SetPidFile(s.PidFile) st.SetUser(s.User).SetGroup(s.Group).SetStartSecs(s.StartSecs).SetPidFile(s.PidFile)
st.SetConfig(cfg) st.SetConfig(cfg)
retval.tasks.AddService(st) retval.tasks.AddService(st)
@ -52,7 +52,8 @@ func convert(cfg *config.Config) *wConfig {
schedule = configToTaskCronSchedule(c.CronSchedule) schedule = configToTaskCronSchedule(c.CronSchedule)
ct := task.NewCronTask(c.Name).SetCommand(c.Command...).SetEnv(c.Environ...) ct := task.NewCronTask(c.Name).SetCommand(c.Command...).SetEnv(c.Environ...)
ct.SetFlagSetsid(c.Setsid).SetWorkingDir(c.WorkingDir).SetUser(c.User).SetGroup(c.Group) ct.SetFallbackEnv(c.FallbackEnv...).SetFlagSetsid(c.Setsid).SetWorkingDir(c.WorkingDir)
ct.SetUser(c.User).SetGroup(c.Group)
ct.SetSchedule(c.Schedule, schedule) ct.SetSchedule(c.Schedule, schedule)
ct.SetConfig(cfg) ct.SetConfig(cfg)

View File

@ -42,12 +42,13 @@ type Config struct {
} }
type Task struct { type Task struct {
Command []string `mapstructure:"command"` Command []string `mapstructure:"command"`
Environ []string `mapstructure:"environ"` Environ []string `mapstructure:"environ"`
Setsid bool `mapstructure:"setsid"` FallbackEnv []string `mapstructure:"fallback_env"`
User string `mapstructure:"user"` Setsid bool `mapstructure:"setsid"`
Group string `mapstructure:"group"` User string `mapstructure:"user"`
WorkingDir string `mapstructure:"working_dir"` Group string `mapstructure:"group"`
WorkingDir string `mapstructure:"working_dir"`
} }
type ServiceTask struct { type ServiceTask struct {

View File

@ -81,6 +81,7 @@ type CronTask struct {
command []string command []string
cmdLine []string cmdLine []string
environ []string environ []string
fallbackEnv []string
setsid bool setsid bool
workingDir string workingDir string
lastRun time.Time lastRun time.Time
@ -107,6 +108,12 @@ func (c *CronTask) SetEnv(envs ...string) *CronTask {
return c return c
} }
func (c *CronTask) SetFallbackEnv(envs ...string) *CronTask {
c.fallbackEnv = make([]string, len(envs))
copy(c.fallbackEnv, envs)
return c
}
func (c *CronTask) SetFlagSetsid(flag bool) *CronTask { func (c *CronTask) SetFlagSetsid(flag bool) *CronTask {
c.setsid = flag c.setsid = flag
return c return c
@ -257,7 +264,8 @@ func (c *CronTask) Environ() []string {
} }
func (c *CronTask) PatchEnv(env []string) []string { func (c *CronTask) PatchEnv(env []string) []string {
return wmenv.PatchEnv(env, c.environ) env = wmenv.PatchEnv(env, c.environ)
return wmenv.FallbackEnv(env, c.fallbackEnv)
} }
func (c *CronTask) Setsid() bool { func (c *CronTask) Setsid() bool {

30
task/env/env.go vendored
View File

@ -95,3 +95,33 @@ func ExpandEnv(env []string, input []string) []string {
} }
return input return input
} }
func FallbackEnv(env []string, fallbacks []string) []string {
envMap := make(map[string]string)
for _, e := range env {
key, value, ok := strings.Cut(e, "=")
if !ok {
wingmate.Log().Warn().Msgf("removing bad environment:", e)
continue
}
envMap[key] = value
}
for _, e := range fallbacks {
key, value, ok := strings.Cut(e, "=")
if !ok {
wingmate.Log().Warn().Msgf("removing bad environment:", e)
continue
}
value = envCapture.ReplaceAllStringFunc(value, func(rep string) string {
return expandEnv(envMap, rep)
})
if _, ok = envMap[key]; !ok {
env = append(env, fmt.Sprintf("%s=%s", key, value))
}
}
return env
}

View File

@ -72,16 +72,17 @@ func (ts *Tasks) Get(name string) (wminit.Task, error) {
} }
type ServiceTask struct { type ServiceTask struct {
name string name string
command []string command []string
cmdLine []string cmdLine []string
environ []string environ []string
setsid bool fallbackEnv []string
background bool setsid bool
workingDir string background bool
startSecs uint workingDir string
pidFile string startSecs uint
config config pidFile string
config config
userGroup userGroup
} }
@ -103,6 +104,12 @@ func (t *ServiceTask) SetEnv(envs ...string) *ServiceTask {
return t return t
} }
func (t *ServiceTask) SetFallbackEnv(envs ...string) *ServiceTask {
t.fallbackEnv = make([]string, len(envs))
copy(t.fallbackEnv, envs)
return t
}
func (t *ServiceTask) SetFlagSetsid(flag bool) *ServiceTask { func (t *ServiceTask) SetFlagSetsid(flag bool) *ServiceTask {
t.setsid = flag t.setsid = flag
return t return t
@ -311,7 +318,8 @@ func (t *ServiceTask) Environ() []string {
} }
func (t *ServiceTask) PatchEnv(env []string) []string { func (t *ServiceTask) PatchEnv(env []string) []string {
return wmenv.PatchEnv(env, t.environ) env = wmenv.PatchEnv(env, t.environ)
return wmenv.FallbackEnv(env, t.fallbackEnv)
} }
func (t *ServiceTask) Setsid() bool { func (t *ServiceTask) Setsid() bool {