grim/hgkeeper
Clone
Summary
Browse
Changes
Graph
Move from our custom yaml access setup to casbin
2019-09-09, Gary Kramlich
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
}