diff --git a/Makefile b/Makefile index c427fef..7f267a9 100644 --- a/Makefile +++ b/Makefile @@ -9,11 +9,11 @@ kill: sudo pkill -9 sower || true client: build kill - sudo $(PWD)/sower -f conf/sower.toml + sudo $(PWD)/sower -f conf/sower.toml -logtostderr server: build kill - $(PWD)/sower -D true + $(PWD)/sower -logtostderr -v 1 run: build kill - $(PWD)/sower -D true & - sudo $(PWD)/sower -f conf/sower.toml + $(PWD)/sower -logtostderr -v 1 & + sudo $(PWD)/sower -f conf/sower.toml -logtostderr diff --git a/conf/conf.go b/conf/conf.go index ba25054..d15119d 100644 --- a/conf/conf.go +++ b/conf/conf.go @@ -2,6 +2,7 @@ package conf import ( "flag" + "strconv" "github.com/BurntSushi/toml" ) @@ -12,15 +13,14 @@ var Conf = struct { ServerAddr string `toml:"server_addr"` DnsServer string `toml:"dns_server"` BlockList []string `toml:"blocklist"` - Debug bool `toml:"debug"` + Verbose int `toml:"verbose"` }{} func init() { flag.StringVar(&Conf.ConfigFile, "f", "", "config file location") flag.StringVar(&Conf.ServerPort, "P", "5533", "server mode listen port") - flag.StringVar(&Conf.ServerAddr, "s", "", "server addr (run in client mode if set)") + flag.StringVar(&Conf.ServerAddr, "s", "", "server IP (run in client mode if set)") flag.StringVar(&Conf.DnsServer, "d", "114.114.114.114", "client dns server") - flag.BoolVar(&Conf.Debug, "D", false, "run in debug mode") if !flag.Parsed() { flag.Parse() @@ -32,4 +32,9 @@ func init() { if _, err := toml.DecodeFile(Conf.ConfigFile, &Conf); err != nil { panic(err) } + + // for glog + if err := flag.Set("v", strconv.Itoa(Conf.Verbose)); err != nil { + panic(err) + } } diff --git a/conf/sower.toml b/conf/sower.toml index a64b788..063fbca 100644 --- a/conf/sower.toml +++ b/conf/sower.toml @@ -6,4 +6,4 @@ blocklist=[ "*.youtube.com", "zh.wikipedia.org", ] -debug=true \ No newline at end of file +verbose=1 \ No newline at end of file diff --git a/dns/dns.go b/dns/dns.go index 8abd38a..6da5ec2 100644 --- a/dns/dns.go +++ b/dns/dns.go @@ -1,13 +1,12 @@ package dns import ( - "log" "net" "strings" "time" + "github.com/golang/glog" "github.com/miekg/dns" - "github.com/wweir/sower/conf" ) func StartDNS(dnsServer string, blocklist []string) { @@ -35,7 +34,7 @@ func StartDNS(dnsServer string, blocklist []string) { server := &dns.Server{Addr: ":53", Net: "udp"} server.TsigSecret = map[string]string{"axfr.": "so6ZGir4GPAqINNh9U5c3A=="} - log.Fatalln(server.ListenAndServe()) + glog.Fatalln(server.ListenAndServe()) } // TODO: delete me @@ -59,7 +58,7 @@ func bestTry(w dns.ResponseWriter, r *dns.Msg, name, dnsServer string) { } if _, err := net.DialTimeout("tcp", ip+":http", time.Second); err != nil { - log.Println(ip+":80", err) + glog.V(2).Infoln(ip+":80", err) rr, _ := dns.NewRR(name + " A 127.0.0.1") r.Answer = []dns.RR{rr} w.WriteMsg(r) @@ -76,26 +75,19 @@ func initRule(blocklist []string) { for i := range blocklist { rule.Add(strings.Split(blocklist[i], ".")) } - - if conf.Conf.Debug { - log.Printf("block rule:\n%s", rule) - } + glog.V(1).Infof("block rule:\n%s", rule) } func manual(w dns.ResponseWriter, r *dns.Msg, name, dnsServer string) { if rule.Match(strings.TrimSuffix(name, ".")) { - if conf.Conf.Debug { - log.Printf("match %s suss", name) - } + glog.V(2).Infof("match %s suss", name) rr, _ := dns.NewRR(name + " A 127.0.0.1") r.Answer = []dns.RR{rr} w.WriteMsg(r) return } - if conf.Conf.Debug { - log.Printf("match %s fail", name) - } + glog.V(2).Infof("match %s fail", name) msg, err := dns.Exchange(r, dnsServer+":53") if err != nil || len(msg.Answer) == 0 { diff --git a/go.mod b/go.mod index 886cdee..fe0ee99 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ require ( github.com/BurntSushi/toml v0.3.1 github.com/bifurcation/mint v0.0.0-20181105071958-a14404e9a861 // indirect github.com/cheekybits/genny v1.0.0 // indirect + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/golang/mock v1.1.1 // indirect github.com/hashicorp/golang-lru v0.5.0 // indirect github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f // indirect diff --git a/go.sum b/go.sum index 43bb322..3a7133f 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitf github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= diff --git a/main.go b/main.go index 5f898f5..86fefde 100644 --- a/main.go +++ b/main.go @@ -1,23 +1,19 @@ package main import ( - "log" - + "github.com/golang/glog" "github.com/wweir/sower/conf" "github.com/wweir/sower/dns" "github.com/wweir/sower/proxy" ) -func init() { - log.SetFlags(log.LstdFlags | log.Lshortfile) -} func main() { - log.Println(conf.Conf) + glog.Infoln("Starting:", conf.Conf) if conf.Conf.ServerAddr == "" { proxy.StartServer(conf.Conf.ServerPort) } else { - dns.StartDNS(conf.Conf.DnsServer, conf.Conf.BlockList) + go dns.StartDNS(conf.Conf.DnsServer, conf.Conf.BlockList) proxy.StartClient(conf.Conf.ServerAddr) } } diff --git a/proxy/client.go b/proxy/client.go index 62876a4..1c31631 100644 --- a/proxy/client.go +++ b/proxy/client.go @@ -1,9 +1,9 @@ package proxy import ( - "log" "net" + "github.com/golang/glog" "github.com/lucas-clemente/quic-go" ) @@ -11,18 +11,18 @@ func StartClient(server string) { connCh := listenLocal([]string{":80", ":443"}) sess, err := quic.DialAddr(server, nil, nil) if err != nil { - log.Printf("connect to remote(%s) fail:%s\n", server, err) - return + glog.Fatalf("connect to remote(%s) fail:%s\n", server, err) } for { go func(conn net.Conn) { + glog.V(1).Infoln("new request to", conn.RemoteAddr()) defer conn.Close() conn.(*net.TCPConn).SetKeepAlive(true) stream, err := sess.OpenStream() if err != nil { - log.Printf("connect to remote(%s) fail:%s\n", server, err) + glog.Warningf("connect to remote(%s) fail:%s\n", server, err) return } defer stream.Close() @@ -38,13 +38,13 @@ func listenLocal(ports []string) <-chan net.Conn { go func(port string) { ln, err := net.Listen("tcp", port) if err != nil { - log.Fatalln(err) + glog.Fatalln(err) } for { conn, err := ln.Accept() if err != nil { - log.Println("accept", port, "fail:", err) + glog.Errorln("accept", port, "fail:", err) } connCh <- conn @@ -52,5 +52,6 @@ func listenLocal(ports []string) <-chan net.Conn { }(ports[i]) } + glog.Infoln("listening ports:", ports) return connCh } diff --git a/proxy/server.go b/proxy/server.go index cc040b9..340dddf 100644 --- a/proxy/server.go +++ b/proxy/server.go @@ -1,9 +1,9 @@ package proxy import ( - "log" "net" + "github.com/golang/glog" "github.com/lucas-clemente/quic-go" "github.com/wweir/sower/parser" ) @@ -11,13 +11,13 @@ import ( func StartServer(port string) { ln, err := quic.ListenAddr(":"+port, nil, nil) if err != nil { - log.Fatalln(err) + glog.Fatalln(err) } for { sess, err := ln.Accept() if err != nil { - log.Println(err) + glog.Errorln(err) } go acceptSession(sess) } @@ -27,7 +27,7 @@ func acceptSession(sess quic.Session) { for { stream, err := sess.AcceptStream() if err != nil { - log.Println(err) + glog.Errorln(err) } go acceptStream(stream, sess) } @@ -38,14 +38,14 @@ func acceptStream(stream quic.Stream, sess quic.Session) { conn, addr, err := parser.ParseAddr(&streamConn{stream, sess}) if err != nil { - log.Panicln(err) + glog.Warningln(err) return } - log.Println(addr) + glog.V(1).Infoln(addr) rc, err := net.Dial("tcp", addr) if err != nil { - log.Println(err) + glog.Warningln(err) return } defer rc.Close() diff --git a/proxy/util.go b/proxy/util.go index 53b42f3..7d58220 100644 --- a/proxy/util.go +++ b/proxy/util.go @@ -2,12 +2,12 @@ package proxy import ( "io" - "log" "net" "sync" "sync/atomic" "time" + "github.com/golang/glog" "github.com/lucas-clemente/quic-go" ) @@ -35,7 +35,7 @@ func relay(conn1, conn2 net.Conn) { func redirect(conn1, conn2 net.Conn, wg *sync.WaitGroup, exitFlag *int32) { if _, err := io.Copy(conn2, conn1); err != nil && (atomic.LoadInt32(exitFlag) == 0) { - log.Printf("%s<>%s -> %s<>%s: %s", conn1.RemoteAddr(), conn1.LocalAddr(), conn2.LocalAddr(), conn2.RemoteAddr(), err) + glog.V(1).Infof("%s<>%s -> %s<>%s: %s", conn1.RemoteAddr(), conn1.LocalAddr(), conn2.LocalAddr(), conn2.RemoteAddr(), err) } // wakeup all conn goroutine