diff --git a/Dockerfile b/Dockerfile index 3c8cab63..10e91c41 100644 --- a/Dockerfile +++ b/Dockerfile @@ -147,10 +147,10 @@ ENV VPNSP=pia \ # Shadowsocks SHADOWSOCKS=off \ SHADOWSOCKS_LOG=off \ - SHADOWSOCKS_PORT=8388 \ + SHADOWSOCKS_ADDRESS=":8388" \ SHADOWSOCKS_PASSWORD= \ SHADOWSOCKS_PASSWORD_SECRETFILE=/run/secrets/shadowsocks_password \ - SHADOWSOCKS_METHOD=chacha20-ietf-poly1305 \ + SHADOWSOCKS_CIPHER=chacha20-ietf-poly1305 \ UPDATER_PERIOD=0 ENTRYPOINT ["/entrypoint"] EXPOSE 8000/tcp 8888/tcp 8388/tcp 8388/udp diff --git a/go.mod b/go.mod index 36566d49..f537dc66 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/qdm12/golibs v0.0.0-20210723175634-a75ca7fd74c2 github.com/qdm12/goshutdown v0.1.0 github.com/qdm12/gosplash v0.1.0 - github.com/qdm12/ss-server v0.2.0 + github.com/qdm12/ss-server v0.3.0 github.com/qdm12/updated v0.0.0-20210603204757-205acfe6937e github.com/stretchr/testify v1.7.0 github.com/vishvananda/netlink v1.1.0 diff --git a/go.sum b/go.sum index 841f7a0e..b6ee1989 100644 --- a/go.sum +++ b/go.sum @@ -72,8 +72,8 @@ github.com/qdm12/goshutdown v0.1.0 h1:lmwnygdXtnr2pa6VqfR/bm8077/BnBef1+7CP96B7S github.com/qdm12/goshutdown v0.1.0/go.mod h1:/LP3MWLqI+wGH/ijfaUG+RHzBbKXIiVKnrg5vXOCf6Q= github.com/qdm12/gosplash v0.1.0 h1:Sfl+zIjFZFP7b0iqf2l5UkmEY97XBnaKkH3FNY6Gf7g= github.com/qdm12/gosplash v0.1.0/go.mod h1:+A3fWW4/rUeDXhY3ieBzwghKdnIPFJgD8K3qQkenJlw= -github.com/qdm12/ss-server v0.2.0 h1:+togLzeeLAJ68MD1JqOWvYi9rl9t/fx1Qh7wKzZhY1g= -github.com/qdm12/ss-server v0.2.0/go.mod h1:+1bWO1EfWNvsGM5Cuep6vneChK2OHniqtAsED9Fh1y0= +github.com/qdm12/ss-server v0.3.0 h1:BfKv4OU6dYb2KcDMYpTc7LIuO2jB73g3JCzy988GrLI= +github.com/qdm12/ss-server v0.3.0/go.mod h1:ug+nWfuzKw/h5fxL1B6e9/OhkVuWJX4i2V1Pf0pJU1o= github.com/qdm12/updated v0.0.0-20210603204757-205acfe6937e h1:4q+uFLawkaQRq3yARYLsjJPZd2wYwxn4g6G/5v0xW1g= github.com/qdm12/updated v0.0.0-20210603204757-205acfe6937e/go.mod h1:UvJRGkZ9XL3/D7e7JiTTVLm1F3Cymd3/gFpD6frEpBo= github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= diff --git a/internal/configuration/shadowsocks.go b/internal/configuration/shadowsocks.go index d9734d31..ef41526d 100644 --- a/internal/configuration/shadowsocks.go +++ b/internal/configuration/shadowsocks.go @@ -2,19 +2,16 @@ package configuration import ( "fmt" - "strconv" "strings" "github.com/qdm12/golibs/params" + "github.com/qdm12/ss-server/pkg/tcpudp" ) // ShadowSocks contains settings to configure the Shadowsocks server. type ShadowSocks struct { - Method string - Password string - Port uint16 - Enabled bool - Log bool + Enabled bool + tcpudp.Settings } func (settings *ShadowSocks) String() string { @@ -28,12 +25,12 @@ func (settings *ShadowSocks) lines() (lines []string) { lines = append(lines, lastIndent+"Shadowsocks server:") - lines = append(lines, indent+lastIndent+"Listening port: "+strconv.Itoa(int(settings.Port))) + lines = append(lines, indent+lastIndent+"Listening address: "+settings.Address) - lines = append(lines, indent+lastIndent+"Method: "+settings.Method) + lines = append(lines, indent+lastIndent+"Cipher: "+settings.CipherName) - if settings.Log { - lines = append(lines, indent+lastIndent+"Logging: enabled") + if settings.LogAddresses { + lines = append(lines, indent+lastIndent+"Log addresses: enabled") } return lines @@ -52,24 +49,53 @@ func (settings *ShadowSocks) read(r reader) (err error) { return err } - settings.Log, err = r.env.OnOff("SHADOWSOCKS_LOG", params.Default("off")) + settings.LogAddresses, err = r.env.OnOff("SHADOWSOCKS_LOG", params.Default("off")) if err != nil { return fmt.Errorf("environment variable SHADOWSOCKS_LOG: %w", err) } - settings.Method, err = r.env.Get("SHADOWSOCKS_METHOD", params.Default("chacha20-ietf-poly1305")) + settings.CipherName, err = r.env.Get("SHADOWSOCKS_CIPHER", params.Default("chacha20-ietf-poly1305"), + params.RetroKeys([]string{"SHADOWSOCKS_METHOD"}, r.onRetroActive)) if err != nil { - return fmt.Errorf("environment variable SHADOWSOCKS_METHOD: %w", err) + return fmt.Errorf("environment variable SHADOWSOCKS_CIPHER (or SHADOWSOCKS_METHOD): %w", err) } - var warning string - settings.Port, warning, err = r.env.ListeningPort("SHADOWSOCKS_PORT", params.Default("8388")) - if len(warning) > 0 { + warning, err := settings.getAddress(r.env) + if warning != "" { r.logger.Warn(warning) } if err != nil { - return fmt.Errorf("environment variable SHADOWSOCKS_PORT: %w", err) + return err } return nil } + +func (settings *ShadowSocks) getAddress(env params.Env) ( + warning string, err error) { + address, addrWarning, err := env.ListeningAddress("SHADOWSOCKS_LISTENING_ADDRESS") + if err != nil { + return addrWarning, fmt.Errorf("environment variable SHADOWSOCKS_LISTENING_ADDRESS: %w", err) + } + + if address != "" { + settings.Address = address + return addrWarning, nil + } + + // Retro-compatibility + const retroWarning = "You are using the old environment variable " + + "SHADOWSOCKS_PORT, please consider using " + + "SHADOWSOCKS_LISTENING_ADDRESS instead" + port, _, err := env.ListeningPort("SHADOWSOCKS_PORT") + if err != nil { + return retroWarning, fmt.Errorf("environment variable SHADOWSOCKS_PORT: %w", err) + } else if port > 0 { + settings.Address = ":" + fmt.Sprint(port) + return retroWarning, nil + } + + // Default value + settings.Address = ":8388" + return addrWarning, nil +} diff --git a/internal/shadowsocks/logadapter.go b/internal/shadowsocks/logadapter.go deleted file mode 100644 index ae518de1..00000000 --- a/internal/shadowsocks/logadapter.go +++ /dev/null @@ -1,32 +0,0 @@ -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 c8e0a5ee..0a560a23 100644 --- a/internal/shadowsocks/loop.go +++ b/internal/shadowsocks/loop.go @@ -3,7 +3,6 @@ package shadowsocks import ( "context" - "strconv" "sync" "time" @@ -88,7 +87,7 @@ func (l *looper) Run(ctx context.Context, done chan<- struct{}) { for ctx.Err() == nil { settings := l.GetSettings() - server, err := shadowsockslib.NewServer(settings.Method, settings.Password, adaptLogger(l.logger, settings.Log)) + server, err := shadowsockslib.NewServer(settings.Settings, l.logger) if err != nil { crashed = true l.logAndWait(ctx, err) @@ -99,7 +98,7 @@ func (l *looper) Run(ctx context.Context, done chan<- struct{}) { waitError := make(chan error) go func() { - waitError <- server.Listen(shadowsocksCtx, ":"+strconv.Itoa(int(settings.Port))) + waitError <- server.Listen(shadowsocksCtx) }() if err != nil { crashed = true