зеркало из https://github.com/microsoft/docker.git
beam/examples/beamsh: simplify commands by always creating and sending stdout and stderr for them
Docker-DCO-1.1-Signed-off-by: Solomon Hykes <solomon@docker.com> (github: shykes)
This commit is contained in:
Родитель
63fd2ec0f7
Коммит
0822d67b2d
|
@ -187,7 +187,7 @@ func executeCommand(out beam.Sender, cmd *dockerscript.Command) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
type Handler func([]string, beam.Receiver, beam.Sender)
|
type Handler func([]string, io.Writer, io.Writer, beam.Receiver, beam.Sender)
|
||||||
|
|
||||||
|
|
||||||
func Handlers() (*beam.UnixConn, error) {
|
func Handlers() (*beam.UnixConn, error) {
|
||||||
|
@ -228,8 +228,18 @@ func Handlers() (*beam.UnixConn, error) {
|
||||||
if handler == nil {
|
if handler == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
stdout, err := beam.SendPipe(conn, data.Empty().Set("cmd", "log", "stdout").Set("fromcmd", cmd...).Bytes())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer stdout.Close()
|
||||||
|
stderr, err := beam.SendPipe(conn, data.Empty().Set("cmd", "log", "stderr").Set("fromcmd", cmd...).Bytes())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer stderr.Close()
|
||||||
Debugf("[handlers] calling %s\n", strings.Join(cmd, " "))
|
Debugf("[handlers] calling %s\n", strings.Join(cmd, " "))
|
||||||
handler(cmd, beam.Receiver(conn), beam.Sender(conn))
|
handler(cmd, stdout, stderr, beam.Receiver(conn), beam.Sender(conn))
|
||||||
Debugf("[handlers] returned: %s\n", strings.Join(cmd, " "))
|
Debugf("[handlers] returned: %s\n", strings.Join(cmd, " "))
|
||||||
}(payload, conn)
|
}(payload, conn)
|
||||||
}
|
}
|
||||||
|
@ -242,17 +252,7 @@ func Handlers() (*beam.UnixConn, error) {
|
||||||
|
|
||||||
func GetHandler(name string) Handler {
|
func GetHandler(name string) Handler {
|
||||||
if name == "logger" {
|
if name == "logger" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
stdout, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stdout").Set("fromcmd", args...).Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stdout.Close()
|
|
||||||
stderr, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stderr").Set("fromcmd", args...).Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stderr.Close()
|
|
||||||
if err := os.MkdirAll("logs", 0700); err != nil {
|
if err := os.MkdirAll("logs", 0700); err != nil {
|
||||||
fmt.Fprintf(stderr, "%v\n", err)
|
fmt.Fprintf(stderr, "%v\n", err)
|
||||||
return
|
return
|
||||||
|
@ -293,17 +293,7 @@ func GetHandler(name string) Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if name == "render" {
|
} else if name == "render" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
stdout, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stdout").Set("fromcmd", args...).Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stdout.Close()
|
|
||||||
stderr, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stderr").Set("fromcmd", args...).Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stderr.Close()
|
|
||||||
if len(args) != 2 {
|
if len(args) != 2 {
|
||||||
fmt.Fprintf(stderr, "Usage: %s FORMAT\n", args[0])
|
fmt.Fprintf(stderr, "Usage: %s FORMAT\n", args[0])
|
||||||
out.Send(data.Empty().Set("status", "1").Bytes(), nil)
|
out.Send(data.Empty().Set("status", "1").Bytes(), nil)
|
||||||
|
@ -334,7 +324,7 @@ func GetHandler(name string) Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if name == "devnull" {
|
} else if name == "devnull" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
for {
|
for {
|
||||||
_, attachment, err := in.Receive()
|
_, attachment, err := in.Receive()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -346,17 +336,7 @@ func GetHandler(name string) Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if name == "prompt" {
|
} else if name == "prompt" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
stdout, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stdout").Set("fromcmd", args...).Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stdout.Close()
|
|
||||||
stderr, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stderr").Set("fromcmd", args...).Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stderr.Close()
|
|
||||||
if len(args) < 2 {
|
if len(args) < 2 {
|
||||||
fmt.Fprintf(stderr, "usage: %s PROMPT...\n", args[0])
|
fmt.Fprintf(stderr, "usage: %s PROMPT...\n", args[0])
|
||||||
return
|
return
|
||||||
|
@ -379,17 +359,7 @@ func GetHandler(name string) Handler {
|
||||||
out.Send(data.Empty().Set("fromcmd", args...).Set("value", val).Bytes(), nil)
|
out.Send(data.Empty().Set("fromcmd", args...).Set("value", val).Bytes(), nil)
|
||||||
}
|
}
|
||||||
} else if name == "stdio" {
|
} else if name == "stdio" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
stdout, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stdout").Set("fromcmd", args...).Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stdout.Close()
|
|
||||||
stderr, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stderr").Set("fromcmd", args...).Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stderr.Close()
|
|
||||||
var tasks sync.WaitGroup
|
var tasks sync.WaitGroup
|
||||||
defer tasks.Wait()
|
defer tasks.Wait()
|
||||||
|
|
||||||
|
@ -412,16 +382,11 @@ func GetHandler(name string) Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if name == "echo" {
|
} else if name == "echo" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
stdout, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stdout").Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fmt.Fprintln(stdout, strings.Join(args[1:], " "))
|
fmt.Fprintln(stdout, strings.Join(args[1:], " "))
|
||||||
stdout.Close()
|
|
||||||
}
|
}
|
||||||
} else if name == "pass" {
|
} else if name == "pass" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
for {
|
for {
|
||||||
payload, attachment, err := in.Receive()
|
payload, attachment, err := in.Receive()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -436,24 +401,14 @@ func GetHandler(name string) Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if name == "in" {
|
} else if name == "in" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
os.Chdir(args[1])
|
os.Chdir(args[1])
|
||||||
GetHandler("pass")([]string{"pass"}, in, out)
|
GetHandler("pass")([]string{"pass"}, stdout, stderr, in, out)
|
||||||
}
|
}
|
||||||
} else if name == "exec" {
|
} else if name == "exec" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
cmd := exec.Command(args[1], args[2:]...)
|
cmd := exec.Command(args[1], args[2:]...)
|
||||||
stdout, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stdout").Set("fromcmd", args...).Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stdout.Close()
|
|
||||||
cmd.Stdout = stdout
|
cmd.Stdout = stdout
|
||||||
stderr, err := beam.SendPipe(out, data.Empty().Set("cmd", "log", "stderr").Set("fromcmd", args...).Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer stderr.Close()
|
|
||||||
cmd.Stderr = stderr
|
cmd.Stderr = stderr
|
||||||
cmd.Stdin = os.Stdin
|
cmd.Stdin = os.Stdin
|
||||||
execErr := cmd.Run()
|
execErr := cmd.Run()
|
||||||
|
@ -466,7 +421,7 @@ func GetHandler(name string) Handler {
|
||||||
out.Send(data.Empty().Set("status", status).Set("cmd", args...).Bytes(), nil)
|
out.Send(data.Empty().Set("status", status).Set("cmd", args...).Bytes(), nil)
|
||||||
}
|
}
|
||||||
} else if name == "trace" {
|
} else if name == "trace" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
for {
|
for {
|
||||||
p, a, err := in.Receive()
|
p, a, err := in.Receive()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -486,11 +441,11 @@ func GetHandler(name string) Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if name == "emit" {
|
} else if name == "emit" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
out.Send(data.Parse(args[1:]).Bytes(), nil)
|
out.Send(data.Parse(args[1:]).Bytes(), nil)
|
||||||
}
|
}
|
||||||
} else if name == "print" {
|
} else if name == "print" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
for {
|
for {
|
||||||
payload, a, err := in.Receive()
|
payload, a, err := in.Receive()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -513,7 +468,7 @@ func GetHandler(name string) Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if name == "multiprint" {
|
} else if name == "multiprint" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
var tasks sync.WaitGroup
|
var tasks sync.WaitGroup
|
||||||
for {
|
for {
|
||||||
payload, a, err := in.Receive()
|
payload, a, err := in.Receive()
|
||||||
|
@ -535,7 +490,7 @@ func GetHandler(name string) Handler {
|
||||||
tasks.Wait()
|
tasks.Wait()
|
||||||
}
|
}
|
||||||
} else if name == "listen" {
|
} else if name == "listen" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
if len(args) != 2 {
|
if len(args) != 2 {
|
||||||
out.Send(data.Empty().Set("status", "1").Set("message", "wrong number of arguments").Bytes(), nil)
|
out.Send(data.Empty().Set("status", "1").Set("message", "wrong number of arguments").Bytes(), nil)
|
||||||
return
|
return
|
||||||
|
@ -565,7 +520,7 @@ func GetHandler(name string) Handler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if name == "beamsend" {
|
} else if name == "beamsend" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
if len(args) < 2 {
|
if len(args) < 2 {
|
||||||
if err := out.Send(data.Empty().Set("status", "1").Set("message", "wrong number of arguments").Bytes(), nil); err != nil {
|
if err := out.Send(data.Empty().Set("status", "1").Set("message", "wrong number of arguments").Bytes(), nil); err != nil {
|
||||||
Fatal(err)
|
Fatal(err)
|
||||||
|
@ -583,7 +538,7 @@ func GetHandler(name string) Handler {
|
||||||
SendToConn(connections, in)
|
SendToConn(connections, in)
|
||||||
}
|
}
|
||||||
} else if name == "beamreceive" {
|
} else if name == "beamreceive" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
if len(args) != 2 {
|
if len(args) != 2 {
|
||||||
if err := out.Send(data.Empty().Set("status", "1").Set("message", "wrong number of arguments").Bytes(), nil); err != nil {
|
if err := out.Send(data.Empty().Set("status", "1").Set("message", "wrong number of arguments").Bytes(), nil); err != nil {
|
||||||
Fatal(err)
|
Fatal(err)
|
||||||
|
@ -601,7 +556,7 @@ func GetHandler(name string) Handler {
|
||||||
ReceiveFromConn(connections, out)
|
ReceiveFromConn(connections, out)
|
||||||
}
|
}
|
||||||
} else if name == "connect" {
|
} else if name == "connect" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
if len(args) != 2 {
|
if len(args) != 2 {
|
||||||
out.Send(data.Empty().Set("status", "1").Set("message", "wrong number of arguments").Bytes(), nil)
|
out.Send(data.Empty().Set("status", "1").Set("message", "wrong number of arguments").Bytes(), nil)
|
||||||
return
|
return
|
||||||
|
@ -650,7 +605,7 @@ func GetHandler(name string) Handler {
|
||||||
tasks.Wait()
|
tasks.Wait()
|
||||||
}
|
}
|
||||||
} else if name == "openfile" {
|
} else if name == "openfile" {
|
||||||
return func(args []string, in beam.Receiver, out beam.Sender) {
|
return func(args []string, stdout, stderr io.Writer, in beam.Receiver, out beam.Sender) {
|
||||||
for _, name := range args {
|
for _, name := range args {
|
||||||
f, err := os.Open(name)
|
f, err := os.Open(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче