-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.go
More file actions
269 lines (217 loc) · 7.7 KB
/
install.go
File metadata and controls
269 lines (217 loc) · 7.7 KB
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
package main
import (
"crypto/rand"
"encoding/hex"
"flag"
"fmt"
"log"
"net"
"os"
"os/exec"
"runtime"
"strings"
)
func cmd(cmd string) string {
if out, err := exec.Command("sh", "-c", cmd).Output(); err != nil && err.Error() != "exit status 1" &&
err.Error() != "exit status 2" {
log.Println("[error]", err, "("+cmd+")")
return ""
} else {
return string(out)
}
}
func randomHex(n int) string {
bytes := make([]byte, n)
_, _ = rand.Read(bytes)
return hex.EncodeToString(bytes)
}
func getIP() string {
if conn, err := net.Dial("udp", "8.8.8.8:80"); err == nil {
defer func() {
err := conn.Close()
if err != nil {
log.Println("[error]", err)
}
}()
return conn.LocalAddr().(*net.UDPAddr).IP.String()
} else {
log.Println("[error]", err, "(Couldn't identify IP | Не удалось определить IP)")
return ""
}
}
func getTrueIP(ver string) string {
ip := strings.Trim(cmd("curl ifconfig.co -"+ver), "\n")
if net.ParseIP(ip) != nil {
return ip
}
return ""
}
func main() {
if runtime.GOOS != "linux" {
fmt.Println("The platform is not supported | Платформа не поддерживается")
_, _ = fmt.Scanln()
return
}
log.Println(" Starting | Начало работы")
portStats := flag.String("p", "", "Is the local port for stats")
port := flag.String("H", "443", "Is the port, used by clients to connect to the proxy")
secret := flag.String("S", randomHex(16), "Secret")
tag := flag.String("P", "", "Ad tag get here @MTProxybot")
domain := flag.String("D", "www.google.com", "Domain with TLS 1.3 support")
start := flag.String("start", "", "Start server")
stop := flag.String("stop", "", "Stop server")
restart := flag.String("restart", "", "Restart server")
enable := flag.String("enable", "", "Enable server")
disable := flag.String("disable", "", "Disable server")
remove := flag.String("delete", "", "Delete server")
ipv6 := flag.Bool("6", false, "Activation of ipv6")
flag.Parse()
path := "/etc/systemd/system/MTProxy-" + *port + ".service"
if *start != "" {
cmd("systemctl start MTProxy-" + *start + ".service")
log.Println(" Server is started | Сервер запущен")
log.Println(" Program completed | Программа завершена")
return
}
if *stop != "" {
cmd("systemctl stop MTProxy-" + *stop + ".service")
log.Println(" Server is stopped | Сервер остановлен")
log.Println(" Program completed | Программа завершена")
return
}
if *restart != "" {
cmd("systemctl restart MTProxy-" + *restart + ".service")
log.Println(" Server is restarted | Сервер перезапущен")
log.Println(" Program completed | Программа завершена")
return
}
if *enable != "" {
cmd("systemctl daemon-reload")
cmd("systemctl restart MTProxy-" + *enable + ".service")
cmd("systemctl enable MTProxy-" + *enable + ".service")
log.Println(" Server is enabled | Сервер включен")
log.Println(" Program completed | Программа завершена")
return
}
if *disable != "" {
cmd("systemctl stop MTProxy-" + *disable + ".service")
cmd("systemctl disable MTProxy-" + *disable + ".service")
log.Println(" Server is disabled | Сервер отключен")
log.Println(" Program completed | Программа завершена")
return
}
if *remove != "" {
cmd("systemctl stop MTProxy-" + *remove + ".service")
cmd("systemctl disable MTProxy-" + *remove + ".service")
cmd("rm /etc/systemd/system/MTProxy-" + *remove + ".service")
log.Println("Uninstall complete | Удаление завершено")
log.Println(" Program completed | Программа завершена")
return
}
if _, err := os.Stat(path); !os.IsNotExist(err) {
log.Println("A server with such a port is already created, to rewrite it?")
log.Println("Сервер с таким портом уже создан, перезаписать его?")
answer := ""
fmt.Print("\n\nY/N: ")
_, _ = fmt.Scan(&answer)
switch answer {
case "y", "Y":
cmd("systemctl stop MTProxy-" + *port + ".service")
cmd("systemctl disable MTProxy-" + *port + ".service")
cmd("rm " + path)
case "n", "N":
log.Println("Program completed | Программа завершена")
return
default:
log.Println("Invalid input | Некорректный ввод")
log.Println("Program completed | Программа завершена")
return
}
}
log.Println(" Dependency check | Проверка зависимостей")
if _, err := os.Stat("/etc/centos-release"); !os.IsNotExist(err) {
cmd("yum update")
cmd("yum -y install openssl-devel zlib-devel qrencode")
cmd("yum -y groupinstall \"Development Tools\"")
} else if _, err := os.Stat("/etc/fedora-release"); !os.IsNotExist(err) {
cmd("yum update")
cmd("yum -y install openssl-devel zlib-devel qrencode")
cmd("yum -y groupinstall \"Development Tools\"")
} else {
cmd("apt update")
cmd("apt -y install git make build-essential libssl-dev zlib1g-dev qrencode")
}
log.Println(" Installing | Установка")
cmd("git clone https://github.com/hookzof/MTProxy && cd MTProxy && make && cd objs/bin && " +
"curl -s https://core.telegram.org/getProxySecret -o proxy-secret && " +
"curl -s https://core.telegram.org/getProxyConfig -o proxy-multi.conf")
cmd("cd /opt && mkdir mtproxy")
cmd("cp MTProxy/objs/bin/mtproto-proxy /opt/mtproxy/mtproto-proxy")
cmd("cp MTProxy/objs/bin/proxy-multi.conf /opt/mtproxy/proxy-multi.conf")
cmd("cp MTProxy/objs/bin/proxy-secret /opt/mtproxy/proxy-secret")
cmd("rm -r MTProxy")
log.Println("Creating a service | Создание службы")
cmd("touch " + path)
options := ""
if *portStats != "" {
options += " -p " + *portStats
}
if *tag != "" {
options += " -P " + *tag
}
if *domain != "www.google.com" {
options += " -D " + *domain
} else {
options += " -D www.google.com"
}
v4 := getTrueIP("4")
if getIP()[:3] == "10." {
if v4 != "" {
options += " --nat-info " + getIP() + ":" + v4
} else {
log.Println("Couldn't get a real ipv4")
return
}
}
if *ipv6 {
options += " -6"
}
config := `[Unit]
Description=MTProxy
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/mtproxy
ExecStart=/opt/mtproxy/mtproto-proxy -u nobody -H ` + *port + " -S " + *secret + options + ` --aes-pwd proxy-secret proxy-multi.conf
Restart=on-failure
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target`
cmd("echo \"" + config + "\" >> " + path)
cmd("systemctl daemon-reload")
cmd("systemctl restart MTProxy-" + *port + ".service")
cmd("systemctl enable MTProxy-" + *port + ".service")
src := []byte(*domain)
dst := make([]byte, hex.EncodedLen(len(src)))
hex.Encode(dst, src)
log.Println(" Program completed | Программа завершена")
fmt.Println("\n\nServer file path | Путь файлов сервера — /opt/mtproxy/")
fmt.Println("Config file path | Путь конфиг файла — " + path)
if v4 != "" {
fmt.Println("\n\nIPv4:\ntg://proxy?server=" + v4 + "&port=" + *port + "&secret=ee" + *secret + string(dst) + "\n")
out, _ := exec.Command("sh", "-c", "qrencode -t ansiutf8 -l L \"tg://proxy?server="+v4+"&port="+*port+"&secret=ee"+*secret+string(dst)+"\"").Output()
fmt.Println(string(out))
} else {
fmt.Println("\n\nCouldn't get a real ipv4")
}
if *ipv6 {
v6 := getTrueIP("6")
if v6 != "" {
fmt.Println("IPv6:\ntg://proxy?server=" + v6 + "&port=" + *port + "&secret=ee" + *secret + string(dst) + "\n")
out, _ := exec.Command("sh", "-c", "qrencode -t ansiutf8 -l L \"tg://proxy?server="+v6+"&port="+*port+"&secret=ee"+*secret+string(dst)+"\"").Output()
fmt.Println(string(out))
} else {
fmt.Println("Couldn't get a real ipv6")
}
}
}