diff --git a/swarmd/swarmd.go b/swarmd/swarmd.go index c470050df7..a6ddecf3ad 100644 --- a/swarmd/swarmd.go +++ b/swarmd/swarmd.go @@ -6,6 +6,8 @@ import ( "github.com/docker/swarmd/backends" "github.com/dotcloud/docker/api/server" "github.com/dotcloud/docker/engine" + "github.com/flynn/go-shlex" + "io" "os" "strings" "time" @@ -36,10 +38,13 @@ func cmdDaemon(c *cli.Context) { // multiplexes across all backends (with routing / filtering // logic along the way). back := backends.New() - backendName := c.String("backend") - fmt.Printf("Loading backend '%s'\n", backendName) - if err := back.Job(backendName).Run(); err != nil { - Fatalf("%s: %v\n", backendName, err) + bName, bArgs, err := parseCmd(c.String("backend")) + if err != nil { + Fatalf("%v", err) + } + fmt.Printf("---> Loading backend '%s'\n", strings.Join(append([]string{bName}, bArgs...), " ")) + if err := back.Job(bName, bArgs...).Run(); err != nil { + Fatalf("%s: %v\n", bName, err) } // Register the API entrypoint @@ -75,6 +80,28 @@ func cmdDaemon(c *cli.Context) { <-make(chan struct{}) } +func parseCmd(txt string) (string, []string, error) { + l, err := shlex.NewLexer(strings.NewReader(txt)) + if err != nil { + return "", nil, err + } + var cmd []string + for { + word, err := l.NextWord() + if err == io.EOF { + break + } + if err != nil { + return "", nil, err + } + cmd = append(cmd, word) + } + if len(cmd) == 0 { + return "", nil, fmt.Errorf("parse error: empty command") + } + return cmd[0], cmd[1:], nil +} + func Fatalf(msg string, args ...interface{}) { if !strings.HasSuffix(msg, "\n") { msg = msg + "\n"