/
run.go
74 lines (62 loc) · 1.7 KB
/
run.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
package opennotrd
import (
"flag"
"fmt"
"github.com/ICKelin/opennotr/opennotrd/core"
"github.com/ICKelin/opennotr/opennotrd/plugin"
"github.com/ICKelin/opennotr/pkg/logs"
)
func Run() {
confpath := flag.String("conf", "", "config file path")
flag.Parse()
cfg, err := core.ParseConfig(*confpath)
if err != nil {
fmt.Println(err)
return
}
logs.Init("opennotrd.log", "debug", 10)
logs.Info("config: %v", cfg)
// create dhcp manager
// dhcp Select/Release ip for opennotr client
dhcp, err := core.NewDHCP(cfg.DHCPConfig.Cidr)
if err != nil {
logs.Error("new dhcp module fail: %v", err)
return
}
// setup all plugin base on plugin json configuration
err = plugin.Setup(cfg.Plugins)
if err != nil {
logs.Error("setup plugin fail: %v", err)
return
}
// initial resolver
// currently resolver use coredns and etcd
// our resolver just write DOMAIN => VIP record to etcd
var resolver *core.Resolver
if len(cfg.ResolverConfig.EtcdEndpoints) > 0 {
resolver, err = core.NewResolve(cfg.ResolverConfig.EtcdEndpoints)
if err != nil {
logs.Error("new resolve fail: %v", err)
return
}
}
// up local tcp,udp service
// we use tproxy to route traffic to the tcp port and udp port here.
tcpfw := core.NewTCPForward(cfg.TCPForwardConfig)
listener, err := tcpfw.Listen()
if err != nil {
logs.Error("listen tproxy tcp fail: %v", err)
return
}
go tcpfw.Serve(listener)
udpfw := core.NewUDPForward(cfg.UDPForwardConfig)
lconn, err := udpfw.Listen()
if err != nil {
logs.Error("listen tproxy udp fail: %v", err)
return
}
go udpfw.Serve(lconn)
// server provides tcp server for opennotr client
s := core.NewServer(cfg.ServerConfig, dhcp, resolver)
fmt.Println(s.ListenAndServe())
}