grim/hgkeeper

f82b7c397849
Move from our custom yaml access setup to casbin
package commands
import (
"io"
"os/exec"
"strings"
"sync"
log "github.com/sirupsen/logrus"
"golang.org/x/crypto/ssh"
)
func run(cmd *exec.Cmd, conn ssh.Channel, serverConn *ssh.ServerConn, req *ssh.Request) error {
teardown := func() {
conn.Close()
if err := cmd.Wait(); err != nil {
log.Warnf(
"%s command %q failed: %v",
serverConn.RemoteAddr(),
strings.Join(cmd.Args, " "),
err,
)
req.Reply(false, nil)
return
}
log.Debugf(
"%s command %s finished",
serverConn.RemoteAddr(),
strings.Join(cmd.Args, " "),
)
req.Reply(true, nil)
}
stdinWriter, err := cmd.StdinPipe()
if err != nil {
return err
}
stdoutReader, err := cmd.StdoutPipe()
if err != nil {
return err
}
stderrReader, err := cmd.StderrPipe()
if err != nil {
return err
}
var once sync.Once
// now wire up stdin/stdout/stderr
go func() {
io.Copy(stdinWriter, conn)
once.Do(teardown)
}()
go func() {
io.Copy(conn, stdoutReader)
once.Do(teardown)
}()
go func() {
io.Copy(conn.Stderr(), stderrReader)
once.Do(teardown)
}()
if err := cmd.Start(); err != nil {
req.Reply(false, nil)
once.Do(teardown)
return err
}
return nil
}