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
| }
|
|