@@ -2,27 +2,17 @@ package main
2
2
3
3
import (
4
4
"context"
5
- "errors"
6
5
"fmt"
7
6
"log/slog"
8
7
"os"
9
8
"os/exec"
10
- "os/signal"
11
9
"runtime"
12
10
"strconv"
13
11
"strings"
14
12
"syscall"
15
- "time"
16
-
17
- "github.com/hashicorp/go-reap"
18
- "golang.org/x/term"
19
13
)
20
14
21
- var (
22
- logLevel = new (slog.LevelVar )
23
- // killWait is the time to wait before forcefully terminating the child process
24
- killWait = 5 * time .Second
25
- )
15
+ var logLevel = new (slog.LevelVar )
26
16
27
17
func main () {
28
18
ctx := context .Background ()
@@ -68,18 +58,17 @@ func main() {
68
58
os .Exit (4 )
69
59
}
70
60
71
- if os .Getpid () == 1 {
72
- go reap .ReapChildren (nil , nil , nil , nil )
73
- }
74
-
75
61
cmd := os .Args [1 ]
76
62
args := os .Args [2 :]
77
63
78
64
if cmd == "yarn" || cmd == "npm" {
79
65
logger .WarnContext (ctx , cmd + " is not recommended. You might see unexpected behavior. Use node instead." )
80
66
}
81
67
82
- os .Exit (run (ctx , cmd , args , env .Environ (), logger ))
68
+ if err := run (cmd , args , env .Environ ()); err != nil {
69
+ logger .ErrorContext (ctx , "Could not run command" , "error" , err )
70
+ os .Exit (1 )
71
+ }
83
72
}
84
73
85
74
func loadEnvVars (ctx context.Context , cfg * Config , l * slog.Logger ) (* EnvMap , error ) {
@@ -108,7 +97,7 @@ func loadEnvVars(ctx context.Context, cfg *Config, l *slog.Logger) (*EnvMap, err
108
97
}
109
98
110
99
func loadConsul (ctx context.Context , addr string , c * Config , l * slog.Logger ) (Dict , error ) {
111
- l .Debug ( "Loading values from Consul" )
100
+ l .DebugContext ( ctx , "Loading values from Consul" )
112
101
113
102
client , err := NewConsul (addr )
114
103
if err != nil {
@@ -161,64 +150,15 @@ func loadVault(ctx context.Context, addr string, c *Config, l *slog.Logger) (Dic
161
150
return values , err
162
151
}
163
152
164
- func run (ctx context.Context , name string , args , env []string , l * slog.Logger ) int {
165
- ctx , cancel := context .WithCancel (ctx )
166
- defer cancel ()
167
-
168
- cmd := exec .CommandContext (ctx , name , args ... ) //nolint:gosec
169
- cmd .Env = append (os .Environ (), env ... )
170
- cmd .Stdin = os .Stdin
171
- cmd .Stderr = os .Stderr
172
- cmd .Stdout = os .Stdout
173
-
174
- isTerm := term .IsTerminal (int (os .Stdin .Fd ()))
175
- cmd .SysProcAttr = & syscall.SysProcAttr {Foreground : isTerm , Setsid : ! isTerm }
176
-
177
- if err := cmd .Start (); err != nil {
178
- l .ErrorContext (ctx , "Could not start command" , "error" , err , "cmd" , cmd .String ())
179
- return 1
180
- }
181
-
182
- sigch := make (chan os.Signal , 1 )
183
- exitch := make (chan os.Signal , 1 )
184
- signal .Notify (sigch )
185
- signal .Notify (exitch , syscall .SIGINT )
186
- defer signal .Stop (sigch )
187
- defer signal .Stop (exitch )
188
-
189
- // forward signals to the child process
190
- go func () {
191
- for s := range sigch {
192
- if s == syscall .SIGCHLD {
193
- continue
194
- }
195
-
196
- l .DebugContext (ctx , "Sending signal" , "signal" , s .String ())
197
- if err := cmd .Process .Signal (s ); err != nil && ! errors .Is (err , os .ErrProcessDone ) {
198
- l .ErrorContext (ctx , "Could not send signal to command" , "error" , err , "cmd" , cmd .String (), "signal" , s .String ())
199
- }
200
- }
201
- }()
202
-
203
- // handle forceful termination
204
- go func () {
205
- <- exitch
206
- time .Sleep (killWait )
207
- l .WarnContext (ctx , "Terminating unresponsive process" , "cmd" , cmd .String ())
208
- cancel ()
209
- }()
210
-
211
- if err := cmd .Wait (); err != nil {
212
- var exit * exec.ExitError
213
- if errors .As (err , & exit ) {
214
- return exit .ExitCode ()
215
- }
216
- l .ErrorContext (ctx , "Unknown error while running command" , "error" , err , "cmd" , cmd .String ())
217
- return 3
153
+ func run (name string , args , env []string ) error {
154
+ bin , err := exec .LookPath (name )
155
+ if err != nil {
156
+ return fmt .Errorf ("could not find %s: %w" , name , err )
218
157
}
219
158
220
- if code := cmd . ProcessState . ExitCode ( ); code != - 1 {
221
- return code
159
+ if err := syscall . Exec ( bin , args , env ); err != nil {
160
+ return fmt . Errorf ( "could not execute %s %s: %w" , name , strings . Join ( args , " " ), err )
222
161
}
223
- return 0
162
+
163
+ return nil
224
164
}
0 commit comments