-
Notifications
You must be signed in to change notification settings - Fork 145
/
Copy pathbuild.go
139 lines (132 loc) · 4.06 KB
/
build.go
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package main
import (
"bufio"
"flag"
"fmt"
"io"
"log"
"os"
"os/exec"
"runtime"
)
func main() {
all := flag.Bool("all", false, "生成新的证书,生成控制端节点和普通节点")
nocert := flag.Bool("nocert", false, "不生成证书")
gencert := flag.Bool("gencert", false, "生成证书")
fullNode := flag.Bool("fullnode", false, "编译生成控制端节点+普通节点")
node := flag.Bool("node", false, "只生成普通节点")
fullNodeLite := flag.Bool("fullnode-lite", false, "编译生成lite版本的: 控制端节点+普通节点")
nodeLite := flag.Bool("node-lite", false, "只生成lite版本的: 普通节点")
genfullNodePrivate := flag.Bool("gen-private", false, "将private.pem转为private.go")
flag.Parse()
if *all == true {
*gencert = true
*fullNode = true
*node = true
*fullNodeLite = true
*nodeLite = true
}
if *nocert {
*gencert = false
}
if *genfullNodePrivate {
b, _ := os.ReadFile("./cert/private.pem")
data := fmt.Sprintf("package cert\r\n func init(){\r\nprivateKey=%#v\r\n}\r\n", b)
if err := os.WriteFile("./cert/private.go", []byte(data), 0655); err != nil {
fmt.Printf("写入./cert/private.go失败,错误 %v", err)
}
return
}
if *gencert {
if runtime.GOOS == "windows" {
_, err := exec.Command("cmd.exe", "/c", "cd gencert && go run main.go").CombinedOutput()
if err != nil {
log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`)
return
}
} else {
_, err := exec.Command("/bin/bash", "-c", "cd gencert && go run main.go").CombinedOutput()
if err != nil {
log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`)
return
}
}
}
if b, _ := os.ReadFile("./cert/private.pem"); len(b) == 0 {
log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`)
return
}
if b, _ := os.ReadFile("./cert/public.pem"); len(b) == 0 {
log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`)
return
}
if b, _ := os.ReadFile("./cert/server.crt"); len(b) == 0 {
log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`)
return
}
if b, _ := os.ReadFile("./cert/server.key"); len(b) == 0 {
log.Fatal(`无法生成证书,请手动执行"cd gencert && go run main.go"`)
return
}
if *fullNode {
b, _ := os.ReadFile("./cert/private.pem")
data := fmt.Sprintf("package cert\r\n func init(){\r\nprivateKey=%#v\r\n}\r\n", b)
os.WriteFile("./cert/private.go", []byte(data), 0655)
buildNode("build_fullnode")
} else if *node {
os.Remove("./cert/private.go")
buildNode("build_node")
}
if *fullNodeLite {
b, _ := os.ReadFile("./cert/private.pem")
data := fmt.Sprintf("package cert\r\n func init(){\r\nprivateKey=%#v\r\n}\r\n", b)
os.WriteFile("./cert/private.go", []byte(data), 0655)
buildNode("build_fullnode_lite")
} else if *nodeLite {
os.Remove("./cert/private.go")
buildNode("build_node_lite")
}
if !*gencert && !*fullNode && !*node && !*fullNodeLite && !*nodeLite && !*genfullNodePrivate {
flag.PrintDefaults()
}
}
func buildNode(name string) {
if runtime.GOOS == "windows" {
cmdstr := fmt.Sprintf(`cd build && %s.bat`, name)
err := runCommand("cmd.exe", "/c", cmdstr)
if err != nil {
log.Fatal(`无法编译,请手动执行 ` + cmdstr)
return
}
} else {
exec.Command("/bin/bash", "-c", "cd build && sudo chmod 755 "+name+".sh").CombinedOutput()
cmdstr := fmt.Sprintf(`cd build && ./%s.sh`, name)
err := runCommand("/bin/bash", "-c", cmdstr)
if err != nil {
log.Fatal(`无法编译,请手动执行 ` + cmdstr)
return
}
}
}
func runCommand(name string, arg ...string) error {
cmd := exec.Command(name, arg...)
stdout, err := cmd.StdoutPipe()
err = cmd.Start()
if err != nil {
return err
}
//创建一个流来读取管道内内容,这里逻辑是通过一行一行的读取的
reader := bufio.NewReader(stdout)
//实时循环读取输出流中的一行内容
go func() {
for {
line, err2 := reader.ReadString('\n')
if err2 != nil || io.EOF == err2 {
break
}
fmt.Print(line)
}
}()
cmd.Wait()
return err
}