/
main.go
99 lines (81 loc) · 1.82 KB
/
main.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
package gtund
import (
"flag"
"fmt"
"io/ioutil"
"net/http"
"strconv"
"strings"
"github.com/ICKelin/gtun/logs"
)
var version = ""
func Main() {
flgVersion := flag.Bool("v", false, "print version")
flgConf := flag.String("c", "", "config file")
flag.Parse()
if *flgVersion {
fmt.Println(version)
return
}
conf, err := ParseConfig(*flgConf)
if err != nil {
logs.Error("parse config file fail: %s %v", *flgConf, err)
return
}
dhcp, err := NewDHCP(conf.DHCPConfig)
if err != nil {
logs.Error("init dhcp fail: %v", err)
return
}
iface, err := NewInterface(conf.InterfaceConfig, conf.DHCPConfig.Gateway, conf.DHCPConfig.CIDR)
if err != nil {
logs.Error("init interface fail: %v", err)
return
}
var registry *Registry
if conf.RegistryConfig != nil {
sp := strings.Split(conf.ServerConfig.Listen, ":")
if len(sp) != 2 {
logs.Error("invalid listen address")
return
}
port, _ := strconv.Atoi(sp[1])
registry = NewRegistry(conf.RegistryConfig, &Service{
Name: conf.Name,
PublicIP: GetPublicIP(),
Port: port,
CIDR: conf.DHCPConfig.CIDR,
ClientLimit: conf.DHCPConfig.ClientCount,
IsTap: conf.InterfaceConfig.IsTap,
})
go registry.Run()
}
if conf.ReverseConfig != nil {
r := NewReverse(conf.ReverseConfig)
err := r.Run()
if err != nil {
logs.Warn("run reverse fail: %v", err)
}
}
server, err := NewServer(conf.ServerConfig, dhcp, iface, registry)
if err != nil {
logs.Error("new server: %v", err)
return
}
server.Run()
server.Close()
}
func GetPublicIP() string {
resp, err := http.Get("http://ipv4.icanhazip.com")
if err != nil {
return ""
}
defer resp.Body.Close()
content, err := ioutil.ReadAll(resp.Body)
if err != nil {
return ""
}
str := string(content)
idx := strings.LastIndex(str, "\n")
return str[:idx]
}