diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index cdb6d696..4348c36d 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -294,7 +294,7 @@ func _main(background context.Context, args []string) int { //nolint:gocognit,go } func createLogger() logging.Logger { - logger, err := logging.NewLogger(logging.ConsoleEncoding, logging.InfoLevel, -1) + logger, err := logging.NewLogger(logging.ConsoleEncoding, logging.InfoLevel) if err != nil { panic(err) } diff --git a/go.mod b/go.mod index 213b08af..49c05329 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,9 @@ require ( github.com/fatih/color v1.9.0 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-20200819005413-6b516c299307 + github.com/qdm12/golibs v0.0.0-20201018021451-d64f6f83fb81 + github.com/qdm12/ss-server v0.0.0-20200819124651-6428e626ee83 github.com/stretchr/testify v1.6.1 - golang.org/x/net v0.0.0-20190620200207-3b0461eec859 - golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed + golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0 + golang.org/x/sys v0.0.0-20201017003518-b09fb700fbb7 ) diff --git a/go.sum b/go.sum index 1008c04d..f56c7925 100644 --- a/go.sum +++ b/go.sum @@ -72,10 +72,12 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= 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/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/golibs v0.0.0-20201018021451-d64f6f83fb81 h1:UouAegRn1ZB2BgoA7cA6wE5hr24cN2mgo4Lo8qC9yxo= +github.com/qdm12/golibs v0.0.0-20201018021451-d64f6f83fb81/go.mod h1:xbNrWrKyAZ5akH7lqp/uEA2HTZg+qDOzzugSiyLbzAA= 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/qdm12/ss-server v0.0.0-20200819124651-6428e626ee83 h1:b7sNsgsKxH0mbl9L1hdUp5KSDkZ/1kOQ+iHiBVgFElM= +github.com/qdm12/ss-server v0.0.0-20200819124651-6428e626ee83/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= @@ -98,6 +100,7 @@ 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-20200622213623-75b288015ac9/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= @@ -108,6 +111,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0 h1:5kGOVHlq0euqwzgTC9Vu15p6fV1Wi0ArVi8da2urnVg= +golang.org/x/net v0.0.0-20201016165138-7b1cca2348c0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -116,9 +121,14 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201017003518-b09fb700fbb7 h1:XtNJkfEjb4zR3q20BBBcYUykVOEMgZeIUOpBPfNYgxg= +golang.org/x/sys v0.0.0-20201017003518-b09fb700fbb7/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= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= diff --git a/internal/cli/cli.go b/internal/cli/cli.go index 825ec5aa..2d99763f 100644 --- a/internal/cli/cli.go +++ b/internal/cli/cli.go @@ -58,7 +58,7 @@ func HealthCheck(ctx context.Context, client *http.Client) error { } func OpenvpnConfig() error { - logger, err := logging.NewLogger(logging.ConsoleEncoding, logging.InfoLevel, -1) + logger, err := logging.NewLogger(logging.ConsoleEncoding, logging.InfoLevel) if err != nil { return err } @@ -109,7 +109,7 @@ func Update(args []string) error { if err := flagSet.Parse(args); err != nil { return err } - logger, err := logging.NewLogger(logging.ConsoleEncoding, logging.InfoLevel, -1) + logger, err := logging.NewLogger(logging.ConsoleEncoding, logging.InfoLevel) if err != nil { return err } diff --git a/internal/dns/conf.go b/internal/dns/conf.go index 19cc1ad1..3c614376 100644 --- a/internal/dns/conf.go +++ b/internal/dns/conf.go @@ -1,6 +1,7 @@ package dns import ( + "context" "fmt" "net/http" "sort" @@ -13,9 +14,9 @@ import ( "github.com/qdm12/golibs/network" ) -func (c *configurator) MakeUnboundConf(settings settings.DNS, uid, gid int) (err error) { +func (c *configurator) MakeUnboundConf(ctx context.Context, settings settings.DNS, uid, gid int) (err error) { c.logger.Info("generating Unbound configuration") - lines, warnings := generateUnboundConf(settings, c.client, c.logger) + lines, warnings := generateUnboundConf(ctx, settings, c.client, c.logger) for _, warning := range warnings { c.logger.Warn(warning) } @@ -27,7 +28,7 @@ func (c *configurator) MakeUnboundConf(settings settings.DNS, uid, gid int) (err } // MakeUnboundConf generates an Unbound configuration from the user provided settings -func generateUnboundConf(settings settings.DNS, client network.Client, logger logging.Logger) (lines []string, warnings []error) { +func generateUnboundConf(ctx context.Context, settings settings.DNS, client network.Client, logger logging.Logger) (lines []string, warnings []error) { doIPv6 := "no" if settings.IPv6 { doIPv6 = "yes" @@ -70,7 +71,7 @@ func generateUnboundConf(settings settings.DNS, client network.Client, logger lo } // Block lists - hostnamesLines, ipsLines, warnings := buildBlocked(client, + hostnamesLines, ipsLines, warnings := buildBlocked(ctx, client, settings.BlockMalicious, settings.BlockAds, settings.BlockSurveillance, settings.AllowedHostnames, settings.PrivateAddresses, ) @@ -129,18 +130,18 @@ func generateUnboundConf(settings settings.DNS, client network.Client, logger lo return lines, warnings } -func buildBlocked(client network.Client, blockMalicious, blockAds, blockSurveillance bool, +func buildBlocked(ctx context.Context, client network.Client, blockMalicious, blockAds, blockSurveillance bool, allowedHostnames, privateAddresses []string) (hostnamesLines, ipsLines []string, errs []error) { chHostnames := make(chan []string) chIPs := make(chan []string) chErrors := make(chan []error) go func() { - lines, errs := buildBlockedHostnames(client, blockMalicious, blockAds, blockSurveillance, allowedHostnames) + lines, errs := buildBlockedHostnames(ctx, client, blockMalicious, blockAds, blockSurveillance, allowedHostnames) chHostnames <- lines chErrors <- errs }() go func() { - lines, errs := buildBlockedIPs(client, blockMalicious, blockAds, blockSurveillance, privateAddresses) + lines, errs := buildBlockedIPs(ctx, client, blockMalicious, blockAds, blockSurveillance, privateAddresses) chIPs <- lines chErrors <- errs }() @@ -159,8 +160,8 @@ func buildBlocked(client network.Client, blockMalicious, blockAds, blockSurveill return hostnamesLines, ipsLines, errs } -func getList(client network.Client, url string) (results []string, err error) { - content, status, err := client.GetContent(url) +func getList(ctx context.Context, client network.Client, url string) (results []string, err error) { + content, status, err := client.Get(ctx, url) if err != nil { return nil, err } else if status != http.StatusOK { @@ -184,7 +185,7 @@ func getList(client network.Client, url string) (results []string, err error) { return results, nil } -func buildBlockedHostnames(client network.Client, blockMalicious, blockAds, blockSurveillance bool, +func buildBlockedHostnames(ctx context.Context, client network.Client, blockMalicious, blockAds, blockSurveillance bool, allowedHostnames []string) (lines []string, errs []error) { chResults := make(chan []string) chError := make(chan error) @@ -192,7 +193,7 @@ func buildBlockedHostnames(client network.Client, blockMalicious, blockAds, bloc if blockMalicious { listsLeftToFetch++ go func() { - results, err := getList(client, string(constants.MaliciousBlockListHostnamesURL)) + results, err := getList(ctx, client, string(constants.MaliciousBlockListHostnamesURL)) chResults <- results chError <- err }() @@ -200,7 +201,7 @@ func buildBlockedHostnames(client network.Client, blockMalicious, blockAds, bloc if blockAds { listsLeftToFetch++ go func() { - results, err := getList(client, string(constants.AdsBlockListHostnamesURL)) + results, err := getList(ctx, client, string(constants.AdsBlockListHostnamesURL)) chResults <- results chError <- err }() @@ -208,7 +209,7 @@ func buildBlockedHostnames(client network.Client, blockMalicious, blockAds, bloc if blockSurveillance { listsLeftToFetch++ go func() { - results, err := getList(client, string(constants.SurveillanceBlockListHostnamesURL)) + results, err := getList(ctx, client, string(constants.SurveillanceBlockListHostnamesURL)) chResults <- results chError <- err }() @@ -236,7 +237,7 @@ func buildBlockedHostnames(client network.Client, blockMalicious, blockAds, bloc return lines, errs } -func buildBlockedIPs(client network.Client, blockMalicious, blockAds, blockSurveillance bool, +func buildBlockedIPs(ctx context.Context, client network.Client, blockMalicious, blockAds, blockSurveillance bool, privateAddresses []string) (lines []string, errs []error) { chResults := make(chan []string) chError := make(chan error) @@ -244,7 +245,7 @@ func buildBlockedIPs(client network.Client, blockMalicious, blockAds, blockSurve if blockMalicious { listsLeftToFetch++ go func() { - results, err := getList(client, string(constants.MaliciousBlockListIPsURL)) + results, err := getList(ctx, client, string(constants.MaliciousBlockListIPsURL)) chResults <- results chError <- err }() @@ -252,7 +253,7 @@ func buildBlockedIPs(client network.Client, blockMalicious, blockAds, blockSurve if blockAds { listsLeftToFetch++ go func() { - results, err := getList(client, string(constants.AdsBlockListIPsURL)) + results, err := getList(ctx, client, string(constants.AdsBlockListIPsURL)) chResults <- results chError <- err }() @@ -260,7 +261,7 @@ func buildBlockedIPs(client network.Client, blockMalicious, blockAds, blockSurve if blockSurveillance { listsLeftToFetch++ go func() { - results, err := getList(client, string(constants.SurveillanceBlockListIPsURL)) + results, err := getList(ctx, client, string(constants.SurveillanceBlockListIPsURL)) chResults <- results chError <- err }() diff --git a/internal/dns/conf_test.go b/internal/dns/conf_test.go index 86697457..a1663005 100644 --- a/internal/dns/conf_test.go +++ b/internal/dns/conf_test.go @@ -1,6 +1,7 @@ package dns import ( + "context" "fmt" "strings" "testing" @@ -31,15 +32,16 @@ func Test_generateUnboundConf(t *testing.T) { } mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() + ctx := context.Background() client := mock_network.NewMockClient(mockCtrl) - client.EXPECT().GetContent(string(constants.MaliciousBlockListHostnamesURL)). + client.EXPECT().Get(ctx, string(constants.MaliciousBlockListHostnamesURL)). Return([]byte("b\na\nc"), 200, nil).Times(1) - client.EXPECT().GetContent(string(constants.MaliciousBlockListIPsURL)). + client.EXPECT().Get(ctx, string(constants.MaliciousBlockListIPsURL)). Return([]byte("c\nd\n"), 200, nil).Times(1) logger := mock_logging.NewMockLogger(mockCtrl) logger.EXPECT().Info("%d hostnames blocked overall", 2).Times(1) logger.EXPECT().Info("%d IP addresses blocked overall", 3).Times(1) - lines, warnings := generateUnboundConf(settings, client, logger) + lines, warnings := generateUnboundConf(ctx, settings, client, logger) require.Len(t, warnings, 0) expected := ` server: @@ -232,26 +234,28 @@ func Test_buildBlocked(t *testing.T) { t.Parallel() mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() + ctx := context.Background() client := mock_network.NewMockClient(mockCtrl) if tc.malicious.blocked { - client.EXPECT().GetContent(string(constants.MaliciousBlockListHostnamesURL)). + client.EXPECT().Get(ctx, string(constants.MaliciousBlockListHostnamesURL)). Return(tc.malicious.content, 200, tc.malicious.clientErr).Times(1) - client.EXPECT().GetContent(string(constants.MaliciousBlockListIPsURL)). + client.EXPECT().Get(ctx, string(constants.MaliciousBlockListIPsURL)). Return(tc.malicious.content, 200, tc.malicious.clientErr).Times(1) } if tc.ads.blocked { - client.EXPECT().GetContent(string(constants.AdsBlockListHostnamesURL)). + client.EXPECT().Get(ctx, string(constants.AdsBlockListHostnamesURL)). Return(tc.ads.content, 200, tc.ads.clientErr).Times(1) - client.EXPECT().GetContent(string(constants.AdsBlockListIPsURL)). + client.EXPECT().Get(ctx, string(constants.AdsBlockListIPsURL)). Return(tc.ads.content, 200, tc.ads.clientErr).Times(1) } if tc.surveillance.blocked { - client.EXPECT().GetContent(string(constants.SurveillanceBlockListHostnamesURL)). + client.EXPECT().Get(ctx, string(constants.SurveillanceBlockListHostnamesURL)). Return(tc.surveillance.content, 200, tc.surveillance.clientErr).Times(1) - client.EXPECT().GetContent(string(constants.SurveillanceBlockListIPsURL)). + client.EXPECT().Get(ctx, string(constants.SurveillanceBlockListIPsURL)). Return(tc.surveillance.content, 200, tc.surveillance.clientErr).Times(1) } - hostnamesLines, ipsLines, errs := buildBlocked(client, tc.malicious.blocked, tc.ads.blocked, tc.surveillance.blocked, + hostnamesLines, ipsLines, errs := buildBlocked(ctx, client, + tc.malicious.blocked, tc.ads.blocked, tc.surveillance.blocked, tc.allowedHostnames, tc.privateAddresses) var errsString []string for _, err := range errs { @@ -284,10 +288,11 @@ func Test_getList(t *testing.T) { t.Parallel() mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() + ctx := context.Background() client := mock_network.NewMockClient(mockCtrl) - client.EXPECT().GetContent("irrelevant_url"). + client.EXPECT().Get(ctx, "irrelevant_url"). Return(tc.content, tc.status, tc.clientErr).Times(1) - results, err := getList(client, "irrelevant_url") + results, err := getList(ctx, client, "irrelevant_url") if tc.err != nil { require.Error(t, err) assert.Equal(t, tc.err.Error(), err.Error()) @@ -388,21 +393,23 @@ func Test_buildBlockedHostnames(t *testing.T) { t.Parallel() mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() + ctx := context.Background() client := mock_network.NewMockClient(mockCtrl) if tc.malicious.blocked { - client.EXPECT().GetContent(string(constants.MaliciousBlockListHostnamesURL)). + client.EXPECT().Get(ctx, string(constants.MaliciousBlockListHostnamesURL)). Return(tc.malicious.content, 200, tc.malicious.clientErr).Times(1) } if tc.ads.blocked { - client.EXPECT().GetContent(string(constants.AdsBlockListHostnamesURL)). + client.EXPECT().Get(ctx, string(constants.AdsBlockListHostnamesURL)). Return(tc.ads.content, 200, tc.ads.clientErr).Times(1) } if tc.surveillance.blocked { - client.EXPECT().GetContent(string(constants.SurveillanceBlockListHostnamesURL)). + client.EXPECT().Get(ctx, string(constants.SurveillanceBlockListHostnamesURL)). Return(tc.surveillance.content, 200, tc.surveillance.clientErr).Times(1) } - lines, errs := buildBlockedHostnames(client, - tc.malicious.blocked, tc.ads.blocked, tc.surveillance.blocked, tc.allowedHostnames) + lines, errs := buildBlockedHostnames(ctx, client, + tc.malicious.blocked, tc.ads.blocked, + tc.surveillance.blocked, tc.allowedHostnames) var errsString []string for _, err := range errs { errsString = append(errsString, err.Error()) @@ -504,21 +511,23 @@ func Test_buildBlockedIPs(t *testing.T) { t.Parallel() mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() + ctx := context.Background() client := mock_network.NewMockClient(mockCtrl) if tc.malicious.blocked { - client.EXPECT().GetContent(string(constants.MaliciousBlockListIPsURL)). + client.EXPECT().Get(ctx, string(constants.MaliciousBlockListIPsURL)). Return(tc.malicious.content, 200, tc.malicious.clientErr).Times(1) } if tc.ads.blocked { - client.EXPECT().GetContent(string(constants.AdsBlockListIPsURL)). + client.EXPECT().Get(ctx, string(constants.AdsBlockListIPsURL)). Return(tc.ads.content, 200, tc.ads.clientErr).Times(1) } if tc.surveillance.blocked { - client.EXPECT().GetContent(string(constants.SurveillanceBlockListIPsURL)). + client.EXPECT().Get(ctx, string(constants.SurveillanceBlockListIPsURL)). Return(tc.surveillance.content, 200, tc.surveillance.clientErr).Times(1) } - lines, errs := buildBlockedIPs(client, - tc.malicious.blocked, tc.ads.blocked, tc.surveillance.blocked, tc.privateAddresses) + lines, errs := buildBlockedIPs(ctx, client, + tc.malicious.blocked, tc.ads.blocked, + tc.surveillance.blocked, tc.privateAddresses) var errsString []string for _, err := range errs { errsString = append(errsString, err.Error()) diff --git a/internal/dns/dns.go b/internal/dns/dns.go index 56221eac..97dd4be6 100644 --- a/internal/dns/dns.go +++ b/internal/dns/dns.go @@ -13,9 +13,9 @@ import ( ) type Configurator interface { - DownloadRootHints(uid, gid int) error - DownloadRootKey(uid, gid int) error - MakeUnboundConf(settings settings.DNS, uid, gid int) (err error) + DownloadRootHints(ctx context.Context, uid, gid int) error + DownloadRootKey(ctx context.Context, uid, gid int) error + MakeUnboundConf(ctx context.Context, settings settings.DNS, uid, gid int) (err error) UseDNSInternally(IP net.IP) UseDNSSystemWide(ip net.IP, keepNameserver bool) error Start(ctx context.Context, logLevel uint8) (stdout io.ReadCloser, waitFn func() error, err error) diff --git a/internal/dns/loop.go b/internal/dns/loop.go index 90d0c2ae..b8aaf565 100644 --- a/internal/dns/loop.go +++ b/internal/dns/loop.go @@ -164,15 +164,15 @@ func (l *looper) Run(ctx context.Context, wg *sync.WaitGroup, signalDNSReady fun settings := l.GetSettings() // Setup - if err := l.conf.DownloadRootHints(l.uid, l.gid); err != nil { + if err := l.conf.DownloadRootHints(ctx, l.uid, l.gid); err != nil { l.logAndWait(ctx, err) continue } - if err := l.conf.DownloadRootKey(l.uid, l.gid); err != nil { + if err := l.conf.DownloadRootKey(ctx, l.uid, l.gid); err != nil { l.logAndWait(ctx, err) continue } - if err := l.conf.MakeUnboundConf(settings, l.uid, l.gid); err != nil { + if err := l.conf.MakeUnboundConf(ctx, settings, l.uid, l.gid); err != nil { l.logAndWait(ctx, err) continue } diff --git a/internal/dns/roots.go b/internal/dns/roots.go index 74c8e821..1e59f279 100644 --- a/internal/dns/roots.go +++ b/internal/dns/roots.go @@ -1,6 +1,7 @@ package dns import ( + "context" "fmt" "net/http" @@ -8,9 +9,9 @@ import ( "github.com/qdm12/golibs/files" ) -func (c *configurator) DownloadRootHints(uid, gid int) error { +func (c *configurator) DownloadRootHints(ctx context.Context, uid, gid int) error { c.logger.Info("downloading root hints from %s", constants.NamedRootURL) - content, status, err := c.client.GetContent(string(constants.NamedRootURL)) + content, status, err := c.client.Get(ctx, string(constants.NamedRootURL)) if err != nil { return err } else if status != http.StatusOK { @@ -23,9 +24,9 @@ func (c *configurator) DownloadRootHints(uid, gid int) error { files.Permissions(0400)) } -func (c *configurator) DownloadRootKey(uid, gid int) error { +func (c *configurator) DownloadRootKey(ctx context.Context, uid, gid int) error { c.logger.Info("downloading root key from %s", constants.RootKeyURL) - content, status, err := c.client.GetContent(string(constants.RootKeyURL)) + content, status, err := c.client.Get(ctx, string(constants.RootKeyURL)) if err != nil { return err } else if status != http.StatusOK { diff --git a/internal/dns/roots_test.go b/internal/dns/roots_test.go index 637283a1..28ad5dac 100644 --- a/internal/dns/roots_test.go +++ b/internal/dns/roots_test.go @@ -1,6 +1,7 @@ package dns import ( + "context" "fmt" "net/http" "testing" @@ -52,10 +53,11 @@ func Test_DownloadRootHints(t *testing.T) { //nolint:dupl t.Parallel() mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() + ctx := context.Background() logger := mock_logging.NewMockLogger(mockCtrl) logger.EXPECT().Info("downloading root hints from %s", constants.NamedRootURL).Times(1) client := mock_network.NewMockClient(mockCtrl) - client.EXPECT().GetContent(string(constants.NamedRootURL)). + client.EXPECT().Get(ctx, string(constants.NamedRootURL)). Return(tc.content, tc.status, tc.clientErr).Times(1) fileManager := mock_files.NewMockFileManager(mockCtrl) if tc.clientErr == nil && tc.status == http.StatusOK { @@ -67,7 +69,7 @@ func Test_DownloadRootHints(t *testing.T) { //nolint:dupl Return(tc.writeErr).Times(1) } c := &configurator{logger: logger, client: client, fileManager: fileManager} - err := c.DownloadRootHints(1000, 1000) + err := c.DownloadRootHints(ctx, 1000, 1000) if tc.err != nil { require.Error(t, err) assert.Equal(t, tc.err.Error(), err.Error()) @@ -114,10 +116,11 @@ func Test_DownloadRootKey(t *testing.T) { //nolint:dupl t.Parallel() mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() + ctx := context.Background() logger := mock_logging.NewMockLogger(mockCtrl) logger.EXPECT().Info("downloading root key from %s", constants.RootKeyURL).Times(1) client := mock_network.NewMockClient(mockCtrl) - client.EXPECT().GetContent(string(constants.RootKeyURL)). + client.EXPECT().Get(ctx, string(constants.RootKeyURL)). Return(tc.content, tc.status, tc.clientErr).Times(1) fileManager := mock_files.NewMockFileManager(mockCtrl) if tc.clientErr == nil && tc.status == http.StatusOK { @@ -129,7 +132,7 @@ func Test_DownloadRootKey(t *testing.T) { //nolint:dupl ).Return(tc.writeErr).Times(1) } c := &configurator{logger: logger, client: client, fileManager: fileManager} - err := c.DownloadRootKey(1000, 1001) + err := c.DownloadRootKey(ctx, 1000, 1001) if tc.err != nil { require.Error(t, err) assert.Equal(t, tc.err.Error(), err.Error()) diff --git a/internal/publicip/loop.go b/internal/publicip/loop.go index 8fd8fc91..153ee080 100644 --- a/internal/publicip/loop.go +++ b/internal/publicip/loop.go @@ -104,7 +104,7 @@ func (l *looper) Run(ctx context.Context, wg *sync.WaitGroup) { // Enabled and has a period set - ip, err := l.getter.Get() + ip, err := l.getter.Get(ctx) if err != nil { l.logAndWait(ctx, err) continue diff --git a/internal/publicip/publicip.go b/internal/publicip/publicip.go index 4f14e7b5..845fedaa 100644 --- a/internal/publicip/publicip.go +++ b/internal/publicip/publicip.go @@ -1,6 +1,7 @@ package publicip import ( + "context" "fmt" "math/rand" "net" @@ -11,7 +12,7 @@ import ( ) type IPGetter interface { - Get() (ip net.IP, err error) + Get(ctx context.Context) (ip net.IP, err error) } type ipGetter struct { @@ -26,7 +27,7 @@ func NewIPGetter(client network.Client) IPGetter { } } -func (i *ipGetter) Get() (ip net.IP, err error) { +func (i *ipGetter) Get(ctx context.Context) (ip net.IP, err error) { urls := []string{ "https://ifconfig.me/ip", "http://ip1.dynupdate.no-ip.com:8245", @@ -38,7 +39,7 @@ func (i *ipGetter) Get() (ip net.IP, err error) { "https://ipinfo.io/ip", } url := urls[i.randIntn(len(urls))] - content, status, err := i.client.GetContent(url, network.UseRandomUserAgent()) + content, status, err := i.client.Get(ctx, url, network.UseRandomUserAgent()) if err != nil { return nil, err } else if status != http.StatusOK { diff --git a/internal/updater/piav3.go b/internal/updater/piav3.go index c499eda5..b511c92b 100644 --- a/internal/updater/piav3.go +++ b/internal/updater/piav3.go @@ -13,7 +13,7 @@ import ( func (u *updater) updatePIAOld(ctx context.Context) (err error) { const zipURL = "https://www.privateinternetaccess.com/openvpn/openvpn.zip" - contents, err := fetchAndExtractFiles(zipURL) + contents, err := fetchAndExtractFiles(ctx, zipURL) if err != nil { return err } diff --git a/internal/updater/surfshark.go b/internal/updater/surfshark.go index 12315a53..f0922180 100644 --- a/internal/updater/surfshark.go +++ b/internal/updater/surfshark.go @@ -72,7 +72,7 @@ func findSurfsharkServersFromAPI(ctx context.Context, lookupIP lookupIPFunc, htt func findSurfsharkServersFromZip(ctx context.Context, lookupIP lookupIPFunc) (servers []models.SurfsharkServer, warnings []string, err error) { const zipURL = "https://my.surfshark.com/vpn/api/v1/server/configurations" - contents, err := fetchAndExtractFiles(zipURL) + contents, err := fetchAndExtractFiles(ctx, zipURL) if err != nil { return nil, nil, err } diff --git a/internal/updater/vyprvpn.go b/internal/updater/vyprvpn.go index 5231dfeb..9c13b36a 100644 --- a/internal/updater/vyprvpn.go +++ b/internal/updater/vyprvpn.go @@ -25,7 +25,7 @@ func (u *updater) updateVyprvpn(ctx context.Context) (err error) { func findVyprvpnServers(ctx context.Context, lookupIP lookupIPFunc) (servers []models.VyprvpnServer, err error) { const zipURL = "https://support.vyprvpn.com/hc/article_attachments/360052617332/Vypr_OpenVPN_20200320.zip" - contents, err := fetchAndExtractFiles(zipURL) + contents, err := fetchAndExtractFiles(ctx, zipURL) if err != nil { return nil, err } diff --git a/internal/updater/zip.go b/internal/updater/zip.go index 67d7845c..9d81f43c 100644 --- a/internal/updater/zip.go +++ b/internal/updater/zip.go @@ -3,6 +3,7 @@ package updater import ( "archive/zip" "bytes" + "context" "fmt" "io/ioutil" "net/http" @@ -13,11 +14,11 @@ import ( "github.com/qdm12/golibs/network" ) -func fetchAndExtractFiles(urls ...string) (contents map[string][]byte, err error) { +func fetchAndExtractFiles(ctx context.Context, urls ...string) (contents map[string][]byte, err error) { client := network.NewClient(10 * time.Second) contents = make(map[string][]byte) for _, url := range urls { - zipBytes, status, err := client.GetContent(url) + zipBytes, status, err := client.Get(ctx, url) if err != nil { return nil, err } else if status != http.StatusOK {