func iteratePlan(tree *processtree.ProcessTree, plan map[string]interface{}, parent *processtree.SlaveNode) { for name, v := range plan { if subPlan, ok := v.(map[string]interface{}); ok { newNode := tree.NewSlaveNode(name, parent) if parent == nil { tree.Root = newNode } else { parent.Slaves = append(parent.Slaves, newNode) } iteratePlan(tree, subPlan, newNode) } else { var newNode *processtree.CommandNode if aliases, ok := v.([]interface{}); ok { strs := make([]string, len(aliases)) for i, alias := range aliases { strs[i] = alias.(string) } newNode = tree.NewCommandNode(name, strs, parent) } else if v == nil { newNode = tree.NewCommandNode(name, nil, parent) } else { zerror.ErrorConfigFileInvalidFormat() } parent.Commands = append(parent.Commands, newNode) } } }
func bootNewCommand(slaveNode *processtree.SlaveNode, command string, err error) (*unixsocket.Usock, error) { if err != nil { return nil, err } request := &processtree.CommandRequest{command, make(chan *os.File)} slaveNode.RequestCommandBoot(request) commandFile := <-request.Retchan // TODO: don't really want to wait indefinitely. // defer commandFile.Close() // TODO: can't do this here anymore. return unixsocket.NewUsockFromFile(commandFile) }