diff --git a/cmd/sshpiperd/internal/plugin/grpc.go b/cmd/sshpiperd/internal/plugin/grpc.go index 0e26e0c7..62de7307 100644 --- a/cmd/sshpiperd/internal/plugin/grpc.go +++ b/cmd/sshpiperd/internal/plugin/grpc.go @@ -502,6 +502,7 @@ func (g *GrpcPlugin) RecvLogs(writer io.Writer) error { type CmdPlugin struct { GrpcPlugin + Quit <-chan error } func DialCmd(cmd *exec.Cmd) (*CmdPlugin, error) { @@ -514,11 +515,9 @@ func DialCmd(cmd *exec.Cmd) (*CmdPlugin, error) { _, _ = io.Copy(log.StandardLogger().Out, stderr) }() + ch := make(chan error, 1) go func() { - err := cmd.Wait() - if err != nil { - log.Errorf("cmd %v error: %v", cmd.Path, err) - } + ch <- cmd.Wait() }() conn, err := grpc.Dial("", grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithContextDialer(func(_ context.Context, _ string) (net.Conn, error) { @@ -535,5 +534,5 @@ func DialCmd(cmd *exec.Cmd) (*CmdPlugin, error) { return nil, err } - return &CmdPlugin{*g}, nil + return &CmdPlugin{*g, ch}, nil } diff --git a/cmd/sshpiperd/main.go b/cmd/sshpiperd/main.go index c75901ea..747b4fe4 100644 --- a/cmd/sshpiperd/main.go +++ b/cmd/sshpiperd/main.go @@ -48,30 +48,23 @@ func splitByDash(args []string) ([]string, []string) { return args, nil } -func createPlugin(args []string) (*plugin.GrpcPlugin, error) { +func createCmdPlugin(args []string) (*plugin.CmdPlugin, error) { exe := args[0] - switch exe { - case "grpc": - log.Info("starting net grpc plugin: ") - return createNetGrpcPlugin(args) + cmd := exec.Command(exe) + cmd.Args = args + setPdeathsig(cmd) - default: - cmd := exec.Command(exe) - cmd.Args = args - setPdeathsig(cmd) + log.Info("starting child process plugin: ", cmd.Args) - log.Info("starting child process plugin: ", cmd.Args) - - p, err := plugin.DialCmd(cmd) - if err != nil { - return nil, err - } - - p.Name = exe - - return &p.GrpcPlugin, nil + p, err := plugin.DialCmd(cmd) + if err != nil { + return nil, err } + + p.Name = exe + + return p, nil } func main() { @@ -138,6 +131,7 @@ func main() { return err } + quit := make(chan error) d.lis = &proxyproto.Listener{Listener: d.lis} var plugins []*plugin.GrpcPlugin @@ -156,9 +150,30 @@ func main() { continue } - p, err := createPlugin(args) - if err != nil { - return err + var p *plugin.GrpcPlugin + + switch args[0] { + case "grpc": + log.Info("starting net grpc plugin: ") + + grpcplugin, err := createNetGrpcPlugin(args) + if err != nil { + return err + } + + p = grpcplugin + + default: + cmdplugin, err := createCmdPlugin(args) + if err != nil { + return err + } + + go func() { + quit <- <-cmdplugin.Quit + }() + + p = &cmdplugin.GrpcPlugin } go func() { @@ -175,7 +190,11 @@ func main() { d.recorddir = ctx.String("typescript-log-dir") - return d.run() + go func() { + quit <- d.run() + }() + + return <-quit }, }