diff --git a/cmd/cli/splitargs.go b/cmd/cli/splitargs.go index 4c7e56d..ff998a6 100644 --- a/cmd/cli/splitargs.go +++ b/cmd/cli/splitargs.go @@ -23,7 +23,7 @@ func SplitArgs(args []string) ([]string, []string, error) { return nil, nil, errors.New("invalid argument") } - selfArgs = args[1:i] + selfArgs = args[:i] childArgs = args[i+1:] break } diff --git a/cmd/exec/exec.go b/cmd/exec/exec.go index e3b2e68..ed979e5 100644 --- a/cmd/exec/exec.go +++ b/cmd/exec/exec.go @@ -71,11 +71,13 @@ func main() { app.version.Cmd(rootCmd) - selfArgs, childArgs, err = cli.SplitArgs(os.Args) + if selfArgs, childArgs, err = cli.SplitArgs(os.Args); err != nil { + selfArgs = os.Args + } app.childArgs = childArgs app.err = err - rootCmd.SetArgs(selfArgs) + rootCmd.SetArgs(selfArgs[1:]) if err := rootCmd.Execute(); err != nil { log.Println(err) os.Exit(1) diff --git a/cmd/experiment/starter/starter.go b/cmd/experiment/starter/starter.go index 656d99d..7f82bcd 100644 --- a/cmd/experiment/starter/starter.go +++ b/cmd/experiment/starter/starter.go @@ -35,24 +35,26 @@ func main() { ) if selfArgs, childArgs, err = cli.SplitArgs(os.Args); err == nil { flagSet = pflag.NewFlagSet(selfArgs[0], pflag.ExitOnError) - flagSet.Bool(NoWaitFlag, false, "do not wait for the child process") + flagSet.Count(NoWaitFlag, "do not wait for the child process") if err = flagSet.Parse(selfArgs[1:]); err != nil { log.Printf("invalid argument: %+v", err) return } } else { flagSet = pflag.NewFlagSet(os.Args[0], pflag.ExitOnError) - flagSet.Bool(NoWaitFlag, false, "do not wait for the child process") - if err = flagSet.Parse(selfArgs[1:]); err != nil { + flagSet.Count(NoWaitFlag, "do not wait for the child process") + if err = flagSet.Parse(os.Args[1:]); err != nil { log.Printf("invalid argument: %+v", err) return } } - viper.BindPFlag(NoWaitFlag, flagSet.Lookup(NoWaitFlag)) - noWait = viper.GetBool(NoWaitFlag) + _ = viper.BindPFlag(NoWaitFlag, flagSet.Lookup(NoWaitFlag)) + if viper.GetInt(NoWaitFlag) > 0 { + noWait = true + } viper.SetEnvPrefix(wingmate.EnvPrefix) - viper.BindEnv(EnvDummyPath) + _ = viper.BindEnv(EnvDummyPath) viper.SetDefault(EnvDummyPath, DummyPath) exePath = viper.GetString(EnvDummyPath) diff --git a/cmd/pidproxy/pidproxy.go b/cmd/pidproxy/pidproxy.go index 0bb89b6..0808c49 100644 --- a/cmd/pidproxy/pidproxy.go +++ b/cmd/pidproxy/pidproxy.go @@ -58,21 +58,23 @@ func main() { } viper.SetEnvPrefix(wingmate.EnvPrefix) - viper.BindEnv(EnvStartSecs) + _ = viper.BindEnv(EnvStartSecs) viper.SetDefault(EnvStartSecs, EnvDefaultStartSecs) rootCmd.PersistentFlags().StringP(pidFileFlag, "p", "", "location of pid file") - rootCmd.MarkFlagRequired(pidFileFlag) - viper.BindPFlag(pidFileFlag, rootCmd.PersistentFlags().Lookup(pidFileFlag)) + _ = rootCmd.MarkFlagRequired(pidFileFlag) + _ = viper.BindPFlag(pidFileFlag, rootCmd.PersistentFlags().Lookup(pidFileFlag)) app.version.Flag(rootCmd) app.version.Cmd(rootCmd) - selfArgs, childArgs, err = cli.SplitArgs(os.Args) + if selfArgs, childArgs, err = cli.SplitArgs(os.Args); err != nil { + selfArgs = os.Args + } app.childArgs = childArgs app.err = err - rootCmd.SetArgs(selfArgs) + rootCmd.SetArgs(selfArgs[1:]) if err := rootCmd.Execute(); err != nil { log.Println(err) os.Exit(1) @@ -111,7 +113,10 @@ check: } if err = unix.Kill(pid, syscall.Signal(0)); err != nil { - return err + if !errors.Is(err, unix.ESRCH) { + return err + } + break check } select { diff --git a/config/util.go b/config/util.go index c4d92ab..6dfaa70 100644 --- a/config/util.go +++ b/config/util.go @@ -1,6 +1,8 @@ package config import ( + "fmt" + "io" "os/exec" "strings" ) @@ -10,14 +12,26 @@ func getVersion(binPath string) (string, error) { outBytes []byte err error output string + stdout io.ReadCloser + n int ) cmd := exec.Command(binPath, "version") - outBytes, err = cmd.Output() - if err != nil { - return "", err + if stdout, err = cmd.StdoutPipe(); err != nil { + return "", fmt.Errorf("setting up stdout reader: %w", err) } - output = string(outBytes) + if err = cmd.Start(); err != nil { + return "", fmt.Errorf("starting process: %w", err) + } + + outBytes = make([]byte, 1024) + if n, err = stdout.Read(outBytes); err != nil { + return "", fmt.Errorf("reading stdout: %w", err) + } + + _ = cmd.Wait() + + output = string(outBytes[:n]) output = strings.TrimRight(output, versionTrimRightCutSet) return output, nil } diff --git a/docker/bookworm-newconfig/etc/wingmate/wingmate.yaml b/docker/bookworm-newconfig/etc/wingmate/wingmate.yaml index da3e3fa..b0e829b 100644 --- a/docker/bookworm-newconfig/etc/wingmate/wingmate.yaml +++ b/docker/bookworm-newconfig/etc/wingmate/wingmate.yaml @@ -6,3 +6,22 @@ service: spawner: command: [ "wmspawner" ] user: "1200" + + bgtest: + command: + - "wmstarter" + - "--no-wait" + - "--" + - "wmexec" + - "--setsid" + - "--" + - "wmbg" + - "--name" + - "test-run" + - "--pause" + - "10" + - "--log-path" + - "/var/log/wmbg.log" + - "--pid-file" + - "/var/run/wmbg.pid" + pidfile: "/var/run/wmbg.pid" diff --git a/init/cron.go b/init/cron.go index 17d41b0..c93ccfe 100644 --- a/init/cron.go +++ b/init/cron.go @@ -63,9 +63,7 @@ cron: iwg.Wait() - if err = cmd.Wait(); err != nil { - wingmate.Log().Error().Str(cronTag, cron.Name()).Msgf("got error when waiting: %+v", err) - } + _ = cmd.Wait() } fail: diff --git a/init/service.go b/init/service.go index d9a3ada..89fbe58 100644 --- a/init/service.go +++ b/init/service.go @@ -69,9 +69,8 @@ service: iwg.Wait() - if err = cmd.Wait(); err != nil { - wingmate.Log().Error().Str(serviceTag, task.Name()).Msgf("got error when waiting: %+v", err) - } + _ = cmd.Wait() + fail: if failStatus { time.Sleep(time.Second)