From 6620430789202371df5add8ac563d98329790f01 Mon Sep 17 00:00:00 2001 From: Denis Vaumoron Date: Wed, 26 Jun 2024 18:39:22 +0200 Subject: [PATCH 1/3] fix lightweight proxy #183 Signed-off-by: Denis Vaumoron --- cmd/tenv/tenv.go | 10 ++-------- config/cmdconst/constant.go | 2 -- config/config.go | 9 +++++++++ versionmanager/proxy/agnostic.go | 2 +- versionmanager/proxy/cmd/proxy.go | 14 +++----------- versionmanager/proxy/light/light.go | 2 +- versionmanager/proxy/proxy.go | 6 +++--- 7 files changed, 19 insertions(+), 26 deletions(-) diff --git a/cmd/tenv/tenv.go b/cmd/tenv/tenv.go index 453738eb..a623477e 100644 --- a/cmd/tenv/tenv.go +++ b/cmd/tenv/tenv.go @@ -26,7 +26,6 @@ import ( "github.com/tofuutils/tenv/v2/config" "github.com/tofuutils/tenv/v2/config/cmdconst" - configutils "github.com/tofuutils/tenv/v2/config/utils" "github.com/tofuutils/tenv/v2/versionmanager" "github.com/tofuutils/tenv/v2/versionmanager/builder" "github.com/tofuutils/tenv/v2/versionmanager/proxy" @@ -96,7 +95,7 @@ func initRootCmd(conf *config.Config, builders map[string]builder.BuilderFunc, g flags.BoolVarP(&conf.DisplayVerbose, "verbose", "v", false, "verbose output (and set log level to Trace)") rootCmd.AddCommand(newVersionCmd()) - rootCmd.AddCommand(newUpdatePathCmd()) + rootCmd.AddCommand(newUpdatePathCmd(conf.GithubActions)) tofuParams := subCmdParams{ deprecated: true, // direct use should display a deprecation message @@ -187,7 +186,7 @@ func newVersionCmd() *cobra.Command { } } -func newUpdatePathCmd() *cobra.Command { +func newUpdatePathCmd(gha bool) *cobra.Command { return &cobra.Command{ Use: "update-path", Short: updatePathHelp, @@ -199,11 +198,6 @@ func newUpdatePathCmd() *cobra.Command { return nil } - gha, err := configutils.GetenvBool(false, cmdconst.GithubActionsEnvName) - if err != nil { - return err - } - execDirPath := filepath.Dir(execPath) if gha { pathfilePath := os.Getenv("GITHUB_PATH") diff --git a/config/cmdconst/constant.go b/config/cmdconst/constant.go index 1b09fb3d..83759188 100644 --- a/config/cmdconst/constant.go +++ b/config/cmdconst/constant.go @@ -27,6 +27,4 @@ const ( TofuName = "tofu" CallSubCmd = "call" - - GithubActionsEnvName = "GITHUB_ACTIONS" ) diff --git a/config/config.go b/config/config.go index 3aca0b73..c034d602 100644 --- a/config/config.go +++ b/config/config.go @@ -35,6 +35,8 @@ import ( ) const ( + githubActionsEnvName = "GITHUB_ACTIONS" + archEnvName = "ARCH" autoInstallEnvName = "AUTO_INSTALL" defaultConstraint = "DEFAULT_CONSTRAINT" @@ -117,6 +119,7 @@ type Config struct { DisplayVerbose bool ForceQuiet bool ForceRemote bool + GithubActions bool GithubToken string NoInstall bool remoteConfLoaded bool @@ -161,11 +164,17 @@ func InitConfigFromEnv() (Config, error) { return Config{}, err } + gha, err := configutils.GetenvBool(false, githubActionsEnvName) + if err != nil { + return Config{}, err + } + return Config{ Arch: arch, Atmos: makeRemoteConfig(AtmosRemoteURLEnvName, atmosListURLEnvName, atmosInstallModeEnvName, atmosListModeEnvName, defaultAtmosGithubURL, baseGithubURL), ForceQuiet: quiet, ForceRemote: forceRemote, + GithubActions: gha, GithubToken: configutils.GetenvFallback(tenvTokenEnvName, tofuTokenEnvName), NoInstall: !autoInstall, RemoteConfPath: os.Getenv(tenvRemoteConfEnvName), diff --git a/versionmanager/proxy/agnostic.go b/versionmanager/proxy/agnostic.go index 03faae06..fa04d277 100644 --- a/versionmanager/proxy/agnostic.go +++ b/versionmanager/proxy/agnostic.go @@ -65,5 +65,5 @@ func ExecAgnostic(conf *config.Config, builders map[string]builder.BuilderFunc, os.Exit(1) } - RunCmd(installPath, detectedVersion, execName, cmdArgs) + RunCmd(installPath, detectedVersion, execName, cmdArgs, conf.GithubActions) } diff --git a/versionmanager/proxy/cmd/proxy.go b/versionmanager/proxy/cmd/proxy.go index c82d5c77..c5f2121f 100644 --- a/versionmanager/proxy/cmd/proxy.go +++ b/versionmanager/proxy/cmd/proxy.go @@ -28,14 +28,11 @@ import ( "os/signal" "strconv" "strings" - - "github.com/tofuutils/tenv/v2/config/cmdconst" - configutils "github.com/tofuutils/tenv/v2/config/utils" ) var errDelimiter = errors.New("key and value should not contains delimiter") -func Run(execPath string, cmdArgs []string) { +func Run(execPath string, cmdArgs []string, gha bool) { exitCode := 0 defer func() { os.Exit(exitCode) @@ -43,7 +40,7 @@ func Run(execPath string, cmdArgs []string) { // proxy to selected version cmd := exec.Command(execPath, cmdArgs...) - done, err := initIO(cmd, execPath, &exitCode) + done, err := initIO(cmd, execPath, &exitCode, gha) if err != nil { exitWithErrorMsg(execPath, err, &exitCode) @@ -81,12 +78,7 @@ func exitWithErrorMsg(execName string, err error, pExitCode *int) { *pExitCode = 1 } -func initIO(cmd *exec.Cmd, execName string, pExitCode *int) (func(int), error) { - gha, err := configutils.GetenvBool(false, cmdconst.GithubActionsEnvName) - if err != nil { - return nil, err - } - +func initIO(cmd *exec.Cmd, execName string, pExitCode *int, gha bool) (func(int), error) { cmd.Stdin = os.Stdin if !gha { cmd.Stderr = os.Stderr diff --git a/versionmanager/proxy/light/light.go b/versionmanager/proxy/light/light.go index 6b1f3572..dd3ee7c3 100644 --- a/versionmanager/proxy/light/light.go +++ b/versionmanager/proxy/light/light.go @@ -26,5 +26,5 @@ import ( ) func Exec(execName string) { - proxycmd.Run(cmdconst.TenvName, append([]string{cmdconst.CallSubCmd, execName}, os.Args[1:]...)) + proxycmd.Run(cmdconst.TenvName, append([]string{cmdconst.CallSubCmd, execName}, os.Args[1:]...), false) } diff --git a/versionmanager/proxy/proxy.go b/versionmanager/proxy/proxy.go index 7c54a4c8..b7bc89b9 100644 --- a/versionmanager/proxy/proxy.go +++ b/versionmanager/proxy/proxy.go @@ -47,9 +47,9 @@ func Exec(conf *config.Config, builderFunc builder.BuilderFunc, gruntParser terr os.Exit(1) } - RunCmd(installPath, detectedVersion, execName, cmdArgs) + RunCmd(installPath, detectedVersion, execName, cmdArgs, conf.GithubActions) } -func RunCmd(installPath string, detectedVersion string, execName string, cmdArgs []string) { - cmdproxy.Run(filepath.Join(installPath, detectedVersion, execName), cmdArgs) +func RunCmd(installPath string, detectedVersion string, execName string, cmdArgs []string, gha bool) { + cmdproxy.Run(filepath.Join(installPath, detectedVersion, execName), cmdArgs, gha) } From 368ae8049eac7fb7a3ce98663d97d6c69ddfccc8 Mon Sep 17 00:00:00 2001 From: Denis Vaumoron Date: Wed, 26 Jun 2024 19:12:42 +0200 Subject: [PATCH 2/3] split package to lighter proxy #183 Signed-off-by: Denis Vaumoron --- .../proxy/cmd => pkg/cmdproxy}/proxy.go | 0 versionmanager/proxy/light/light.go | 41 ++++++++++++++++++- versionmanager/proxy/proxy.go | 2 +- 3 files changed, 40 insertions(+), 3 deletions(-) rename {versionmanager/proxy/cmd => pkg/cmdproxy}/proxy.go (100%) diff --git a/versionmanager/proxy/cmd/proxy.go b/pkg/cmdproxy/proxy.go similarity index 100% rename from versionmanager/proxy/cmd/proxy.go rename to pkg/cmdproxy/proxy.go diff --git a/versionmanager/proxy/light/light.go b/versionmanager/proxy/light/light.go index dd3ee7c3..46ed3ccf 100644 --- a/versionmanager/proxy/light/light.go +++ b/versionmanager/proxy/light/light.go @@ -19,12 +19,49 @@ package lightproxy import ( + "errors" + "fmt" "os" + "os/exec" + "os/signal" "github.com/tofuutils/tenv/v2/config/cmdconst" - proxycmd "github.com/tofuutils/tenv/v2/versionmanager/proxy/cmd" ) func Exec(execName string) { - proxycmd.Run(cmdconst.TenvName, append([]string{cmdconst.CallSubCmd, execName}, os.Args[1:]...), false) + cmdArgs := make([]string, 0, len(os.Args)+1) + cmdArgs = append(cmdArgs, cmdconst.CallSubCmd, execName) + cmdArgs = append(cmdArgs, os.Args[1:]...) + + // proxy to selected version + cmd := exec.Command(cmdconst.TenvName, cmdArgs...) + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + err := cmd.Start() + if err != nil { + exitWithErrorMsg(execName, err) + } + + signalChan := make(chan os.Signal) + go transmitSignal(signalChan, cmd.Process) + signal.Notify(signalChan, os.Interrupt) //nolint + + if err = cmd.Wait(); err != nil { + var exitError *exec.ExitError + if ok := errors.As(err, &exitError); ok { + os.Exit(exitError.ExitCode()) + } + exitWithErrorMsg(execName, err) + } +} + +func exitWithErrorMsg(execName string, err error) { + fmt.Println("Failure during", execName, "call :", err) //nolint + os.Exit(1) +} + +func transmitSignal(signalReceiver <-chan os.Signal, process *os.Process) { + for range signalReceiver { + _ = process.Signal(os.Interrupt) + } } diff --git a/versionmanager/proxy/proxy.go b/versionmanager/proxy/proxy.go index b7bc89b9..8a924010 100644 --- a/versionmanager/proxy/proxy.go +++ b/versionmanager/proxy/proxy.go @@ -25,8 +25,8 @@ import ( "path/filepath" "github.com/tofuutils/tenv/v2/config" + cmdproxy "github.com/tofuutils/tenv/v2/pkg/cmdproxy" "github.com/tofuutils/tenv/v2/versionmanager/builder" - cmdproxy "github.com/tofuutils/tenv/v2/versionmanager/proxy/cmd" terragruntparser "github.com/tofuutils/tenv/v2/versionmanager/semantic/parser/terragrunt" ) From 0c4276b37d217d4032844de6a5df1d2825350342 Mon Sep 17 00:00:00 2001 From: Denis Vaumoron Date: Wed, 26 Jun 2024 19:42:36 +0200 Subject: [PATCH 3/3] fix lint Signed-off-by: Denis Vaumoron --- versionmanager/proxy/light/light.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/versionmanager/proxy/light/light.go b/versionmanager/proxy/light/light.go index 46ed3ccf..abe06fed 100644 --- a/versionmanager/proxy/light/light.go +++ b/versionmanager/proxy/light/light.go @@ -29,12 +29,12 @@ import ( ) func Exec(execName string) { - cmdArgs := make([]string, 0, len(os.Args)+1) - cmdArgs = append(cmdArgs, cmdconst.CallSubCmd, execName) - cmdArgs = append(cmdArgs, os.Args[1:]...) + cmdArgs := make([]string, len(os.Args)+1) + cmdArgs[0], cmdArgs[1] = cmdconst.CallSubCmd, execName + copy(cmdArgs[2:], os.Args[1:]) // proxy to selected version - cmd := exec.Command(cmdconst.TenvName, cmdArgs...) + cmd := exec.Command(cmdconst.TenvName, cmdArgs...) //nolint cmd.Stderr = os.Stderr cmd.Stdout = os.Stdout err := cmd.Start()