yanghui
2021-06-28 b568d251606f82968b8103c485a0d70027c1d57e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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
}