From 7beb5bf6d7ce7d2dc433e00684272d931fb76173 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Tue, 23 Nov 2021 21:44:32 +0800 Subject: [PATCH] add chain.Chainable interface --- cmd/gost/config.go | 11 ++++-- cmd/gost/gost.yml | 2 +- cmd/gost/out.yml | 45 ++++++++++------------- go.mod | 2 +- go.sum | 8 ----- pkg/chain/chain.go | 4 +++ pkg/handler/forward/local/handler.go | 6 +++- pkg/handler/http/handler.go | 6 +++- pkg/handler/option.go | 8 ----- pkg/handler/relay/handler.go | 6 +++- pkg/handler/socks/v4/handler.go | 6 +++- pkg/handler/socks/v5/handler.go | 6 +++- pkg/handler/ss/handler.go | 6 +++- pkg/handler/ss/udp/handler.go | 6 +++- pkg/listener/listener.go | 5 --- pkg/listener/rtcp/listener.go | 4 +-- pkg/listener/rudp/listener.go | 4 +-- pkg/logger/nop_logger.go | 53 ++++++++++++++++++++++++++++ 18 files changed, 125 insertions(+), 63 deletions(-) create mode 100644 pkg/logger/nop_logger.go diff --git a/cmd/gost/config.go b/cmd/gost/config.go index dc1cb0b..36f2e57 100644 --- a/cmd/gost/config.go +++ b/cmd/gost/config.go @@ -53,8 +53,8 @@ func buildService(cfg *config.Config) (services []*service.Service) { listener.LoggerOption(listenerLogger), ) - if chainable, ok := ln.(listener.Chainable); ok { - chainable.Chain(chains[svc.Chain]) + if chainable, ok := ln.(chain.Chainable); ok { + chainable.WithChain(chains[svc.Chain]) } if err := ln.Init(metadata.MapMetadata(svc.Listener.Metadata)); err != nil { @@ -67,11 +67,14 @@ func buildService(cfg *config.Config) (services []*service.Service) { }) h := registry.GetHandler(svc.Handler.Type)( - handler.ChainOption(chains[svc.Chain]), handler.BypassOption(bypasses[svc.Bypass]), handler.LoggerOption(handlerLogger), ) + if chainable, ok := h.(chain.Chainable); ok { + chainable.WithChain(chains[svc.Chain]) + } + if forwarder, ok := h.(handler.Forwarder); ok { forwarder.Forward(forwarderFromConfig(svc.Forwarder)) } @@ -162,6 +165,8 @@ func logFromConfig(cfg *config.LogConfig) logger.Logger { var out io.Writer = os.Stderr switch cfg.Output { + case "none": + return logger.Nop() case "stdout", "": out = os.Stdout case "stderr": diff --git a/cmd/gost/gost.yml b/cmd/gost/gost.yml index c93d21e..ff6451a 100644 --- a/cmd/gost/gost.yml +++ b/cmd/gost/gost.yml @@ -1,5 +1,5 @@ log: - output: stderr # stderr, stdout, /path/to/file + output: stderr # none, stderr, stdout, /path/to/file level: debug # debug, info, warn, error, fatal format: json # text, json diff --git a/cmd/gost/out.yml b/cmd/gost/out.yml index dc1e6df..bda9cb0 100644 --- a/cmd/gost/out.yml +++ b/cmd/gost/out.yml @@ -1,47 +1,40 @@ services: - name: service-0 - url: tcp://:8080/:8081?abc=def&true=true&n=123 - addr: :8080 + url: ss://abc:123@:18338/:18338 + addr: :18338 chain: chain-0 listener: type: tcp metadata: - abc: def - "n": "123" - "true": "true" + users: + - abc:123 handler: type: tcp metadata: - abc: def - "n": "123" - "true": "true" + users: + - abc:123 forwarder: targets: - - :8081 + - :18338 chains: - name: chain-0 hops: - name: hop-0 nodes: - name: node-0 - url: auto://:1081?n=123t - addr: :1081 + url: socks://abc:123@:11080?type=abc&key=value + addr: :11080 dialer: - type: auto + type: tcp metadata: - "n": 123t + key: value + type: abc + user: + - abc:123 connector: - type: auto + type: socks metadata: - "n": 123t - - name: hop-1 - nodes: - - name: node-0 - url: auto://:1082 - addr: :1082 - dialer: - type: auto - metadata: {} - connector: - type: auto - metadata: {} + key: value + type: abc + user: + - abc:123 diff --git a/go.mod b/go.mod index 546e320..b993fc2 100644 --- a/go.mod +++ b/go.mod @@ -23,6 +23,7 @@ require ( github.com/xtaci/tcpraw v1.2.25 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 + gopkg.in/yaml.v2 v2.4.0 ) require ( @@ -57,5 +58,4 @@ require ( golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/ini.v1 v1.63.2 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 7b7ae41..b011a3a 100644 --- a/go.sum +++ b/go.sum @@ -113,14 +113,6 @@ github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2 github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc= github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 h1:A95M6UWcfZgOuJkQ7QLfG0Hs5peWIUSysCDNz4pfe04= github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09/go.mod h1:1G6I7HP7VFVxveGkoK8mnprnJqSqJjdcASKsdUn4Pp4= -github.com/go-gost/relay v0.1.0 h1:UOf2YwAzzaUjY5mdpMuLfSw0vz62iIFYk7oJQkuhlGw= -github.com/go-gost/relay v0.1.0/go.mod h1:YFCpddLOFE3NlIkeDWRdEs8gL/GFsqXdtaf8SV5v4YQ= -github.com/go-gost/relay v0.1.1-0.20211028021513-03c783f893bc h1:F8wBeQYP8JvzIG/6rwRsC+R+D97lstozbsqwRknd4XU= -github.com/go-gost/relay v0.1.1-0.20211028021513-03c783f893bc/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8= -github.com/go-gost/relay v0.1.1-0.20211117133957-4b109438dc89 h1:1EtXLpAYeGVcptB0Jt8AeRe+GQnbTjbqeYA3L02pCIY= -github.com/go-gost/relay v0.1.1-0.20211117133957-4b109438dc89/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8= -github.com/go-gost/relay v0.1.1-0.20211122140942-99db08018413 h1:vF0HQWLlwu2GTZQgS9HJlOWUhnEZy8np/fCbWizI/08= -github.com/go-gost/relay v0.1.1-0.20211122140942-99db08018413/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8= github.com/go-gost/relay v0.1.1-0.20211122150329-54ee406ea49d h1:rzGVzkSvxuDZg8PoYmOR+tvcAg9Dr8whgV19kzuO4YA= github.com/go-gost/relay v0.1.1-0.20211122150329-54ee406ea49d/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= diff --git a/pkg/chain/chain.go b/pkg/chain/chain.go index ea48c2e..29efd3f 100644 --- a/pkg/chain/chain.go +++ b/pkg/chain/chain.go @@ -1,5 +1,9 @@ package chain +type Chainable interface { + WithChain(chain *Chain) +} + type Chain struct { groups []*NodeGroup } diff --git a/pkg/handler/forward/local/handler.go b/pkg/handler/forward/local/handler.go index 614095f..6278c76 100644 --- a/pkg/handler/forward/local/handler.go +++ b/pkg/handler/forward/local/handler.go @@ -33,7 +33,6 @@ func NewHandler(opts ...handler.Option) handler.Handler { } return &forwardHandler{ - chain: options.Chain, bypass: options.Bypass, logger: options.Logger, } @@ -43,6 +42,11 @@ func (h *forwardHandler) Init(md md.Metadata) (err error) { return h.parseMetadata(md) } +// implements chain.Chainable interface +func (h *forwardHandler) WithChain(chain *chain.Chain) { + h.chain = chain +} + // Forward implements handler.Forwarder. func (h *forwardHandler) Forward(group *chain.NodeGroup) { h.group = group diff --git a/pkg/handler/http/handler.go b/pkg/handler/http/handler.go index 057d72e..f3f4c20 100644 --- a/pkg/handler/http/handler.go +++ b/pkg/handler/http/handler.go @@ -41,7 +41,6 @@ func NewHandler(opts ...handler.Option) handler.Handler { } return &httpHandler{ - chain: options.Chain, bypass: options.Bypass, logger: options.Logger, } @@ -51,6 +50,11 @@ func (h *httpHandler) Init(md md.Metadata) error { return h.parseMetadata(md) } +// implements chain.Chainable interface +func (h *httpHandler) WithChain(chain *chain.Chain) { + h.chain = chain +} + func (h *httpHandler) Handle(ctx context.Context, conn net.Conn) { defer conn.Close() diff --git a/pkg/handler/option.go b/pkg/handler/option.go index 5333767..b65443b 100644 --- a/pkg/handler/option.go +++ b/pkg/handler/option.go @@ -2,12 +2,10 @@ package handler import ( "github.com/go-gost/gost/pkg/bypass" - "github.com/go-gost/gost/pkg/chain" "github.com/go-gost/gost/pkg/logger" ) type Options struct { - Chain *chain.Chain Bypass bypass.Bypass Logger logger.Logger } @@ -20,12 +18,6 @@ func LoggerOption(logger logger.Logger) Option { } } -func ChainOption(chain *chain.Chain) Option { - return func(opts *Options) { - opts.Chain = chain - } -} - func BypassOption(bypass bypass.Bypass) Option { return func(opts *Options) { opts.Bypass = bypass diff --git a/pkg/handler/relay/handler.go b/pkg/handler/relay/handler.go index ac6e30f..b116c96 100644 --- a/pkg/handler/relay/handler.go +++ b/pkg/handler/relay/handler.go @@ -34,7 +34,6 @@ func NewHandler(opts ...handler.Option) handler.Handler { } return &relayHandler{ - chain: options.Chain, bypass: options.Bypass, logger: options.Logger, } @@ -44,6 +43,11 @@ func (h *relayHandler) Init(md md.Metadata) (err error) { return h.parseMetadata(md) } +// implements chain.Chainable interface +func (h *relayHandler) WithChain(chain *chain.Chain) { + h.chain = chain +} + // Forward implements handler.Forwarder. func (h *relayHandler) Forward(group *chain.NodeGroup) { h.group = group diff --git a/pkg/handler/socks/v4/handler.go b/pkg/handler/socks/v4/handler.go index f6f71c2..53eca12 100644 --- a/pkg/handler/socks/v4/handler.go +++ b/pkg/handler/socks/v4/handler.go @@ -33,7 +33,6 @@ func NewHandler(opts ...handler.Option) handler.Handler { } return &socks4Handler{ - chain: options.Chain, bypass: options.Bypass, logger: options.Logger, } @@ -43,6 +42,11 @@ func (h *socks4Handler) Init(md md.Metadata) (err error) { return h.parseMetadata(md) } +// implements chain.Chainable interface +func (h *socks4Handler) WithChain(chain *chain.Chain) { + h.chain = chain +} + func (h *socks4Handler) Handle(ctx context.Context, conn net.Conn) { defer conn.Close() diff --git a/pkg/handler/socks/v5/handler.go b/pkg/handler/socks/v5/handler.go index 624d103..ffedf32 100644 --- a/pkg/handler/socks/v5/handler.go +++ b/pkg/handler/socks/v5/handler.go @@ -35,7 +35,6 @@ func NewHandler(opts ...handler.Option) handler.Handler { } return &socks5Handler{ - chain: options.Chain, bypass: options.Bypass, logger: options.Logger, } @@ -56,6 +55,11 @@ func (h *socks5Handler) Init(md md.Metadata) (err error) { return } +// implements chain.Chainable interface +func (h *socks5Handler) WithChain(chain *chain.Chain) { + h.chain = chain +} + func (h *socks5Handler) Handle(ctx context.Context, conn net.Conn) { defer conn.Close() diff --git a/pkg/handler/ss/handler.go b/pkg/handler/ss/handler.go index f7e92c6..44ae2f2 100644 --- a/pkg/handler/ss/handler.go +++ b/pkg/handler/ss/handler.go @@ -35,7 +35,6 @@ func NewHandler(opts ...handler.Option) handler.Handler { } return &ssHandler{ - chain: options.Chain, bypass: options.Bypass, logger: options.Logger, } @@ -45,6 +44,11 @@ func (h *ssHandler) Init(md md.Metadata) (err error) { return h.parseMetadata(md) } +// implements chain.Chainable interface +func (h *ssHandler) WithChain(chain *chain.Chain) { + h.chain = chain +} + func (h *ssHandler) Handle(ctx context.Context, conn net.Conn) { defer conn.Close() diff --git a/pkg/handler/ss/udp/handler.go b/pkg/handler/ss/udp/handler.go index 0ed846a..7486b7f 100644 --- a/pkg/handler/ss/udp/handler.go +++ b/pkg/handler/ss/udp/handler.go @@ -34,7 +34,6 @@ func NewHandler(opts ...handler.Option) handler.Handler { } return &ssuHandler{ - chain: options.Chain, bypass: options.Bypass, logger: options.Logger, } @@ -44,6 +43,11 @@ func (h *ssuHandler) Init(md md.Metadata) (err error) { return h.parseMetadata(md) } +// implements chain.Chainable interface +func (h *ssuHandler) WithChain(chain *chain.Chain) { + h.chain = chain +} + func (h *ssuHandler) Handle(ctx context.Context, conn net.Conn) { defer conn.Close() diff --git a/pkg/listener/listener.go b/pkg/listener/listener.go index 297d52a..078cd5f 100644 --- a/pkg/listener/listener.go +++ b/pkg/listener/listener.go @@ -4,7 +4,6 @@ import ( "errors" "net" - "github.com/go-gost/gost/pkg/chain" "github.com/go-gost/gost/pkg/metadata" ) @@ -22,7 +21,3 @@ type Listener interface { type Accepter interface { Accept() (net.Conn, error) } - -type Chainable interface { - Chain(chain *chain.Chain) -} diff --git a/pkg/listener/rtcp/listener.go b/pkg/listener/rtcp/listener.go index 68e87ba..36681a0 100644 --- a/pkg/listener/rtcp/listener.go +++ b/pkg/listener/rtcp/listener.go @@ -38,8 +38,8 @@ func NewListener(opts ...listener.Option) listener.Listener { } } -// implements listener.Chainable interface -func (l *rtcpListener) Chain(chain *chain.Chain) { +// implements chain.Chainable interface +func (l *rtcpListener) WithChain(chain *chain.Chain) { l.chain = chain } diff --git a/pkg/listener/rudp/listener.go b/pkg/listener/rudp/listener.go index 931eb93..4377b93 100644 --- a/pkg/listener/rudp/listener.go +++ b/pkg/listener/rudp/listener.go @@ -38,8 +38,8 @@ func NewListener(opts ...listener.Option) listener.Listener { } } -// implements listener.Chainable interface -func (l *rudpListener) Chain(chain *chain.Chain) { +// implements chain.Chainable interface +func (l *rudpListener) WithChain(chain *chain.Chain) { l.chain = chain } diff --git a/pkg/logger/nop_logger.go b/pkg/logger/nop_logger.go new file mode 100644 index 0000000..60e86ac --- /dev/null +++ b/pkg/logger/nop_logger.go @@ -0,0 +1,53 @@ +package logger + +var ( + nop = &nopLogger{} +) + +func Nop() Logger { + return nop +} + +type nopLogger struct{} + +func (l *nopLogger) WithFields(fields map[string]interface{}) Logger { + return l +} + +func (l *nopLogger) Debug(args ...interface{}) { +} + +func (l *nopLogger) Debugf(format string, args ...interface{}) { +} + +func (l *nopLogger) Info(args ...interface{}) { +} + +func (l *nopLogger) Infof(format string, args ...interface{}) { +} + +func (l *nopLogger) Warn(args ...interface{}) { +} + +func (l *nopLogger) Warnf(format string, args ...interface{}) { +} + +func (l *nopLogger) Error(args ...interface{}) { +} + +func (l *nopLogger) Errorf(format string, args ...interface{}) { +} + +func (l *nopLogger) Fatal(args ...interface{}) { +} + +func (l *nopLogger) Fatalf(format string, args ...interface{}) { +} + +func (l *nopLogger) GetLevel() LogLevel { + return "" +} + +func (l *nopLogger) IsLevelEnabled(level LogLevel) bool { + return false +}