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 (s *StatusChart) drawSubtree(node *processtree.SlaveNode, myIndentation, childIndentation string) { printStateInfo(myIndentation, node.Name, node.State(), false, true) for i, slave := range node.Slaves { if i == len(node.Slaves)-1 { s.drawSubtree(slave, childIndentation+lineL, childIndentation+lineX) } else { s.drawSubtree(slave, childIndentation+lineT, childIndentation+lineI) } } }
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) }
func bootNewCommand(slaveNode *processtree.SlaveNode, command string, err error) (*unixsocket.Usock, error) { if err != nil { return nil, err } request := &processtree.CommandRequest{Name: command, Retchan: make(chan *processtree.CommandReply)} slaveNode.RequestCommandBoot(request) reply := <-request.Retchan // TODO: don't really want to wait indefinitely. // defer commandFile.Close() // TODO: can't do this here anymore. if reply.State == processtree.SCrashed { return nil, errors.New("Process has crashed") } return unixsocket.NewFromFile(reply.File) }
func (s *StatusChart) logSubtree(node *processtree.SlaveNode) { log := theChart.directLogger printStateInfo("", node.Name, node.State(), true, false) if len(node.Slaves) > 0 { log.ColorizedSansNl("{reset}(") } for i, slave := range node.Slaves { if i != 0 { log.ColorizedSansNl("{reset}, ") } s.logSubtree(slave) } if len(node.Slaves) > 0 { log.ColorizedSansNl("{reset})") } }