From c59447c646e4edc734b8525fb2b44739260ca794 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Sun, 16 Aug 2020 23:06:35 +0000 Subject: [PATCH 1/5] Bump versions and binary build changes - Go version 1.15 - Golangci-lint 1.30 - Trim path of binary built --- .golangci.yml | 3 --- Dockerfile | 8 +++----- go.mod | 6 +++--- go.sum | 8 ++++++-- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index a03100186..5a5ec9701 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -45,6 +45,3 @@ run: - .devcontainer - .github - postgres - -service: - golangci-lint-version: 1.27.x # use the fixed version to not introduce new linters unexpectedly diff --git a/Dockerfile b/Dockerfile index 9e2aeb73f..599cce2fb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,10 @@ ARG ALPINE_VERSION=3.12 -ARG GO_VERSION=1.14 +ARG GO_VERSION=1.15 FROM golang:${GO_VERSION}-alpine${ALPINE_VERSION} AS builder RUN apk --update add git ENV CGO_ENABLED=0 -ARG GOLANGCI_LINT_VERSION=v1.27.0 +ARG GOLANGCI_LINT_VERSION=v1.30.0 RUN wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s ${GOLANGCI_LINT_VERSION} WORKDIR /tmp/gobuild COPY .golangci.yml . @@ -14,7 +14,7 @@ COPY cmd/gluetun/main.go . COPY internal/ ./internal/ RUN go test ./... RUN golangci-lint run --timeout=10m -RUN go build -ldflags="-s -w" -o entrypoint main.go +RUN go build -trimpath -ldflags="-s -w" -o entrypoint main.go FROM alpine:${ALPINE_VERSION} ARG VERSION @@ -101,8 +101,6 @@ ENTRYPOINT ["/entrypoint"] EXPOSE 8000/tcp 8888/tcp 8388/tcp 8388/udp HEALTHCHECK --interval=10m --timeout=10s --start-period=30s --retries=2 CMD /entrypoint healthcheck RUN apk add -q --progress --no-cache --update openvpn ca-certificates iptables ip6tables unbound tinyproxy tzdata && \ - echo "http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories && \ - apk add -q --progress --no-cache --update shadowsocks-libev && \ rm -rf /var/cache/apk/* /etc/unbound/* /usr/sbin/unbound-* /etc/tinyproxy/tinyproxy.conf && \ deluser openvpn && \ deluser tinyproxy && \ diff --git a/go.mod b/go.mod index 080ded43a..7da3b6463 100644 --- a/go.mod +++ b/go.mod @@ -1,12 +1,12 @@ module github.com/qdm12/gluetun -go 1.14 +go 1.15 require ( github.com/fatih/color v1.9.0 - github.com/golang/mock v1.4.3 + github.com/golang/mock v1.4.4 github.com/kyokomi/emoji v2.2.4+incompatible github.com/qdm12/golibs v0.0.0-20200712151944-a0325873bf5a github.com/stretchr/testify v1.6.1 - golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae + golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed ) diff --git a/go.sum b/go.sum index 988a76fb2..8f73faa95 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,8 @@ github.com/go-openapi/validate v0.17.0 h1:pqoViQz3YLOGIhAmD0N4Lt6pa/3Gnj3ymKqQwq github.com/go-openapi/validate v0.17.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -92,6 +94,8 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -106,8 +110,8 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm8DvrYsvrBZdunYeIuQ= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 02930b6a9584ac0eee53e8f417cf48f6c08a79e4 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Sun, 16 Aug 2020 23:07:15 +0000 Subject: [PATCH 2/5] Shadowsocks in Go, refers to #211 --- cmd/gluetun/main.go | 12 ++--- go.mod | 1 + go.sum | 4 ++ internal/shadowsocks/command.go | 41 --------------- internal/shadowsocks/conf.go | 51 ------------------ internal/shadowsocks/conf_test.go | 81 ----------------------------- internal/shadowsocks/logadapter.go | 32 ++++++++++++ internal/shadowsocks/loop.go | 36 ++++--------- internal/shadowsocks/shadowsocks.go | 29 ----------- 9 files changed, 52 insertions(+), 235 deletions(-) delete mode 100644 internal/shadowsocks/command.go delete mode 100644 internal/shadowsocks/conf.go delete mode 100644 internal/shadowsocks/conf_test.go create mode 100644 internal/shadowsocks/logadapter.go delete mode 100644 internal/shadowsocks/shadowsocks.go diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index cb600d38f..47ddd0e93 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -69,7 +69,6 @@ func _main(background context.Context, args []string) int { routingConf := routing.NewRouting(logger, fileManager) firewallConf := firewall.NewConfigurator(logger, routingConf, fileManager) tinyProxyConf := tinyproxy.NewConfigurator(fileManager, logger) - shadowsocksConf := shadowsocks.NewConfigurator(fileManager, logger) streamMerger := command.NewStreamMerger() paramsReader := params.NewReader(logger, fileManager) @@ -79,11 +78,10 @@ func _main(background context.Context, args []string) int { paramsReader.GetBuildDate())) printVersions(ctx, logger, map[string]func(ctx context.Context) (string, error){ - "OpenVPN": ovpnConf.Version, - "Unbound": dnsConf.Version, - "IPtables": firewallConf.Version, - "TinyProxy": tinyProxyConf.Version, - "ShadowSocks": shadowsocksConf.Version, + "OpenVPN": ovpnConf.Version, + "Unbound": dnsConf.Version, + "IPtables": firewallConf.Version, + "TinyProxy": tinyProxyConf.Version, }) allSettings, err := settings.GetAllSettings(paramsReader) @@ -170,7 +168,7 @@ func _main(background context.Context, args []string) int { restartTinyproxy := tinyproxyLooper.Restart go tinyproxyLooper.Run(ctx, wg) - shadowsocksLooper := shadowsocks.NewLooper(shadowsocksConf, firewallConf, allSettings.ShadowSocks, allSettings.DNS, logger, streamMerger, uid, gid, defaultInterface) + shadowsocksLooper := shadowsocks.NewLooper(firewallConf, allSettings.ShadowSocks, logger, defaultInterface) restartShadowsocks := shadowsocksLooper.Restart go shadowsocksLooper.Run(ctx, wg) diff --git a/go.mod b/go.mod index 7da3b6463..814f19ecd 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/golang/mock v1.4.4 github.com/kyokomi/emoji v2.2.4+incompatible github.com/qdm12/golibs v0.0.0-20200712151944-a0325873bf5a + github.com/qdm12/ss-server v0.0.0-20200816230146-a9af69e3f62b github.com/stretchr/testify v1.6.1 golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed ) diff --git a/go.sum b/go.sum index 8f73faa95..4b7c177b7 100644 --- a/go.sum +++ b/go.sum @@ -74,6 +74,10 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/qdm12/golibs v0.0.0-20200712151944-a0325873bf5a h1:IyS72qFm+iXipadmUKXmpJScKXXK2GrD8yYfxXsnIYs= github.com/qdm12/golibs v0.0.0-20200712151944-a0325873bf5a/go.mod h1:pikkTN7g7zRuuAnERwqW1yAFq6pYmxrxpjiwGvb0Ysc= +github.com/qdm12/ss-server v0.0.0-20200816230146-a9af69e3f62b h1:cNsfEvt43ZTYCGDiZWfWrl9l/a7WWy3QWsRtRwkhnwg= +github.com/qdm12/ss-server v0.0.0-20200816230146-a9af69e3f62b/go.mod h1:ABVUkxubboL3vqBkOwDV9glX1/x7SnYrckBe5d+M/zw= +github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= +github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/internal/shadowsocks/command.go b/internal/shadowsocks/command.go deleted file mode 100644 index 4c7d08cb6..000000000 --- a/internal/shadowsocks/command.go +++ /dev/null @@ -1,41 +0,0 @@ -package shadowsocks - -import ( - "context" - "fmt" - "io" - "strings" - - "github.com/qdm12/gluetun/internal/constants" -) - -func (c *configurator) Start(ctx context.Context, server string, port uint16, password string, log bool) (stdout, stderr io.ReadCloser, waitFn func() error, err error) { - c.logger.Info("starting shadowsocks server") - args := []string{ - "-c", string(constants.ShadowsocksConf), - "-p", fmt.Sprintf("%d", port), - "-k", password, - } - if log { - args = append(args, "-v") - } - stdout, stderr, waitFn, err = c.commander.Start(ctx, "ss-server", args...) - return stdout, stderr, waitFn, err -} - -// Version obtains the version of the installed shadowsocks server -func (c *configurator) Version(ctx context.Context) (string, error) { - output, err := c.commander.Run(ctx, "ss-server", "-h") - if err != nil { - return "", err - } - lines := strings.Split(output, "\n") - if len(lines) < 2 { - return "", fmt.Errorf("ss-server -h: not enough lines in %q", output) - } - words := strings.Fields(lines[1]) - if len(words) < 2 { - return "", fmt.Errorf("ss-server -h: line 2 is too short: %q", lines[1]) - } - return words[1], nil -} diff --git a/internal/shadowsocks/conf.go b/internal/shadowsocks/conf.go deleted file mode 100644 index d861adec8..000000000 --- a/internal/shadowsocks/conf.go +++ /dev/null @@ -1,51 +0,0 @@ -package shadowsocks - -import ( - "encoding/json" - "fmt" - - "github.com/qdm12/gluetun/internal/constants" - "github.com/qdm12/golibs/files" -) - -func (c *configurator) MakeConf(port uint16, password, method, nameserver string, uid, gid int) (err error) { - c.logger.Info("generating configuration file") - data := generateConf(port, password, method, nameserver) - return c.fileManager.WriteToFile( - string(constants.ShadowsocksConf), - data, - files.Ownership(uid, gid), - files.Permissions(0400)) -} - -func generateConf(port uint16, password, method, nameserver string) (data []byte) { - conf := struct { - Server string `json:"server"` - User string `json:"user"` - Method string `json:"method"` - Timeout uint `json:"timeout"` - FastOpen bool `json:"fast_open"` - Mode string `json:"mode"` - PortPassword map[string]string `json:"port_password"` - Workers uint `json:"workers"` - Interface string `json:"interface"` - Nameserver *string `json:"nameserver,omitempty"` - }{ - Server: "0.0.0.0", - User: "nonrootuser", - Method: method, - Timeout: 30, - FastOpen: false, - Mode: "tcp_and_udp", - PortPassword: map[string]string{ - fmt.Sprintf("%d", port): password, - }, - Workers: 2, - Interface: "tun", - } - if len(nameserver) > 0 { - conf.Nameserver = &nameserver - } - data, _ = json.Marshal(conf) - return data -} diff --git a/internal/shadowsocks/conf_test.go b/internal/shadowsocks/conf_test.go deleted file mode 100644 index eeae78549..000000000 --- a/internal/shadowsocks/conf_test.go +++ /dev/null @@ -1,81 +0,0 @@ -package shadowsocks - -import ( - "fmt" - "testing" - - "github.com/golang/mock/gomock" - "github.com/qdm12/gluetun/internal/constants" - "github.com/qdm12/golibs/files" - "github.com/qdm12/golibs/files/mock_files" - "github.com/qdm12/golibs/logging/mock_logging" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_generateConf(t *testing.T) { - t.Parallel() - tests := map[string]struct { - port uint16 - password string - nameserver string - data []byte - }{ - "no data": { - data: []byte(`{"server":"0.0.0.0","user":"nonrootuser","method":"chacha20-ietf-poly1305","timeout":30,"fast_open":false,"mode":"tcp_and_udp","port_password":{"0":""},"workers":2,"interface":"tun"}`), - }, - "data": { - port: 2000, - password: "abcde", - nameserver: "127.0.0.1", - data: []byte(`{"server":"0.0.0.0","user":"nonrootuser","method":"chacha20-ietf-poly1305","timeout":30,"fast_open":false,"mode":"tcp_and_udp","port_password":{"2000":"abcde"},"workers":2,"interface":"tun","nameserver":"127.0.0.1"}`), - }, - } - for name, tc := range tests { - tc := tc - t.Run(name, func(t *testing.T) { - t.Parallel() - data := generateConf(tc.port, tc.password, "chacha20-ietf-poly1305", tc.nameserver) - assert.Equal(t, tc.data, data) - }) - } -} - -func Test_MakeConf(t *testing.T) { - t.Parallel() - tests := map[string]struct { - writeErr error - err error - }{ - "no write error": {}, - "write error": { - writeErr: fmt.Errorf("error"), - err: fmt.Errorf("error"), - }, - } - for name, tc := range tests { - tc := tc - t.Run(name, func(t *testing.T) { - t.Parallel() - mockCtrl := gomock.NewController(t) - defer mockCtrl.Finish() - logger := mock_logging.NewMockLogger(mockCtrl) - logger.EXPECT().Info("generating configuration file").Times(1) - fileManager := mock_files.NewMockFileManager(mockCtrl) - fileManager.EXPECT().WriteToFile( - string(constants.ShadowsocksConf), - []byte(`{"server":"0.0.0.0","user":"nonrootuser","method":"chacha20-ietf-poly1305","timeout":30,"fast_open":false,"mode":"tcp_and_udp","port_password":{"2000":"abcde"},"workers":2,"interface":"tun","nameserver":"127.0.0.1"}`), - gomock.AssignableToTypeOf(files.Ownership(0, 0)), - gomock.AssignableToTypeOf(files.Ownership(0, 0)), - ).Return(tc.writeErr).Times(1) - c := &configurator{logger: logger, fileManager: fileManager} - err := c.MakeConf(2000, "abcde", "chacha20-ietf-poly1305", "127.0.0.1", 1000, 1001) - if tc.err != nil { - require.Error(t, err) - assert.Equal(t, tc.err.Error(), err.Error()) - } else { - assert.NoError(t, err) - } - }) - } -} diff --git a/internal/shadowsocks/logadapter.go b/internal/shadowsocks/logadapter.go new file mode 100644 index 000000000..ae518de1b --- /dev/null +++ b/internal/shadowsocks/logadapter.go @@ -0,0 +1,32 @@ +package shadowsocks + +import "github.com/qdm12/golibs/logging" + +type logAdapter struct { + logger logging.Logger + enabled bool +} + +func (l *logAdapter) Info(s string) { + if l.enabled { + l.logger.Info(s) + } +} + +func (l *logAdapter) Debug(s string) { + if l.enabled { + l.logger.Debug(s) + } +} +func (l *logAdapter) Error(s string) { + if l.enabled { + l.logger.Error(s) + } +} + +func adaptLogger(logger logging.Logger, enabled bool) *logAdapter { + return &logAdapter{ + logger: logger, + enabled: enabled, + } +} diff --git a/internal/shadowsocks/loop.go b/internal/shadowsocks/loop.go index 0e2e7855d..e5c214343 100644 --- a/internal/shadowsocks/loop.go +++ b/internal/shadowsocks/loop.go @@ -2,13 +2,14 @@ package shadowsocks import ( "context" + "fmt" "sync" "time" "github.com/qdm12/gluetun/internal/firewall" "github.com/qdm12/gluetun/internal/settings" - "github.com/qdm12/golibs/command" "github.com/qdm12/golibs/logging" + shadowsockslib "github.com/qdm12/ss-server/pkg" ) type Looper interface { @@ -21,15 +22,10 @@ type Looper interface { } type looper struct { - conf Configurator firewallConf firewall.Configurator settings settings.ShadowSocks settingsMutex sync.RWMutex - dnsSettings settings.DNS // TODO logger logging.Logger - streamMerger command.StreamMerger - uid int - gid int defaultInterface string restart chan struct{} start chan struct{} @@ -44,17 +40,12 @@ func (l *looper) logAndWait(ctx context.Context, err error) { <-ctx.Done() } -func NewLooper(conf Configurator, firewallConf firewall.Configurator, settings settings.ShadowSocks, dnsSettings settings.DNS, - logger logging.Logger, streamMerger command.StreamMerger, uid, gid int, defaultInterface string) Looper { +func NewLooper(firewallConf firewall.Configurator, settings settings.ShadowSocks, + logger logging.Logger, defaultInterface string) Looper { return &looper{ - conf: conf, firewallConf: firewallConf, settings: settings, - dnsSettings: dnsSettings, logger: logger.WithPrefix("shadowsocks: "), - streamMerger: streamMerger, - uid: uid, - gid: gid, defaultInterface: defaultInterface, restart: make(chan struct{}), start: make(chan struct{}), @@ -126,12 +117,8 @@ func (l *looper) Run(ctx context.Context, wg *sync.WaitGroup) { } } - nameserver := l.dnsSettings.PlaintextAddress.String() - if l.dnsSettings.Enabled { - nameserver = "127.0.0.1" - } settings := l.GetSettings() - err := l.conf.MakeConf(settings.Port, settings.Password, settings.Method, nameserver, l.uid, l.gid) + server, err := shadowsockslib.NewServer(settings.Method, settings.Password, adaptLogger(l.logger, settings.Log)) if err != nil { l.logAndWait(ctx, err) continue @@ -150,19 +137,16 @@ func (l *looper) Run(ctx context.Context, wg *sync.WaitGroup) { previousPort = settings.Port shadowsocksCtx, shadowsocksCancel := context.WithCancel(context.Background()) - stdout, stderr, waitFn, err := l.conf.Start(shadowsocksCtx, "0.0.0.0", settings.Port, settings.Password, settings.Log) + + waitError := make(chan error) + go func() { + waitError <- server.Listen(shadowsocksCtx, fmt.Sprintf("0.0.0.0:%d", settings.Port)) + }() if err != nil { shadowsocksCancel() l.logAndWait(ctx, err) continue } - go l.streamMerger.Merge(shadowsocksCtx, stdout, command.MergeName("shadowsocks")) - go l.streamMerger.Merge(shadowsocksCtx, stderr, command.MergeName("shadowsocks error")) - waitError := make(chan error) - go func() { - err := waitFn() // blocking - waitError <- err - }() stayHere := true for stayHere { diff --git a/internal/shadowsocks/shadowsocks.go b/internal/shadowsocks/shadowsocks.go deleted file mode 100644 index e8c07266b..000000000 --- a/internal/shadowsocks/shadowsocks.go +++ /dev/null @@ -1,29 +0,0 @@ -package shadowsocks - -import ( - "context" - "io" - - "github.com/qdm12/golibs/command" - "github.com/qdm12/golibs/files" - "github.com/qdm12/golibs/logging" -) - -type Configurator interface { - Version(ctx context.Context) (string, error) - MakeConf(port uint16, password, method, nameserver string, uid, gid int) (err error) - Start(ctx context.Context, server string, port uint16, password string, log bool) (stdout, stderr io.ReadCloser, waitFn func() error, err error) -} - -type configurator struct { - fileManager files.FileManager - logger logging.Logger - commander command.Commander -} - -func NewConfigurator(fileManager files.FileManager, logger logging.Logger) Configurator { - return &configurator{ - fileManager: fileManager, - logger: logger.WithPrefix("shadowsocks configurator: "), - commander: command.NewCommander()} -} From cf1919c27fa56f16f538d8d645764818bb7fbdfc Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Sun, 16 Aug 2020 23:09:48 +0000 Subject: [PATCH 3/5] Update list of ciphers for Shadowsocks --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65ad26d31..f707500c0 100644 --- a/README.md +++ b/README.md @@ -227,7 +227,7 @@ That one is important if you want to connect to the container from your LAN for | `SHADOWSOCKS_LOG` | `off` | `on`, `off` | Enable logging | | `SHADOWSOCKS_PORT` | `8388` | `1024` to `65535` | Internal port number for Shadowsocks to listen on | | `SHADOWSOCKS_PASSWORD` | | | Password to use to connect to Shadowsocks | -| `SHADOWSOCKS_METHOD` | `chacha20-ietf-poly1305` | One of [these ciphers](https://shadowsocks.org/en/config/quick-guide.html) | Method to use for Shadowsocks | +| `SHADOWSOCKS_METHOD` | `chacha20-ietf-poly1305` | `chacha20-ietf-poly1305`, `aes-128-gcm`, `aes-256-gcm` | Method to use for Shadowsocks | ### Tinyproxy From fc1d96087ee6cdaebf5aeeac6640f0bdd33e6be4 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Sun, 16 Aug 2020 23:25:44 +0000 Subject: [PATCH 4/5] Fix SS TCP relay error handling --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 814f19ecd..22ed8729b 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/golang/mock v1.4.4 github.com/kyokomi/emoji v2.2.4+incompatible github.com/qdm12/golibs v0.0.0-20200712151944-a0325873bf5a - github.com/qdm12/ss-server v0.0.0-20200816230146-a9af69e3f62b + github.com/qdm12/ss-server v0.0.0-20200816232420-d227473c740e github.com/stretchr/testify v1.6.1 golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed ) diff --git a/go.sum b/go.sum index 4b7c177b7..4475dbd71 100644 --- a/go.sum +++ b/go.sum @@ -74,8 +74,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/qdm12/golibs v0.0.0-20200712151944-a0325873bf5a h1:IyS72qFm+iXipadmUKXmpJScKXXK2GrD8yYfxXsnIYs= github.com/qdm12/golibs v0.0.0-20200712151944-a0325873bf5a/go.mod h1:pikkTN7g7zRuuAnERwqW1yAFq6pYmxrxpjiwGvb0Ysc= -github.com/qdm12/ss-server v0.0.0-20200816230146-a9af69e3f62b h1:cNsfEvt43ZTYCGDiZWfWrl9l/a7WWy3QWsRtRwkhnwg= -github.com/qdm12/ss-server v0.0.0-20200816230146-a9af69e3f62b/go.mod h1:ABVUkxubboL3vqBkOwDV9glX1/x7SnYrckBe5d+M/zw= +github.com/qdm12/ss-server v0.0.0-20200816232420-d227473c740e h1:bUHhk0t90A78sjxGKUVo2doAYwySvs8XcvGCINghPlE= +github.com/qdm12/ss-server v0.0.0-20200816232420-d227473c740e/go.mod h1:ABVUkxubboL3vqBkOwDV9glX1/x7SnYrckBe5d+M/zw= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= From 293d9cf6005797afaed110b6f762f25dcdf7903f Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Wed, 19 Aug 2020 00:56:48 +0000 Subject: [PATCH 5/5] Fix SS CPU cycles bad eating habits (#211) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 22ed8729b..f2f6e8ceb 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/golang/mock v1.4.4 github.com/kyokomi/emoji v2.2.4+incompatible github.com/qdm12/golibs v0.0.0-20200712151944-a0325873bf5a - github.com/qdm12/ss-server v0.0.0-20200816232420-d227473c740e + github.com/qdm12/ss-server v0.0.0-20200819005413-6b516c299307 github.com/stretchr/testify v1.6.1 golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed ) diff --git a/go.sum b/go.sum index 4475dbd71..1008c04d6 100644 --- a/go.sum +++ b/go.sum @@ -74,8 +74,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/qdm12/golibs v0.0.0-20200712151944-a0325873bf5a h1:IyS72qFm+iXipadmUKXmpJScKXXK2GrD8yYfxXsnIYs= github.com/qdm12/golibs v0.0.0-20200712151944-a0325873bf5a/go.mod h1:pikkTN7g7zRuuAnERwqW1yAFq6pYmxrxpjiwGvb0Ysc= -github.com/qdm12/ss-server v0.0.0-20200816232420-d227473c740e h1:bUHhk0t90A78sjxGKUVo2doAYwySvs8XcvGCINghPlE= -github.com/qdm12/ss-server v0.0.0-20200816232420-d227473c740e/go.mod h1:ABVUkxubboL3vqBkOwDV9glX1/x7SnYrckBe5d+M/zw= +github.com/qdm12/ss-server v0.0.0-20200819005413-6b516c299307 h1:+LhVxIKpZgUM8ZcopIuc3Yjk+p76dWRdYLQiAA7caZM= +github.com/qdm12/ss-server v0.0.0-20200819005413-6b516c299307/go.mod h1:ABVUkxubboL3vqBkOwDV9glX1/x7SnYrckBe5d+M/zw= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=