From 3f1fb52fcb9e53b44f7f14719afd26d887c5c831 Mon Sep 17 00:00:00 2001 From: "Quentin McGaw (laptop)" Date: Sat, 24 Jul 2021 17:59:22 +0000 Subject: [PATCH] Maint: upgrade qdm12 dependencies - Upgrade qdm12/golibs - Upgrade qdm12/dns to v1.11.0 --- cmd/gluetun/main.go | 6 +- go.mod | 4 +- go.sum | 9 ++- internal/configuration/reader.go | 5 +- internal/configuration/unbound_test.go | 80 ++++++++++++++++++++++++++ internal/firewall/firewall.go | 8 +-- internal/firewall/ip6tables.go | 6 +- internal/firewall/iptables.go | 6 +- internal/firewall/ports.go | 2 +- internal/openvpn/command.go | 4 +- internal/openvpn/openvpn.go | 6 +- 11 files changed, 107 insertions(+), 29 deletions(-) create mode 100644 internal/configuration/unbound_test.go diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index 1264d173..6e75f4d9 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -71,7 +71,7 @@ func main() { unix := unix.New() cli := cli.New() env := params.NewEnv() - cmder := command.NewCommander() + cmder := command.NewCmder() errorCh := make(chan error) go func() { @@ -114,7 +114,7 @@ var ( //nolint:gocognit,gocyclo func _main(ctx context.Context, buildInfo models.BuildInformation, args []string, logger logging.ParentLogger, env params.Env, - unix unix.Unix, cmder command.Commander, cli cli.CLIer) error { + unix unix.Unix, cmder command.RunStarter, cli cli.CLIer) error { if len(args) > 1 { // cli operation switch args[1] { case "healthcheck": @@ -139,7 +139,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, unix, cmder) dnsCrypto := dnscrypto.New(httpClient, "", "") const cacertsPath = "/etc/ssl/certs/ca-certificates.crt" - dnsConf := unbound.NewConfigurator(nil, dnsCrypto, + dnsConf := unbound.NewConfigurator(nil, cmder, dnsCrypto, "/etc/unbound", "/usr/sbin/unbound", cacertsPath) announcementExp, err := time.Parse(time.RFC3339, "2021-07-22T00:00:00Z") diff --git a/go.mod b/go.mod index d78bcd2e..36566d49 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.16 require ( github.com/fatih/color v1.12.0 github.com/golang/mock v1.6.0 - github.com/qdm12/dns v1.10.0 - github.com/qdm12/golibs v0.0.0-20210723191510-d1078ef6fa9d + github.com/qdm12/dns v1.11.0 + 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 diff --git a/go.sum b/go.sum index f0dda60d..841f7a0e 100644 --- a/go.sum +++ b/go.sum @@ -63,12 +63,11 @@ github.com/phayes/permbits v0.0.0-20190612203442-39d7c581d2ee/go.mod h1:3uODdxMg github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/qdm12/dns v1.10.0 h1:WX5QQ5+2h34xfhfxJTmvyURbs9XE4qNrEGtyNeq38Bw= -github.com/qdm12/dns v1.10.0/go.mod h1:fqZoDf3VzddnKBMNI/OzZUp5H4dO0VBw1fp4qPkolOg= +github.com/qdm12/dns v1.11.0 h1:jpcD5DZXXQSQe5a263PL09ghukiIdptvXFOZvyKEm6Q= +github.com/qdm12/dns v1.11.0/go.mod h1:FmQsNOUcrrZ4UFzWAiED56AKXeNgaX3ySbmPwEfNjjE= github.com/qdm12/golibs v0.0.0-20210603202746-e5494e9c2ebb/go.mod h1:15RBzkun0i8XB7ADIoLJWp9ITRgsz3LroEI2FiOXLRg= -github.com/qdm12/golibs v0.0.0-20210716185557-66793f4ddd80/go.mod h1:15RBzkun0i8XB7ADIoLJWp9ITRgsz3LroEI2FiOXLRg= -github.com/qdm12/golibs v0.0.0-20210723191510-d1078ef6fa9d h1:bBLNwxvlU4LXrSkDXW+S6czLLUSN42ERA/KdX19qIbU= -github.com/qdm12/golibs v0.0.0-20210723191510-d1078ef6fa9d/go.mod h1:6aRbg4Z/bTbm9JfxsGXfWKHi7zsOvPfUTK1S5HuAFKg= +github.com/qdm12/golibs v0.0.0-20210723175634-a75ca7fd74c2 h1:FMeOhe/bGloI0T5Wb6QB7/rfOqgFeI//UF/N/f7PUCI= +github.com/qdm12/golibs v0.0.0-20210723175634-a75ca7fd74c2/go.mod h1:6aRbg4Z/bTbm9JfxsGXfWKHi7zsOvPfUTK1S5HuAFKg= github.com/qdm12/goshutdown v0.1.0 h1:lmwnygdXtnr2pa6VqfR/bm8077/BnBef1+7CP96B7Sw= github.com/qdm12/goshutdown v0.1.0/go.mod h1:/LP3MWLqI+wGH/ijfaUG+RHzBbKXIiVKnrg5vXOCf6Q= github.com/qdm12/gosplash v0.1.0 h1:Sfl+zIjFZFP7b0iqf2l5UkmEY97XBnaKkH3FNY6Gf7g= diff --git a/internal/configuration/reader.go b/internal/configuration/reader.go index d6ac80f8..0f0c15c0 100644 --- a/internal/configuration/reader.go +++ b/internal/configuration/reader.go @@ -28,9 +28,8 @@ func newReader(env params.Env, logger logging.Logger) reader { func (r *reader) onRetroActive(oldKey, newKey string) { r.logger.Warn( - "You are using the old environment variable %s, please consider changing it to %s", - oldKey, newKey, - ) + "You are using the old environment variable " + oldKey + + ", please consider changing it to " + newKey) } var ( diff --git a/internal/configuration/unbound_test.go b/internal/configuration/unbound_test.go new file mode 100644 index 00000000..20daba8a --- /dev/null +++ b/internal/configuration/unbound_test.go @@ -0,0 +1,80 @@ +package configuration + +import ( + "errors" + "testing" + + "github.com/golang/mock/gomock" + "github.com/qdm12/dns/pkg/provider" + "github.com/qdm12/dns/pkg/unbound" + "github.com/qdm12/golibs/params/mock_params" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_DNS_readUnboundProviders(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + envValue string + envErr error + expected DNS + err error + }{ + "bad value": { + envValue: "invalid", + err: errors.New(`invalid DNS over TLS provider: cannot parse provider: "invalid"`), + }, + "env error": { + envErr: errors.New("env error"), + err: errors.New("environment variable DOT_PROVIDERS: env error"), + }, + "multiple valid values": { + envValue: "cloudflare,google", + expected: DNS{ + Unbound: unbound.Settings{ + Providers: []provider.Provider{ + provider.Cloudflare(), + provider.Google(), + }, + }, + }, + }, + "one invalid value in two": { + envValue: "cloudflare,invalid", + expected: DNS{ + Unbound: unbound.Settings{ + Providers: []provider.Provider{ + provider.Cloudflare(), + }, + }, + }, + err: errors.New(`invalid DNS over TLS provider: cannot parse provider: "invalid"`), + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + + env := mock_params.NewMockEnv(ctrl) + env.EXPECT().Get("DOT_PROVIDERS", gomock.Any()). + Return(testCase.envValue, testCase.envErr) + + var settings DNS + err := settings.readUnboundProviders(env) + + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + } else { + assert.NoError(t, err) + } + + assert.Equal(t, testCase.expected, settings) + }) + } +} diff --git a/internal/firewall/firewall.go b/internal/firewall/firewall.go index a96c0600..859cdac5 100644 --- a/internal/firewall/firewall.go +++ b/internal/firewall/firewall.go @@ -24,7 +24,7 @@ type Configurator interface { } type Config struct { //nolint:maligned - commander command.Commander + runner command.Runner logger logging.Logger routing routing.Routing iptablesMutex sync.Mutex @@ -47,15 +47,15 @@ type Config struct { //nolint:maligned } // NewConfig creates a new Config instance. -func NewConfig(logger logging.Logger, cmder command.Commander, +func NewConfig(logger logging.Logger, runner command.Runner, routing routing.Routing, defaultInterface string, defaultGateway net.IP, localNetworks []routing.LocalNetwork, localIP net.IP) *Config { return &Config{ - commander: cmder, + runner: runner, logger: logger, routing: routing, allowedInputPorts: make(map[uint16]string), - ip6Tables: ip6tablesSupported(context.Background(), cmder), + ip6Tables: ip6tablesSupported(context.Background(), runner), customRulesPath: "/iptables/post-rules.txt", // Obtained from routing defaultInterface: defaultInterface, diff --git a/internal/firewall/ip6tables.go b/internal/firewall/ip6tables.go index fcee0ab7..ff058a60 100644 --- a/internal/firewall/ip6tables.go +++ b/internal/firewall/ip6tables.go @@ -15,9 +15,9 @@ var ( ErrIP6NotSupported = errors.New("ip6tables not supported") ) -func ip6tablesSupported(ctx context.Context, commander command.Commander) (supported bool) { +func ip6tablesSupported(ctx context.Context, runner command.Runner) (supported bool) { cmd := exec.CommandContext(ctx, "ip6tables", "-L") - if _, err := commander.Run(cmd); err != nil { + if _, err := runner.Run(cmd); err != nil { return false } return true @@ -43,7 +43,7 @@ func (c *Config) runIP6tablesInstruction(ctx context.Context, instruction string flags := strings.Fields(instruction) cmd := exec.CommandContext(ctx, "ip6tables", flags...) - if output, err := c.commander.Run(cmd); err != nil { + if output, err := c.runner.Run(cmd); err != nil { return fmt.Errorf("%w: \"ip6tables %s\": %s: %s", ErrIP6Tables, instruction, output, err) } return nil diff --git a/internal/firewall/iptables.go b/internal/firewall/iptables.go index 026483e4..9bf28df6 100644 --- a/internal/firewall/iptables.go +++ b/internal/firewall/iptables.go @@ -47,9 +47,9 @@ func flipRule(rule string) string { } // Version obtains the version of the installed iptables. -func Version(ctx context.Context, commander command.Commander) (string, error) { +func Version(ctx context.Context, runner command.Runner) (string, error) { cmd := exec.CommandContext(ctx, "iptables", "--version") - output, err := commander.Run(cmd) + output, err := runner.Run(cmd) if err != nil { return "", err } @@ -78,7 +78,7 @@ func (c *Config) runIptablesInstruction(ctx context.Context, instruction string) flags := strings.Fields(instruction) cmd := exec.CommandContext(ctx, "iptables", flags...) - if output, err := c.commander.Run(cmd); err != nil { + if output, err := c.runner.Run(cmd); err != nil { return fmt.Errorf("%w \"iptables %s\": %s: %s", ErrIPTables, instruction, output, err) } return nil diff --git a/internal/firewall/ports.go b/internal/firewall/ports.go index 5aee05e0..7788b69c 100644 --- a/internal/firewall/ports.go +++ b/internal/firewall/ports.go @@ -60,7 +60,7 @@ func (c *Config) RemoveAllowedPort(ctx context.Context, port uint16) (err error) return nil } - c.logger.Info("removing allowed port "+strconv.Itoa(int(port))+" through firewall...", port) + c.logger.Info("removing allowed port " + strconv.Itoa(int(port)) + " through firewall...") intf, ok := c.allowedInputPorts[port] if !ok { diff --git a/internal/openvpn/command.go b/internal/openvpn/command.go index 938e6c12..b7397188 100644 --- a/internal/openvpn/command.go +++ b/internal/openvpn/command.go @@ -37,7 +37,7 @@ func (c *configurator) Start(ctx context.Context, version string, flags []string cmd := exec.CommandContext(ctx, bin, args...) cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - return c.commander.Start(cmd) + return c.cmder.Start(cmd) } func (c *configurator) Version24(ctx context.Context) (version string, err error) { @@ -52,7 +52,7 @@ var ErrVersionTooShort = errors.New("version output is too short") func (c *configurator) version(ctx context.Context, binName string) (version string, err error) { cmd := exec.CommandContext(ctx, binName, "--version") - output, err := c.commander.Run(cmd) + output, err := c.cmder.Run(cmd) if err != nil && err.Error() != "exit status 1" { return "", err } diff --git a/internal/openvpn/openvpn.go b/internal/openvpn/openvpn.go index 55b88ff9..c8bae346 100644 --- a/internal/openvpn/openvpn.go +++ b/internal/openvpn/openvpn.go @@ -23,17 +23,17 @@ type Configurator interface { type configurator struct { logger logging.Logger - commander command.Commander + cmder command.RunStarter unix unix.Unix authFilePath string tunDevPath string } func NewConfigurator(logger logging.Logger, unix unix.Unix, - cmder command.Commander) Configurator { + cmder command.RunStarter) Configurator { return &configurator{ logger: logger, - commander: cmder, + cmder: cmder, unix: unix, authFilePath: constants.OpenVPNAuthConf, tunDevPath: constants.TunnelDevice,