package service import ( "basic.com/valib/logger.git" "bee-config/config" "bee-config/models" "bee-config/utils" "os" "strings" "time" ) func AddNode() (string, error) { var node models.BeeNode arr, err := node.FindAll() if nil != err { logger.Error("AddNode failed to read all data, err:", err) return "", err } id := uint8(getNextId(arr)) dir := config.GetNodeDir(id) if _, err := os.Stat(dir); os.IsNotExist(err) { _ = os.MkdirAll(dir, os.ModePerm) } err = config.GenerateDockerFile(dir, id) if nil != err { logger.Error("AddNode failed to generate docker file, err:", err) return "", err } _, err = utils.ShellExecute(dir, "docker-compose", "up", "-d") if nil != err { logger.Error("AddNode failed to invoke docker-compose up, err:", err) return "", err } address, err := utils.ShellExecuteEx(1 * time.Minute, terminate, dir, "docker-compose", "logs", "-f", "bee-1") if nil != err { logger.Error("AddNode failed to invoke docker-compose logs, err:", err) return "", err } n := models.BeeNode { Id: int(id), Address: address, Dir: dir, ApiPort: uint16(config.GetApiPort(id)), P2PPort: uint16(config.GetP2pPort(id)), DebugPort: uint16(config.GetDebugPort(id)), Status: 0, Del: 0, } err = n.Save() if nil != err { logger.Error("AddNode failed to save to db, err:", err) return "", err } return address, nil } func terminate(line string) string { token := "using ethereum address" length := len("b02363e9ec1b2eba9415786a4fab459122d50aa1") index := strings.Index(line, token) if -1 == index { return "" } index += len(token) substring := line[index:] index = 0 for { if substring[index] == ' ' { index++ continue } break; } substring = substring[index:] substring = substring[:length] return substring } func getNextId(arr []models.BeeNode) int { nextId := len(arr) + 1 if len(arr) == 0 { return nextId } maxId := arr[0].Id conflicts := false for _, v := range arr { if v.Id == nextId { conflicts = true } if v.Id > maxId { maxId = v.Id } } if conflicts { nextId = maxId + 1 } return nextId }