140 lines
4.1 KiB
Go
140 lines
4.1 KiB
Go
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
|
|
}
|