-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathnetmaker.go
144 lines (136 loc) · 3.94 KB
/
netmaker.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
140
141
142
143
144
package cmd
import (
"encoding/json"
"net/http"
"os"
"strings"
"time"
"github.com/bitfield/script"
"github.com/joho/godotenv"
"github.com/pterm/pterm"
)
type Release struct {
Version string `json:"tag_name"`
}
func installNetmaker() {
var netEnv map[string]string
latest = getLatestRelease()
pterm.Println("installing netmaker version ", latest)
//get files
baseURL := "https://raw.github.com/gravitl/netmaker/" + latest
getFile(baseURL, "/compose/docker-compose.yml", "./docker-compose.yml")
getFile(baseURL, "/scripts/netmaker.default.env", "./netmaker.default.env")
getFile(baseURL, "/docker/mosquitto.conf", "./mosquitto.conf")
getFile(baseURL, "/docker/wait.sh", "./wait.sh")
if pro {
getFile(baseURL, "/compose/docker-compose.pro.yml", "./docker-compose.override.yml")
getFile(baseURL, "/docker/Caddyfile-pro", "./Caddyfile")
} else {
getFile(baseURL, "/docker/Caddyfile", "./Caddyfile")
}
os.Chmod("wait.sh", 0700)
netEnv, err := godotenv.Read("./netmaker.default.env")
if err != nil {
panic(err)
}
netEnv["NM_EMAIL"] = email
netEnv["NM_DOMAIN"] = domain
netEnv["UI_IMAGE_TAG"] = latest
netEnv["SERVER_IMAGE_TAG"] = latest
netEnv["MASTER_KEY"] = masterkey
netEnv["MQ_USERNAME"] = mqUsername
netEnv["MQ_PASSWORD"] = mqPassword
netEnv["TURN_USERNAME"] = turnUsername
netEnv["TURN_PASSWORD"] = turnPassword
netEnv["INSTALL_TYPE"] = "ce"
if pro {
netEnv["INSTALL_TYPE"] = "pro"
netEnv["METRICS_EXPORTER"] = "on"
netEnv["PROMETHEUS"] = "on"
netEnv["NETMAKER_TENENT_ID"] = tenantID
netEnv["LICENSE_KEY"] = license
netEnv["SERVER_IMAGE_NAME"] = latest + "-ee"
}
// docker compose does not like quotes around strings
// remove quotes and write to .env
marhalled, err := godotenv.Marshal(netEnv)
if err != nil {
panic(err)
}
replaced, err := script.Echo(marhalled).Replace("\"", "").String()
if err != nil {
panic(err)
}
if err := os.WriteFile("./netmaker.env", []byte(replaced), 0700); err != nil {
panic(err)
}
if err := os.Symlink("./netmaker.env", ".env"); err != nil {
panic(err)
}
//ensure docker daemon is running
_, err = script.Exec("systemctl start docker").Stdout()
if err != nil {
panic(err)
}
pterm.Println("\nStarting containers...")
cmd := ""
if distro == "ubuntu" || distro == "debian" {
cmd = "docker-compose -f docker-compose.yml up -d --force-recreate"
} else {
cmd = "docker compose -f docker-compose.yml up -d --force-recreate"
}
if _, err := script.Exec(cmd).Stdout(); err != nil {
panic(err)
}
testConnection()
}
func getFile(baseURL, remote, local string) {
req, err := http.NewRequest(http.MethodGet, baseURL+remote, nil)
if err != nil {
panic(err)
}
if _, err := script.Do(req).WriteFile(local); err != nil {
panic(err)
}
}
func getLatestRelease() string {
request, err := http.NewRequest(http.MethodGet, "https://api.github.com/repos/gravitl/netmaker/releases/latest", nil)
if err != nil {
panic(err)
}
client := http.Client{
Timeout: time.Second * 10,
}
release := Release{}
resp, err := client.Do(request)
if err != nil {
panic(err)
}
if err := json.NewDecoder(resp.Body).Decode(&release); err != nil {
panic(err)
}
return release.Version
}
func testConnection() {
pterm.Println("\nTesting Server setup for https://api." + domain + "/api/server/status")
for i := 1; i < 9; i++ {
response, err := script.Get("https://api." + domain + "/api/server/status").String()
if err != nil {
if i == 8 {
pterm.Println("Caddy is having an issue setting up certificates, please investigate (docke logs cadd)")
pterm.Println("Exiting...")
os.Exit(1)
}
if strings.Contains(response, "legitimacy of server") {
pterm.Println("certificates not yet configured, retrying ...")
} else if strings.Contains(response, "left intact") {
pterm.Println("Certificates OK")
break
} else {
secs := i*5 + 10
pterm.Println("issue establishing connection, retrying in ", secs, " seconds...")
time.Sleep(time.Second * time.Duration(i*5+10))
}
}
}
}