func executeRootScript(script []*dockerscript.Command) error { if len(rootPlugins) > 0 { // If there are root plugins, wrap the script inside them var ( rootCmd *dockerscript.Command lastCmd *dockerscript.Command ) for _, plugin := range rootPlugins { pluginCmd := &dockerscript.Command{ Args: []string{plugin}, } if rootCmd == nil { rootCmd = pluginCmd } else { lastCmd.Children = []*dockerscript.Command{pluginCmd} } lastCmd = pluginCmd } lastCmd.Children = script script = []*dockerscript.Command{rootCmd} } handlers, err := Handlers(introspect) if err != nil { return err } defer handlers.Close() var tasks sync.WaitGroup defer func() { Debugf("Waiting for introspection...\n") tasks.Wait() Debugf("DONE Waiting for introspection\n") }() if introspect != nil { tasks.Add(1) go func() { Debugf("starting introspection\n") defer Debugf("done with introspection\n") defer tasks.Done() introspect.Send(data.Empty().Set("cmd", "log", "stdout").Set("message", "introspection worked!").Bytes(), nil) Debugf("XXX starting reading introspection messages\n") r := beam.NewRouter(handlers) r.NewRoute().All().Handler(func(p []byte, a *os.File) error { Logf("[INTROSPECTION] %s\n", beam.MsgDesc(p, a)) return handlers.Send(p, a) }) n, err := beam.Copy(r, introspect) Debugf("XXX done reading %d introspection messages: %v\n", n, err) }() } if err := executeScript(handlers, script); err != nil { return err } return nil }
func msgDesc(payload []byte, attachment *os.File) string { return beam.MsgDesc(payload, attachment) }