From 72a27823954447541915656940cf8900755b1ba7 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Sat, 26 Sep 2020 23:34:26 +0800 Subject: [PATCH] config: better naming and some minor optimizations --- .gitignore | 2 +- README.md | 2 +- common/log/log.go | 21 +++++++++++-------- conf.go => config.go | 14 ++++++++++--- go.mod | 9 ++++---- go.sum | 22 +++++++++----------- ipset/ipset_linux.go | 4 ++-- main.go | 49 ++++++++++++++++++-------------------------- rule/config.go | 2 -- 9 files changed, 63 insertions(+), 62 deletions(-) rename conf.go => config.go (98%) diff --git a/.gitignore b/.gitignore index e0f3776..8d24ad3 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ .vscode # dev test only -*/dev/* +/dev/ dev*.go diff --git a/README.md b/README.md index d44c925..e34e3df 100644 --- a/README.md +++ b/README.md @@ -363,7 +363,7 @@ glider -config CONFIGPATH -listen :8080 -verbose ## Links -- [ipset](https://github.com/nadoo/ipset): ipset package for Go via netlink socket. +- [ipset](https://github.com/nadoo/ipset): netlink ipset package for Go. - [conflag](https://github.com/nadoo/conflag): a drop-in replacement for Go's standard flag package with config file support. - [ArchLinux](https://www.archlinux.org/packages/community/x86_64/glider): a great linux distribution with glider pre-built package. - [urlencode](https://www.w3schools.com/tags/ref_urlencode.asp): you should encode special characters in scheme url. e.g: `@`->`%40` diff --git a/common/log/log.go b/common/log/log.go index ff34eb9..b8b62c8 100644 --- a/common/log/log.go +++ b/common/log/log.go @@ -1,25 +1,30 @@ package log import ( + "fmt" stdlog "log" ) -func init() { +// F is the main log function. +var F = func(string, ...interface{}) {} + +// Debugf prints debug log. +func Debugf(format string, v ...interface{}) { stdlog.SetFlags(stdlog.LstdFlags | stdlog.Lshortfile) + stdlog.Output(2, fmt.Sprintf(format, v...)) } -// Func defines a simple log function -type Func func(f string, v ...interface{}) +// Printf prints log. +func Printf(format string, v ...interface{}) { + stdlog.Printf(format, v...) +} -// F is the main log function -var F Func = func(string, ...interface{}) {} - -// Fatal log and exit +// Fatal log and exit. func Fatal(v ...interface{}) { stdlog.Fatal(v...) } -// Fatalf log and exit +// Fatalf log and exit. func Fatalf(f string, v ...interface{}) { stdlog.Fatalf(f, v...) } diff --git a/conf.go b/config.go similarity index 98% rename from conf.go rename to config.go index 19c5850..4ce995f 100644 --- a/conf.go +++ b/config.go @@ -2,19 +2,19 @@ package main import ( "fmt" - "log" "os" "path" "github.com/nadoo/conflag" + "github.com/nadoo/glider/common/log" "github.com/nadoo/glider/dns" "github.com/nadoo/glider/rule" ) var flag = conflag.New() -var conf struct { +type Config struct { Verbose bool Listen []string @@ -31,7 +31,9 @@ var conf struct { rules []*rule.Config } -func confInit() { +func parseConfig() *Config { + conf := &Config{} + flag.SetOutput(os.Stdout) flag.BoolVar(&conf.Verbose, "verbose", false, "verbose mode") @@ -67,6 +69,11 @@ func confInit() { os.Exit(-1) } + // setup a log func + if conf.Verbose { + log.F = log.Debugf + } + if len(conf.Listen) == 0 && conf.DNS == "" { // flag.Usage() fmt.Fprintf(os.Stderr, "ERROR: listen url must be specified.\n") @@ -102,6 +109,7 @@ func confInit() { } } + return conf } func usage() { diff --git a/go.mod b/go.mod index 78e3d35..a4f58ec 100644 --- a/go.mod +++ b/go.mod @@ -3,16 +3,17 @@ module github.com/nadoo/glider go 1.15 require ( + github.com/krolaw/dhcp4 v0.0.0-20190909130307-a50d88189771 github.com/mzz2017/shadowsocksR v1.0.0 github.com/nadoo/conflag v0.2.3 github.com/nadoo/go-shadowsocks2 v0.1.2 - github.com/nadoo/ipset v0.2.0 + github.com/nadoo/ipset v0.3.0 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/xtaci/kcp-go/v5 v5.5.15 golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a - golang.org/x/net v0.0.0-20200923182212-328152dc79b1 // indirect - golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d // indirect - golang.org/x/tools v0.0.0-20200924224222-8d73f17870ce // indirect + golang.org/x/net v0.0.0-20200925080053-05aa5d4ee321 // indirect + golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c // indirect + golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346 // indirect gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect ) diff --git a/go.sum b/go.sum index f7e0058..01bea45 100644 --- a/go.sum +++ b/go.sum @@ -25,6 +25,8 @@ github.com/klauspost/reedsolomon v1.9.9/go.mod h1:O7yFFHiQwDR6b2t63KPUpccPtNdp5A github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/krolaw/dhcp4 v0.0.0-20190909130307-a50d88189771 h1:t2c2B9g1ZVhMYduqmANSEGVD3/1WlsrEYNPtVoFlENk= +github.com/krolaw/dhcp4 v0.0.0-20190909130307-a50d88189771/go.mod h1:0AqAH3ZogsCrvrtUpvc6EtVKbc3w6xwZhkvGLuqyi3o= github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104 h1:ULR/QWMgcgRiZLUjSSJMU+fW+RDMstRdmnDWj9Q+AsA= github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104/go.mod h1:wqKykBG2QzQDJEzvRkcS8x6MiSJkF52hXZsXcjaB3ls= github.com/mzz2017/shadowsocksR v0.0.0-20200126130347-721f53a7b15a/go.mod h1:1SJEvxD2Y+N7SK2NpCC4wSatvfGGTUo2rhPdthUFsCU= @@ -38,10 +40,8 @@ github.com/nadoo/glider v0.9.2/go.mod h1:S/94KRJFNtgoNlyEm4+33f/DrEsj/uxvismOW4F github.com/nadoo/glider v0.10.0/go.mod h1:q5d4Q5yoGk3nLAhshDJalnl0NXJ8Xh4ODEgp+qbdAAg= github.com/nadoo/go-shadowsocks2 v0.1.2 h1:+tCSt65YAAMf24wj3tqv6a9oVBcqSGFYVsifBZwT9w8= github.com/nadoo/go-shadowsocks2 v0.1.2/go.mod h1:/E2kSkS0mqF/e79wcAA0PezoWXk4CY9HldJlzwWtbwU= -github.com/nadoo/ipset v0.1.0 h1:z/rWPoIle8g9PjD/vlsL3h4c++zMRw+Qcq2wjxMZSkU= -github.com/nadoo/ipset v0.1.0/go.mod h1:ugJe3mH5N1UNQbXayGJnLEMALeiwCJYo49Wg4MnZTHU= -github.com/nadoo/ipset v0.2.0 h1:J5dXbW3ntSou3f5vkpnfk6S05u0KvLhzJwGHEiWEtl4= -github.com/nadoo/ipset v0.2.0/go.mod h1:ugJe3mH5N1UNQbXayGJnLEMALeiwCJYo49Wg4MnZTHU= +github.com/nadoo/ipset v0.3.0 h1:TgULgp4s2PI3ItoCykDzMp8R49fRhMUNoUUEahERr5o= +github.com/nadoo/ipset v0.3.0/go.mod h1:ugJe3mH5N1UNQbXayGJnLEMALeiwCJYo49Wg4MnZTHU= github.com/nadoo/shadowsocksR v0.1.0 h1:sYPxZi0l8F1nxDDcckzb0DHXxhe0LNW5iSeohqPw6Fg= github.com/nadoo/shadowsocksR v0.1.0/go.mod h1:nqcLRU7laARXdLLBrHP8odruT/6GIureicuRTs4R+RY= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= @@ -108,8 +108,8 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgN golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200923182212-328152dc79b1 h1:Iu68XRPd67wN4aRGGWwwq6bZo/25jR6uu52l/j2KkUE= -golang.org/x/net v0.0.0-20200923182212-328152dc79b1/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200925080053-05aa5d4ee321 h1:lleNcKRbcaC8MqgLwghIkzZ2JBQAb7QQ9MiwRt1BisA= +golang.org/x/net v0.0.0-20200925080053-05aa5d4ee321/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -124,15 +124,15 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 h1:yi1hN8dcqI9l8klZfy4B8mJvFmmAxJEePIQQFNSd7Cs= golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d h1:L/IKR6COd7ubZrs2oTnTi73IhgqJ71c9s80WsQnh0Es= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c h1:38q6VNPWR010vN82/SB121GujZNIfAUb4YttE2rhGuc= +golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200425043458-8463f397d07c h1:iHhCR0b26amDCiiO+kBguKZom9aMF+NrFxh9zeKR/XU= golang.org/x/tools v0.0.0-20200425043458-8463f397d07c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200808161706-5bf02b21f123/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200924224222-8d73f17870ce h1:XRr763sMfaUSNR4EsxbddvVEqYFa9picrx6ks9pJkKw= -golang.org/x/tools v0.0.0-20200924224222-8d73f17870ce/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346 h1:hzJjkvxUIF3bSt+v8N5tBQNx/605vszZJ+3XsIamzZo= +golang.org/x/tools v0.0.0-20200925191224-5d1fdd8fa346/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= @@ -141,8 +141,6 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1N golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= diff --git a/ipset/ipset_linux.go b/ipset/ipset_linux.go index 99937d9..04693fd 100644 --- a/ipset/ipset_linux.go +++ b/ipset/ipset_linux.go @@ -5,9 +5,9 @@ import ( "strings" "sync" - ipsetlib "github.com/nadoo/ipset" - "github.com/nadoo/glider/rule" + + ipsetlib "github.com/nadoo/ipset" ) // Manager struct. diff --git a/main.go b/main.go index c3cca2c..30ab3f8 100644 --- a/main.go +++ b/main.go @@ -2,8 +2,6 @@ package main import ( "context" - "fmt" - stdlog "log" "net" "os" "os/signal" @@ -36,34 +34,27 @@ import ( _ "github.com/nadoo/glider/proxy/ws" ) -var version = "0.11.0" +var ( + version = "0.11.0" + config = parseConfig() +) func main() { - // read configs - confInit() - - // setup a log func - if conf.Verbose { - log.F = func(f string, v ...interface{}) { - stdlog.Output(2, fmt.Sprintf(f, v...)) - } - } - // global rule proxy - pxy := rule.NewProxy(conf.Forward, &conf.StrategyConfig, conf.rules) + pxy := rule.NewProxy(config.Forward, &config.StrategyConfig, config.rules) // ipset manager - ipsetM, _ := ipset.NewManager(conf.rules) + ipsetM, _ := ipset.NewManager(config.rules) // check and setup dns server - if conf.DNS != "" { - d, err := dns.NewServer(conf.DNS, pxy, &conf.DNSConfig) + if config.DNS != "" { + d, err := dns.NewServer(config.DNS, pxy, &config.DNSConfig) if err != nil { log.Fatal(err) } - // rule - for _, r := range conf.rules { + // rules + for _, r := range config.rules { for _, domain := range r.Domain { if len(r.DNSServers) > 0 { d.SetServers(domain, r.DNSServers) @@ -71,15 +62,6 @@ func main() { } } - // custom resolver - net.DefaultResolver = &net.Resolver{ - PreferGo: true, - Dial: func(ctx context.Context, network, address string) (net.Conn, error) { - d := net.Dialer{Timeout: time.Second * 3} - return d.DialContext(ctx, "udp", conf.DNS) - }, - } - // add a handler to update proxy rules when a domain resolved d.AddHandler(pxy.AddDomainIP) if ipsetM != nil { @@ -87,13 +69,22 @@ func main() { } d.Start() + + // custom resolver + net.DefaultResolver = &net.Resolver{ + PreferGo: true, + Dial: func(ctx context.Context, network, address string) (net.Conn, error) { + d := net.Dialer{Timeout: time.Second * 3} + return d.DialContext(ctx, "udp", config.DNS) + }, + } } // enable checkers pxy.Check() // Proxy Servers - for _, listen := range conf.Listen { + for _, listen := range config.Listen { local, err := proxy.ServerFromURL(listen, pxy) if err != nil { log.Fatal(err) diff --git a/rule/config.go b/rule/config.go index 57e2413..a12084c 100644 --- a/rule/config.go +++ b/rule/config.go @@ -1,7 +1,6 @@ package rule import ( - "fmt" "io/ioutil" "os" "strings" @@ -62,7 +61,6 @@ func NewConfFromFile(ruleFile string) (*Config, error) { err := f.Parse() if err != nil { - fmt.Fprintf(os.Stderr, "ERROR: %s\n", err) return nil, err }