diff --git a/internal/cli/openvpnconfig.go b/internal/cli/openvpnconfig.go index 5e2ec48b..b2723aff 100644 --- a/internal/cli/openvpnconfig.go +++ b/internal/cli/openvpnconfig.go @@ -2,6 +2,7 @@ package cli import ( "fmt" + "net/http" "strings" "time" @@ -9,6 +10,7 @@ import ( "github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/provider" "github.com/qdm12/gluetun/internal/storage" + "github.com/qdm12/gluetun/internal/updater/unzip" ) type OpenvpnConfigMaker interface { @@ -35,7 +37,13 @@ func (c *CLI) OpenvpnConfig(logger OpenvpnConfigLogger, source sources.Source) e return err } - providerConf := provider.New(*allSettings.VPN.Provider.Name, storage, time.Now) + // Unused by this CLI command + unzipper := (unzip.Unzipper)(nil) + client := (*http.Client)(nil) + warner := (Warner)(nil) + + providerConf := provider.New(*allSettings.VPN.Provider.Name, storage, time.Now, + warner, client, unzipper) connection, err := providerConf.GetConnection(allSettings.VPN.Provider.ServerSelection) if err != nil { return err diff --git a/internal/cli/update.go b/internal/cli/update.go index 977cbcee..d81825a5 100644 --- a/internal/cli/update.go +++ b/internal/cli/update.go @@ -81,8 +81,8 @@ func (c *CLI) Update(ctx context.Context, args []string, logger UpdaterLogger) e return fmt.Errorf("cannot create servers storage: %w", err) } - updater := updater.New(options, httpClient, storage, logger) - err = updater.UpdateServers(ctx) + updater := updater.New(httpClient, storage, logger) + err = updater.UpdateServers(ctx, options.Providers) if err != nil { return fmt.Errorf("cannot update server information: %w", err) } diff --git a/internal/provider/common/updater.go b/internal/provider/common/updater.go index 189eaad6..56bd50fd 100644 --- a/internal/provider/common/updater.go +++ b/internal/provider/common/updater.go @@ -4,11 +4,25 @@ import ( "context" "errors" "net" + + "github.com/qdm12/gluetun/internal/models" ) var ErrNotEnoughServers = errors.New("not enough servers found") +type Fetcher interface { + FetchServers(ctx context.Context, minServers int) (servers []models.Server, err error) +} + type ParallelResolver interface { Resolve(ctx context.Context, hosts []string, minToFind int) ( hostToIPs map[string][]net.IP, warnings []string, err error) } + +type Unzipper interface { + FetchAndExtract(ctx context.Context, url string) (contents map[string][]byte, err error) +} + +type Warner interface { + Warn(s string) +} diff --git a/internal/provider/custom/provider.go b/internal/provider/custom/provider.go index 7acf93d4..c4cc2d20 100644 --- a/internal/provider/custom/provider.go +++ b/internal/provider/custom/provider.go @@ -3,18 +3,21 @@ package custom import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/openvpn/extract" + "github.com/qdm12/gluetun/internal/provider/common" "github.com/qdm12/gluetun/internal/provider/utils" ) type Provider struct { extractor extract.Interface utils.NoPortForwarder + common.Fetcher } func New() *Provider { return &Provider{ extractor: extract.New(), NoPortForwarder: utils.NewNoPortForwarding(providers.Custom), + Fetcher: utils.NewNoFetcher(providers.Custom), } } diff --git a/internal/provider/cyberghost/provider.go b/internal/provider/cyberghost/provider.go index e920b78c..a8d6e90b 100644 --- a/internal/provider/cyberghost/provider.go +++ b/internal/provider/cyberghost/provider.go @@ -5,6 +5,7 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/cyberghost/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,6 +13,7 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } func New(storage common.Storage, randSource rand.Source) *Provider { @@ -19,6 +21,7 @@ func New(storage common.Storage, randSource rand.Source) *Provider { storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Cyberghost), + Fetcher: updater.New(), } } diff --git a/internal/provider/cyberghost/updater/constants.go b/internal/provider/cyberghost/updater/constants.go index 926fb7ee..5f6ecf71 100644 --- a/internal/provider/cyberghost/updater/constants.go +++ b/internal/provider/cyberghost/updater/constants.go @@ -1,4 +1,4 @@ -package cyberghost +package updater import "github.com/qdm12/gluetun/internal/constants" diff --git a/internal/provider/cyberghost/updater/countries.go b/internal/provider/cyberghost/updater/countries.go index 4a770201..0b0263be 100644 --- a/internal/provider/cyberghost/updater/countries.go +++ b/internal/provider/cyberghost/updater/countries.go @@ -1,4 +1,4 @@ -package cyberghost +package updater func mergeCountryCodes(base, extend map[string]string) (merged map[string]string) { merged = make(map[string]string, len(base)) diff --git a/internal/provider/cyberghost/updater/hosttoserver.go b/internal/provider/cyberghost/updater/hosttoserver.go index fe143882..c35c09f8 100644 --- a/internal/provider/cyberghost/updater/hosttoserver.go +++ b/internal/provider/cyberghost/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package cyberghost +package updater import ( "net" diff --git a/internal/provider/cyberghost/updater/resolve.go b/internal/provider/cyberghost/updater/resolve.go index e81616ea..23f496a1 100644 --- a/internal/provider/cyberghost/updater/resolve.go +++ b/internal/provider/cyberghost/updater/resolve.go @@ -1,4 +1,4 @@ -package cyberghost +package updater import ( "time" diff --git a/internal/provider/cyberghost/updater/servers.go b/internal/provider/cyberghost/updater/servers.go index a2922b8f..963da043 100644 --- a/internal/provider/cyberghost/updater/servers.go +++ b/internal/provider/cyberghost/updater/servers.go @@ -1,6 +1,6 @@ -// Package cyberghost contains code to obtain the server information +// Package updater contains code to obtain the server information // for the Cyberghost provider. -package cyberghost +package updater import ( "context" diff --git a/internal/provider/cyberghost/updater/updater.go b/internal/provider/cyberghost/updater/updater.go index fd0b8e51..326513ff 100644 --- a/internal/provider/cyberghost/updater/updater.go +++ b/internal/provider/cyberghost/updater/updater.go @@ -1,4 +1,4 @@ -package cyberghost +package updater import ( "github.com/qdm12/gluetun/internal/provider/common" diff --git a/internal/provider/expressvpn/connection_test.go b/internal/provider/expressvpn/connection_test.go index f04b5f83..eb6bbfa0 100644 --- a/internal/provider/expressvpn/connection_test.go +++ b/internal/provider/expressvpn/connection_test.go @@ -87,7 +87,9 @@ func Test_Provider_GetConnection(t *testing.T) { Return(testCase.filteredServers, testCase.storageErr) randSource := rand.NewSource(0) - provider := New(storage, randSource) + unzipper := (common.Unzipper)(nil) + warner := (common.Warner)(nil) + provider := New(storage, randSource, unzipper, warner) if testCase.panicMessage != "" { assert.PanicsWithValue(t, testCase.panicMessage, func() { diff --git a/internal/provider/expressvpn/provider.go b/internal/provider/expressvpn/provider.go index 3649f417..c483e19b 100644 --- a/internal/provider/expressvpn/provider.go +++ b/internal/provider/expressvpn/provider.go @@ -5,6 +5,7 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/expressvpn/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +13,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + unzipper common.Unzipper, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Expressvpn), + Fetcher: updater.New(unzipper, updaterWarner), } } diff --git a/internal/provider/expressvpn/updater/hardcoded.go b/internal/provider/expressvpn/updater/hardcoded.go index fbbb300e..f3b8cdab 100644 --- a/internal/provider/expressvpn/updater/hardcoded.go +++ b/internal/provider/expressvpn/updater/hardcoded.go @@ -1,4 +1,4 @@ -package expressvpn +package updater import ( "github.com/qdm12/gluetun/internal/models" diff --git a/internal/provider/expressvpn/updater/resolve.go b/internal/provider/expressvpn/updater/resolve.go index 358b9b5d..c38ed35a 100644 --- a/internal/provider/expressvpn/updater/resolve.go +++ b/internal/provider/expressvpn/updater/resolve.go @@ -1,4 +1,4 @@ -package expressvpn +package updater import ( "time" diff --git a/internal/provider/expressvpn/updater/servers.go b/internal/provider/expressvpn/updater/servers.go index 2c4f5eac..dec25cbf 100644 --- a/internal/provider/expressvpn/updater/servers.go +++ b/internal/provider/expressvpn/updater/servers.go @@ -1,6 +1,6 @@ -// package expressvpn contains code to obtain the server information +// Package updater contains code to obtain the server information // for the ExpressVPN provider. -package expressvpn +package updater import ( "context" diff --git a/internal/provider/expressvpn/updater/updater.go b/internal/provider/expressvpn/updater/updater.go index 9021f7d3..3fff5dc8 100644 --- a/internal/provider/expressvpn/updater/updater.go +++ b/internal/provider/expressvpn/updater/updater.go @@ -1,4 +1,4 @@ -package expressvpn +package updater import ( "github.com/qdm12/gluetun/internal/provider/common" diff --git a/internal/provider/fastestvpn/provider.go b/internal/provider/fastestvpn/provider.go index f8858a31..eb695827 100644 --- a/internal/provider/fastestvpn/provider.go +++ b/internal/provider/fastestvpn/provider.go @@ -5,6 +5,7 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/fastestvpn/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +13,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + unzipper common.Unzipper, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Fastestvpn), + Fetcher: updater.New(unzipper, updaterWarner), } } diff --git a/internal/provider/fastestvpn/updater/filename.go b/internal/provider/fastestvpn/updater/filename.go index 26abb31f..ab22dcd7 100644 --- a/internal/provider/fastestvpn/updater/filename.go +++ b/internal/provider/fastestvpn/updater/filename.go @@ -1,4 +1,4 @@ -package fastestvpn +package updater import ( "errors" diff --git a/internal/provider/fastestvpn/updater/hosttoserver.go b/internal/provider/fastestvpn/updater/hosttoserver.go index 3ba8d25e..b169294c 100644 --- a/internal/provider/fastestvpn/updater/hosttoserver.go +++ b/internal/provider/fastestvpn/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package fastestvpn +package updater import ( "net" diff --git a/internal/provider/fastestvpn/updater/resolve.go b/internal/provider/fastestvpn/updater/resolve.go index 34b56ad7..c38ed35a 100644 --- a/internal/provider/fastestvpn/updater/resolve.go +++ b/internal/provider/fastestvpn/updater/resolve.go @@ -1,4 +1,4 @@ -package fastestvpn +package updater import ( "time" diff --git a/internal/provider/fastestvpn/updater/servers.go b/internal/provider/fastestvpn/updater/servers.go index 4100b599..6b87c055 100644 --- a/internal/provider/fastestvpn/updater/servers.go +++ b/internal/provider/fastestvpn/updater/servers.go @@ -1,6 +1,6 @@ -// Package fastestvpn contains code to obtain the server information +// Package updater contains code to obtain the server information // for the FastestVPN provider. -package fastestvpn +package updater import ( "context" diff --git a/internal/provider/fastestvpn/updater/updater.go b/internal/provider/fastestvpn/updater/updater.go index 34ce9459..3fff5dc8 100644 --- a/internal/provider/fastestvpn/updater/updater.go +++ b/internal/provider/fastestvpn/updater/updater.go @@ -1,4 +1,4 @@ -package fastestvpn +package updater import ( "github.com/qdm12/gluetun/internal/provider/common" diff --git a/internal/provider/hidemyass/provider.go b/internal/provider/hidemyass/provider.go index c39d8836..9006cdf9 100644 --- a/internal/provider/hidemyass/provider.go +++ b/internal/provider/hidemyass/provider.go @@ -2,9 +2,11 @@ package hidemyass import ( "math/rand" + "net/http" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/hidemyass/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +14,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + client *http.Client, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.HideMyAss), + Fetcher: updater.New(client, updaterWarner), } } diff --git a/internal/provider/hidemyass/updater/hosts.go b/internal/provider/hidemyass/updater/hosts.go index 07856f8e..4591b083 100644 --- a/internal/provider/hidemyass/updater/hosts.go +++ b/internal/provider/hidemyass/updater/hosts.go @@ -1,4 +1,4 @@ -package hidemyass +package updater func getUniqueHosts(tcpHostToURL, udpHostToURL map[string]string) ( hosts []string) { diff --git a/internal/provider/hidemyass/updater/hosttourl.go b/internal/provider/hidemyass/updater/hosttourl.go index 0b10440f..0588f41f 100644 --- a/internal/provider/hidemyass/updater/hosttourl.go +++ b/internal/provider/hidemyass/updater/hosttourl.go @@ -1,4 +1,4 @@ -package hidemyass +package updater import ( "context" diff --git a/internal/provider/hidemyass/updater/index.go b/internal/provider/hidemyass/updater/index.go index efa998d1..88950286 100644 --- a/internal/provider/hidemyass/updater/index.go +++ b/internal/provider/hidemyass/updater/index.go @@ -1,4 +1,4 @@ -package hidemyass +package updater import ( "context" diff --git a/internal/provider/hidemyass/updater/resolve.go b/internal/provider/hidemyass/updater/resolve.go index 79f44acc..9a95d22e 100644 --- a/internal/provider/hidemyass/updater/resolve.go +++ b/internal/provider/hidemyass/updater/resolve.go @@ -1,4 +1,4 @@ -package hidemyass +package updater import ( "time" diff --git a/internal/provider/hidemyass/updater/servers.go b/internal/provider/hidemyass/updater/servers.go index 78e94268..e80a29f2 100644 --- a/internal/provider/hidemyass/updater/servers.go +++ b/internal/provider/hidemyass/updater/servers.go @@ -1,6 +1,6 @@ -// Package hidemyass contains code to obtain the server information +// Package updater contains code to obtain the server information // for the HideMyAss provider. -package hidemyass +package updater import ( "context" diff --git a/internal/provider/hidemyass/updater/updater.go b/internal/provider/hidemyass/updater/updater.go index 40d532f5..ea12152e 100644 --- a/internal/provider/hidemyass/updater/updater.go +++ b/internal/provider/hidemyass/updater/updater.go @@ -1,4 +1,4 @@ -package hidemyass +package updater import ( "net/http" diff --git a/internal/provider/hidemyass/updater/url.go b/internal/provider/hidemyass/updater/url.go index 18f070ec..0c0dd866 100644 --- a/internal/provider/hidemyass/updater/url.go +++ b/internal/provider/hidemyass/updater/url.go @@ -1,4 +1,4 @@ -package hidemyass +package updater import ( "strings" diff --git a/internal/provider/ipvanish/provider.go b/internal/provider/ipvanish/provider.go index 9c5d9860..1ecef7cf 100644 --- a/internal/provider/ipvanish/provider.go +++ b/internal/provider/ipvanish/provider.go @@ -5,6 +5,7 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/ipvanish/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +13,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + unzipper common.Unzipper, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Ipvanish), + Fetcher: updater.New(unzipper, updaterWarner), } } diff --git a/internal/provider/ipvanish/updater/filename.go b/internal/provider/ipvanish/updater/filename.go index f87541b9..fde6e6d6 100644 --- a/internal/provider/ipvanish/updater/filename.go +++ b/internal/provider/ipvanish/updater/filename.go @@ -1,4 +1,4 @@ -package ipvanish +package updater import ( "errors" diff --git a/internal/provider/ipvanish/updater/filename_test.go b/internal/provider/ipvanish/updater/filename_test.go index be366cb4..41128264 100644 --- a/internal/provider/ipvanish/updater/filename_test.go +++ b/internal/provider/ipvanish/updater/filename_test.go @@ -1,4 +1,4 @@ -package ipvanish +package updater import ( "errors" diff --git a/internal/provider/ipvanish/updater/hosttoserver.go b/internal/provider/ipvanish/updater/hosttoserver.go index f815e350..92f6e261 100644 --- a/internal/provider/ipvanish/updater/hosttoserver.go +++ b/internal/provider/ipvanish/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package ipvanish +package updater import ( "net" diff --git a/internal/provider/ipvanish/updater/hosttoserver_test.go b/internal/provider/ipvanish/updater/hosttoserver_test.go index 64e93702..8c400a15 100644 --- a/internal/provider/ipvanish/updater/hosttoserver_test.go +++ b/internal/provider/ipvanish/updater/hosttoserver_test.go @@ -1,4 +1,4 @@ -package ipvanish +package updater import ( "net" diff --git a/internal/provider/ipvanish/updater/mocks_generate_test.go b/internal/provider/ipvanish/updater/mocks_generate_test.go index 1c03396d..d9fd61dc 100644 --- a/internal/provider/ipvanish/updater/mocks_generate_test.go +++ b/internal/provider/ipvanish/updater/mocks_generate_test.go @@ -1,3 +1,3 @@ -package ipvanish +package updater //go:generate mockgen -destination=mocks_test.go -package $GOPACKAGE . Warner diff --git a/internal/provider/ipvanish/updater/mocks_test.go b/internal/provider/ipvanish/updater/mocks_test.go index 8ae9d058..5abefc28 100644 --- a/internal/provider/ipvanish/updater/mocks_test.go +++ b/internal/provider/ipvanish/updater/mocks_test.go @@ -2,7 +2,7 @@ // Source: github.com/qdm12/gluetun/internal/provider/ipvanish/updater (interfaces: Warner) // Package ipvanish is a generated GoMock package. -package ipvanish +package updater import ( reflect "reflect" diff --git a/internal/provider/ipvanish/updater/resolve.go b/internal/provider/ipvanish/updater/resolve.go index 2d28f9c9..c01e93b3 100644 --- a/internal/provider/ipvanish/updater/resolve.go +++ b/internal/provider/ipvanish/updater/resolve.go @@ -1,4 +1,4 @@ -package ipvanish +package updater import ( "time" diff --git a/internal/provider/ipvanish/updater/servers.go b/internal/provider/ipvanish/updater/servers.go index 24590ece..168e3803 100644 --- a/internal/provider/ipvanish/updater/servers.go +++ b/internal/provider/ipvanish/updater/servers.go @@ -1,6 +1,6 @@ -// Package ipvanish contains code to obtain the server information +// Package updater contains code to obtain the server information // for the Surshark provider. -package ipvanish +package updater import ( "context" diff --git a/internal/provider/ipvanish/updater/servers_test.go b/internal/provider/ipvanish/updater/servers_test.go index 0c55faaa..b23db9a5 100644 --- a/internal/provider/ipvanish/updater/servers_test.go +++ b/internal/provider/ipvanish/updater/servers_test.go @@ -1,4 +1,4 @@ -package ipvanish +package updater import ( "context" diff --git a/internal/provider/ipvanish/updater/updater.go b/internal/provider/ipvanish/updater/updater.go index 99c3fc14..97b0c342 100644 --- a/internal/provider/ipvanish/updater/updater.go +++ b/internal/provider/ipvanish/updater/updater.go @@ -1,4 +1,4 @@ -package ipvanish +package updater import ( "github.com/qdm12/gluetun/internal/provider/common" diff --git a/internal/provider/ivpn/connection_test.go b/internal/provider/ivpn/connection_test.go index a89d2fc5..a9d2ad31 100644 --- a/internal/provider/ivpn/connection_test.go +++ b/internal/provider/ivpn/connection_test.go @@ -4,6 +4,7 @@ import ( "errors" "math/rand" "net" + "net/http" "testing" "github.com/golang/mock/gomock" @@ -96,7 +97,9 @@ func Test_Provider_GetConnection(t *testing.T) { Return(testCase.filteredServers, testCase.storageErr) randSource := rand.NewSource(0) - provider := New(storage, randSource) + client := (*http.Client)(nil) + warner := (common.Warner)(nil) + provider := New(storage, randSource, client, warner) connection, err := provider.GetConnection(testCase.selection) diff --git a/internal/provider/ivpn/provider.go b/internal/provider/ivpn/provider.go index 1d8de558..5e59195a 100644 --- a/internal/provider/ivpn/provider.go +++ b/internal/provider/ivpn/provider.go @@ -2,9 +2,11 @@ package ivpn import ( "math/rand" + "net/http" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/ivpn/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +14,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + client *http.Client, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Ivpn), + Fetcher: updater.New(client, updaterWarner), } } diff --git a/internal/provider/ivpn/updater/api.go b/internal/provider/ivpn/updater/api.go index 55540135..1a61e45b 100644 --- a/internal/provider/ivpn/updater/api.go +++ b/internal/provider/ivpn/updater/api.go @@ -1,4 +1,4 @@ -package ivpn +package updater import ( "context" diff --git a/internal/provider/ivpn/updater/api_test.go b/internal/provider/ivpn/updater/api_test.go index 8e99cbf1..48b5dc98 100644 --- a/internal/provider/ivpn/updater/api_test.go +++ b/internal/provider/ivpn/updater/api_test.go @@ -1,4 +1,4 @@ -package ivpn +package updater import ( "context" diff --git a/internal/provider/ivpn/updater/mocks_generate_test.go b/internal/provider/ivpn/updater/mocks_generate_test.go index c6e92d88..d9fd61dc 100644 --- a/internal/provider/ivpn/updater/mocks_generate_test.go +++ b/internal/provider/ivpn/updater/mocks_generate_test.go @@ -1,3 +1,3 @@ -package ivpn +package updater //go:generate mockgen -destination=mocks_test.go -package $GOPACKAGE . Warner diff --git a/internal/provider/ivpn/updater/mocks_test.go b/internal/provider/ivpn/updater/mocks_test.go index 350f76d6..dfc5b8a0 100644 --- a/internal/provider/ivpn/updater/mocks_test.go +++ b/internal/provider/ivpn/updater/mocks_test.go @@ -2,7 +2,7 @@ // Source: github.com/qdm12/gluetun/internal/provider/ivpn/updater (interfaces: Warner) // Package ivpn is a generated GoMock package. -package ivpn +package updater import ( reflect "reflect" diff --git a/internal/provider/ivpn/updater/resolve.go b/internal/provider/ivpn/updater/resolve.go index 9fd0782f..c01e93b3 100644 --- a/internal/provider/ivpn/updater/resolve.go +++ b/internal/provider/ivpn/updater/resolve.go @@ -1,4 +1,4 @@ -package ivpn +package updater import ( "time" diff --git a/internal/provider/ivpn/updater/roundtrip_test.go b/internal/provider/ivpn/updater/roundtrip_test.go index f8ee5d95..9df23788 100644 --- a/internal/provider/ivpn/updater/roundtrip_test.go +++ b/internal/provider/ivpn/updater/roundtrip_test.go @@ -1,4 +1,4 @@ -package ivpn +package updater import "net/http" diff --git a/internal/provider/ivpn/updater/servers.go b/internal/provider/ivpn/updater/servers.go index 6a725454..5e523c3e 100644 --- a/internal/provider/ivpn/updater/servers.go +++ b/internal/provider/ivpn/updater/servers.go @@ -1,6 +1,6 @@ -// Package ivpn contains code to obtain the server information +// Package updater contains code to obtain the server information // for the Surshark provider. -package ivpn +package updater import ( "context" diff --git a/internal/provider/ivpn/updater/servers_test.go b/internal/provider/ivpn/updater/servers_test.go index 1ceff9f5..f2520de7 100644 --- a/internal/provider/ivpn/updater/servers_test.go +++ b/internal/provider/ivpn/updater/servers_test.go @@ -1,4 +1,4 @@ -package ivpn +package updater import ( "context" diff --git a/internal/provider/ivpn/updater/updater.go b/internal/provider/ivpn/updater/updater.go index f13ef476..ea12152e 100644 --- a/internal/provider/ivpn/updater/updater.go +++ b/internal/provider/ivpn/updater/updater.go @@ -1,4 +1,4 @@ -package ivpn +package updater import ( "net/http" diff --git a/internal/provider/mullvad/connection_test.go b/internal/provider/mullvad/connection_test.go index c70561db..93cb6c61 100644 --- a/internal/provider/mullvad/connection_test.go +++ b/internal/provider/mullvad/connection_test.go @@ -4,6 +4,7 @@ import ( "errors" "math/rand" "net" + "net/http" "testing" "github.com/golang/mock/gomock" @@ -96,7 +97,8 @@ func Test_Provider_GetConnection(t *testing.T) { Return(testCase.filteredServers, testCase.storageErr) randSource := rand.NewSource(0) - provider := New(storage, randSource) + client := (*http.Client)(nil) + provider := New(storage, randSource, client) connection, err := provider.GetConnection(testCase.selection) diff --git a/internal/provider/mullvad/provider.go b/internal/provider/mullvad/provider.go index e8264bb6..154593c3 100644 --- a/internal/provider/mullvad/provider.go +++ b/internal/provider/mullvad/provider.go @@ -2,9 +2,11 @@ package mullvad import ( "math/rand" + "net/http" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/mullvad/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +14,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + client *http.Client) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Mullvad), + Fetcher: updater.New(client), } } diff --git a/internal/provider/mullvad/updater/api.go b/internal/provider/mullvad/updater/api.go index f9825e57..b12fc42e 100644 --- a/internal/provider/mullvad/updater/api.go +++ b/internal/provider/mullvad/updater/api.go @@ -1,4 +1,4 @@ -package mullvad +package updater import ( "context" diff --git a/internal/provider/mullvad/updater/hosttoserver.go b/internal/provider/mullvad/updater/hosttoserver.go index 7df2af33..7c05f1c9 100644 --- a/internal/provider/mullvad/updater/hosttoserver.go +++ b/internal/provider/mullvad/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package mullvad +package updater import ( "errors" diff --git a/internal/provider/mullvad/updater/ips.go b/internal/provider/mullvad/updater/ips.go index 651b5b4d..f591e17a 100644 --- a/internal/provider/mullvad/updater/ips.go +++ b/internal/provider/mullvad/updater/ips.go @@ -1,4 +1,4 @@ -package mullvad +package updater import ( "bytes" diff --git a/internal/provider/mullvad/updater/ips_test.go b/internal/provider/mullvad/updater/ips_test.go index 18a35735..b2ea1051 100644 --- a/internal/provider/mullvad/updater/ips_test.go +++ b/internal/provider/mullvad/updater/ips_test.go @@ -1,4 +1,4 @@ -package mullvad +package updater import ( "net" diff --git a/internal/provider/mullvad/updater/servers.go b/internal/provider/mullvad/updater/servers.go index 4eb46d9c..9c5ea225 100644 --- a/internal/provider/mullvad/updater/servers.go +++ b/internal/provider/mullvad/updater/servers.go @@ -1,6 +1,6 @@ -// Package mullvad contains code to obtain the server information +// Package updater contains code to obtain the server information // for the Mullvad provider. -package mullvad +package updater import ( "context" diff --git a/internal/provider/mullvad/updater/updater.go b/internal/provider/mullvad/updater/updater.go index 7b4ef630..a987c0fd 100644 --- a/internal/provider/mullvad/updater/updater.go +++ b/internal/provider/mullvad/updater/updater.go @@ -1,4 +1,4 @@ -package mullvad +package updater import ( "net/http" diff --git a/internal/provider/nordvpn/provider.go b/internal/provider/nordvpn/provider.go index 07d94a58..f8ffa262 100644 --- a/internal/provider/nordvpn/provider.go +++ b/internal/provider/nordvpn/provider.go @@ -2,9 +2,11 @@ package nordvpn import ( "math/rand" + "net/http" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/nordvpn/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +14,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + client *http.Client, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Nordvpn), + Fetcher: updater.New(client, updaterWarner), } } diff --git a/internal/provider/nordvpn/updater/api.go b/internal/provider/nordvpn/updater/api.go index 3b5df5ab..dd70780c 100644 --- a/internal/provider/nordvpn/updater/api.go +++ b/internal/provider/nordvpn/updater/api.go @@ -1,4 +1,4 @@ -package nordvpn +package updater import ( "context" diff --git a/internal/provider/nordvpn/updater/ip.go b/internal/provider/nordvpn/updater/ip.go index fcc6cff1..76a404ae 100644 --- a/internal/provider/nordvpn/updater/ip.go +++ b/internal/provider/nordvpn/updater/ip.go @@ -1,4 +1,4 @@ -package nordvpn +package updater import ( "fmt" diff --git a/internal/provider/nordvpn/updater/name.go b/internal/provider/nordvpn/updater/name.go index b00656c3..bb817798 100644 --- a/internal/provider/nordvpn/updater/name.go +++ b/internal/provider/nordvpn/updater/name.go @@ -1,4 +1,4 @@ -package nordvpn +package updater import ( "errors" diff --git a/internal/provider/nordvpn/updater/servers.go b/internal/provider/nordvpn/updater/servers.go index 3769d147..915527ba 100644 --- a/internal/provider/nordvpn/updater/servers.go +++ b/internal/provider/nordvpn/updater/servers.go @@ -1,6 +1,6 @@ -// Package nordvpn contains code to obtain the server information +// Package updater contains code to obtain the server information // for the NordVPN provider. -package nordvpn +package updater import ( "context" diff --git a/internal/provider/nordvpn/updater/updater.go b/internal/provider/nordvpn/updater/updater.go index d0e928ae..89f66afe 100644 --- a/internal/provider/nordvpn/updater/updater.go +++ b/internal/provider/nordvpn/updater/updater.go @@ -1,4 +1,4 @@ -package nordvpn +package updater import ( "net/http" diff --git a/internal/provider/perfectprivacy/provider.go b/internal/provider/perfectprivacy/provider.go index 4e8e0402..9b9f6e52 100644 --- a/internal/provider/perfectprivacy/provider.go +++ b/internal/provider/perfectprivacy/provider.go @@ -5,6 +5,7 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/perfectprivacy/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +13,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + unzipper common.Unzipper, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Perfectprivacy), + Fetcher: updater.New(unzipper, updaterWarner), } } diff --git a/internal/provider/perfectprivacy/updater/citytoserver.go b/internal/provider/perfectprivacy/updater/citytoserver.go index 8e93d22d..5605d55c 100644 --- a/internal/provider/perfectprivacy/updater/citytoserver.go +++ b/internal/provider/perfectprivacy/updater/citytoserver.go @@ -1,4 +1,4 @@ -package perfectprivacy +package updater import ( "net" diff --git a/internal/provider/perfectprivacy/updater/filename.go b/internal/provider/perfectprivacy/updater/filename.go index 7378ac9d..6b379392 100644 --- a/internal/provider/perfectprivacy/updater/filename.go +++ b/internal/provider/perfectprivacy/updater/filename.go @@ -1,4 +1,4 @@ -package perfectprivacy +package updater import ( "strings" diff --git a/internal/provider/perfectprivacy/updater/servers.go b/internal/provider/perfectprivacy/updater/servers.go index 26d71a55..161f7d6e 100644 --- a/internal/provider/perfectprivacy/updater/servers.go +++ b/internal/provider/perfectprivacy/updater/servers.go @@ -1,4 +1,4 @@ -package perfectprivacy +package updater import ( "context" diff --git a/internal/provider/perfectprivacy/updater/updater.go b/internal/provider/perfectprivacy/updater/updater.go index 78546fcf..bfaa903d 100644 --- a/internal/provider/perfectprivacy/updater/updater.go +++ b/internal/provider/perfectprivacy/updater/updater.go @@ -1,4 +1,4 @@ -package perfectprivacy +package updater import "github.com/qdm12/gluetun/internal/updater/unzip" diff --git a/internal/provider/privado/provider.go b/internal/provider/privado/provider.go index e8ec60a2..e17f8d4e 100644 --- a/internal/provider/privado/provider.go +++ b/internal/provider/privado/provider.go @@ -2,9 +2,11 @@ package privado import ( "math/rand" + "net/http" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/privado/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +14,17 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + client *http.Client, unzipper common.Unzipper, + updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Privado), + Fetcher: updater.New(client, unzipper, updaterWarner), } } diff --git a/internal/provider/privado/updater/hosttoserver.go b/internal/provider/privado/updater/hosttoserver.go index ef9f6a02..9c3a87d7 100644 --- a/internal/provider/privado/updater/hosttoserver.go +++ b/internal/provider/privado/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package privado +package updater import ( "net" diff --git a/internal/provider/privado/updater/location.go b/internal/provider/privado/updater/location.go index bc29394f..50a56428 100644 --- a/internal/provider/privado/updater/location.go +++ b/internal/provider/privado/updater/location.go @@ -1,4 +1,4 @@ -package privado +package updater import ( "context" diff --git a/internal/provider/privado/updater/resolve.go b/internal/provider/privado/updater/resolve.go index 0a25a96b..1c921cfc 100644 --- a/internal/provider/privado/updater/resolve.go +++ b/internal/provider/privado/updater/resolve.go @@ -1,4 +1,4 @@ -package privado +package updater import ( "time" diff --git a/internal/provider/privado/updater/servers.go b/internal/provider/privado/updater/servers.go index 9a13e891..6e1435bd 100644 --- a/internal/provider/privado/updater/servers.go +++ b/internal/provider/privado/updater/servers.go @@ -1,6 +1,6 @@ -// Package privado contains code to obtain the server information +// Package updater contains code to obtain the server information // for the Privado provider. -package privado +package updater import ( "context" diff --git a/internal/provider/privado/updater/updater.go b/internal/provider/privado/updater/updater.go index f13cb931..37d0e74a 100644 --- a/internal/provider/privado/updater/updater.go +++ b/internal/provider/privado/updater/updater.go @@ -1,4 +1,4 @@ -package privado +package updater import ( "net/http" diff --git a/internal/provider/privateinternetaccess/provider.go b/internal/provider/privateinternetaccess/provider.go index 09ff458f..c1183501 100644 --- a/internal/provider/privateinternetaccess/provider.go +++ b/internal/provider/privateinternetaccess/provider.go @@ -2,24 +2,27 @@ package privateinternetaccess import ( "math/rand" + "net/http" "time" "github.com/qdm12/gluetun/internal/constants/openvpn" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/privateinternetaccess/updater" ) type Provider struct { storage common.Storage randSource rand.Source timeNow func() time.Time + common.Fetcher // Port forwarding portForwardPath string authFilePath string } func New(storage common.Storage, randSource rand.Source, - timeNow func() time.Time) *Provider { + timeNow func() time.Time, client *http.Client) *Provider { const jsonPortForwardPath = "/gluetun/piaportforward.json" return &Provider{ storage: storage, @@ -27,6 +30,7 @@ func New(storage common.Storage, randSource rand.Source, randSource: randSource, portForwardPath: jsonPortForwardPath, authFilePath: openvpn.AuthConf, + Fetcher: updater.New(client), } } diff --git a/internal/provider/privateinternetaccess/updater/api.go b/internal/provider/privateinternetaccess/updater/api.go index 64587da7..9048f432 100644 --- a/internal/provider/privateinternetaccess/updater/api.go +++ b/internal/provider/privateinternetaccess/updater/api.go @@ -1,4 +1,4 @@ -package privateinternetaccess +package updater import ( "bytes" diff --git a/internal/provider/privateinternetaccess/updater/hosttoserver.go b/internal/provider/privateinternetaccess/updater/hosttoserver.go index f5d120a1..c17f2a54 100644 --- a/internal/provider/privateinternetaccess/updater/hosttoserver.go +++ b/internal/provider/privateinternetaccess/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package privateinternetaccess +package updater import ( "net" diff --git a/internal/provider/privateinternetaccess/updater/servers.go b/internal/provider/privateinternetaccess/updater/servers.go index 4d632bb4..69034d21 100644 --- a/internal/provider/privateinternetaccess/updater/servers.go +++ b/internal/provider/privateinternetaccess/updater/servers.go @@ -1,6 +1,6 @@ -// Package pia contains code to obtain the server information +// Package updater contains code to obtain the server information // for the Private Internet Access provider. -package privateinternetaccess +package updater import ( "context" diff --git a/internal/provider/privateinternetaccess/updater/updater.go b/internal/provider/privateinternetaccess/updater/updater.go index 53bb2ca2..44b49db9 100644 --- a/internal/provider/privateinternetaccess/updater/updater.go +++ b/internal/provider/privateinternetaccess/updater/updater.go @@ -1,4 +1,4 @@ -package privateinternetaccess +package updater import ( "net/http" diff --git a/internal/provider/privatevpn/provider.go b/internal/provider/privatevpn/provider.go index 8998b88b..67e0d2a9 100644 --- a/internal/provider/privatevpn/provider.go +++ b/internal/provider/privatevpn/provider.go @@ -5,6 +5,7 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/privatevpn/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +13,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + unzipper common.Unzipper, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Privatevpn), + Fetcher: updater.New(unzipper, updaterWarner), } } diff --git a/internal/provider/privatevpn/updater/countries.go b/internal/provider/privatevpn/updater/countries.go index ba9f6b3f..70393056 100644 --- a/internal/provider/privatevpn/updater/countries.go +++ b/internal/provider/privatevpn/updater/countries.go @@ -1,4 +1,4 @@ -package privatevpn +package updater import "strings" diff --git a/internal/provider/privatevpn/updater/filename.go b/internal/provider/privatevpn/updater/filename.go index e1ccec76..2085d3f6 100644 --- a/internal/provider/privatevpn/updater/filename.go +++ b/internal/provider/privatevpn/updater/filename.go @@ -1,4 +1,4 @@ -package privatevpn +package updater import ( "errors" diff --git a/internal/provider/privatevpn/updater/hosttoserver.go b/internal/provider/privatevpn/updater/hosttoserver.go index c295bae8..77168061 100644 --- a/internal/provider/privatevpn/updater/hosttoserver.go +++ b/internal/provider/privatevpn/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package privatevpn +package updater import ( "net" diff --git a/internal/provider/privatevpn/updater/resolve.go b/internal/provider/privatevpn/updater/resolve.go index 749395af..c0112af5 100644 --- a/internal/provider/privatevpn/updater/resolve.go +++ b/internal/provider/privatevpn/updater/resolve.go @@ -1,4 +1,4 @@ -package privatevpn +package updater import ( "time" diff --git a/internal/provider/privatevpn/updater/servers.go b/internal/provider/privatevpn/updater/servers.go index 99428073..159aa21c 100644 --- a/internal/provider/privatevpn/updater/servers.go +++ b/internal/provider/privatevpn/updater/servers.go @@ -1,6 +1,6 @@ -// Package privatevpn contains code to obtain the server information +// Package updater contains code to obtain the server information // for the PrivateVPN provider. -package privatevpn +package updater import ( "context" diff --git a/internal/provider/privatevpn/updater/updater.go b/internal/provider/privatevpn/updater/updater.go index 598909b4..3fff5dc8 100644 --- a/internal/provider/privatevpn/updater/updater.go +++ b/internal/provider/privatevpn/updater/updater.go @@ -1,4 +1,4 @@ -package privatevpn +package updater import ( "github.com/qdm12/gluetun/internal/provider/common" diff --git a/internal/provider/protonvpn/provider.go b/internal/provider/protonvpn/provider.go index 4b21cc06..f5b9e706 100644 --- a/internal/provider/protonvpn/provider.go +++ b/internal/provider/protonvpn/provider.go @@ -2,9 +2,11 @@ package protonvpn import ( "math/rand" + "net/http" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/protonvpn/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +14,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + client *http.Client, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Protonvpn), + Fetcher: updater.New(client, updaterWarner), } } diff --git a/internal/provider/protonvpn/updater/api.go b/internal/provider/protonvpn/updater/api.go index ccfae25e..d0f64b5c 100644 --- a/internal/provider/protonvpn/updater/api.go +++ b/internal/provider/protonvpn/updater/api.go @@ -1,4 +1,4 @@ -package protonvpn +package updater import ( "context" diff --git a/internal/provider/protonvpn/updater/countries.go b/internal/provider/protonvpn/updater/countries.go index accc0c90..70393056 100644 --- a/internal/provider/protonvpn/updater/countries.go +++ b/internal/provider/protonvpn/updater/countries.go @@ -1,4 +1,4 @@ -package protonvpn +package updater import "strings" diff --git a/internal/provider/protonvpn/updater/iptoserver.go b/internal/provider/protonvpn/updater/iptoserver.go index 946fc722..4157e6bb 100644 --- a/internal/provider/protonvpn/updater/iptoserver.go +++ b/internal/provider/protonvpn/updater/iptoserver.go @@ -1,4 +1,4 @@ -package protonvpn +package updater import ( "net" diff --git a/internal/provider/protonvpn/updater/servers.go b/internal/provider/protonvpn/updater/servers.go index 37e50d9a..35f21ae4 100644 --- a/internal/provider/protonvpn/updater/servers.go +++ b/internal/provider/protonvpn/updater/servers.go @@ -1,6 +1,6 @@ -// Package protonvpn contains code to obtain the server information +// Package updater contains code to obtain the server information // for the ProtonVPN provider. -package protonvpn +package updater import ( "context" diff --git a/internal/provider/protonvpn/updater/updater.go b/internal/provider/protonvpn/updater/updater.go index d9a1a08a..f46ecfb5 100644 --- a/internal/provider/protonvpn/updater/updater.go +++ b/internal/provider/protonvpn/updater/updater.go @@ -1,4 +1,4 @@ -package protonvpn +package updater import ( "net/http" diff --git a/internal/provider/provider.go b/internal/provider/provider.go index 263ae3d2..51c0808c 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -11,6 +11,7 @@ import ( "github.com/qdm12/gluetun/internal/configuration/settings" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/models" + "github.com/qdm12/gluetun/internal/provider/common" "github.com/qdm12/gluetun/internal/provider/custom" "github.com/qdm12/gluetun/internal/provider/cyberghost" "github.com/qdm12/gluetun/internal/provider/expressvpn" @@ -41,6 +42,8 @@ type Provider interface { OpenVPNConfig(connection models.Connection, settings settings.OpenVPN) (lines []string) Name() string PortForwarder + FetchServers(ctx context.Context, minServers int) ( + servers []models.Server, err error) } type PortForwarder interface { @@ -57,7 +60,8 @@ type Storage interface { GetServerByName(provider, name string) (server models.Server, ok bool) } -func New(provider string, storage Storage, timeNow func() time.Time) Provider { +func New(provider string, storage Storage, timeNow func() time.Time, + updaterWarner common.Warner, client *http.Client, unzipper common.Unzipper) Provider { randSource := rand.NewSource(timeNow().UnixNano()) switch provider { case providers.Custom: @@ -65,43 +69,43 @@ func New(provider string, storage Storage, timeNow func() time.Time) Provider { case providers.Cyberghost: return cyberghost.New(storage, randSource) case providers.Expressvpn: - return expressvpn.New(storage, randSource) + return expressvpn.New(storage, randSource, unzipper, updaterWarner) case providers.Fastestvpn: - return fastestvpn.New(storage, randSource) + return fastestvpn.New(storage, randSource, unzipper, updaterWarner) case providers.HideMyAss: - return hidemyass.New(storage, randSource) + return hidemyass.New(storage, randSource, client, updaterWarner) case providers.Ipvanish: - return ipvanish.New(storage, randSource) + return ipvanish.New(storage, randSource, unzipper, updaterWarner) case providers.Ivpn: - return ivpn.New(storage, randSource) + return ivpn.New(storage, randSource, client, updaterWarner) case providers.Mullvad: - return mullvad.New(storage, randSource) + return mullvad.New(storage, randSource, client) case providers.Nordvpn: - return nordvpn.New(storage, randSource) + return nordvpn.New(storage, randSource, client, updaterWarner) case providers.Perfectprivacy: - return perfectprivacy.New(storage, randSource) + return perfectprivacy.New(storage, randSource, unzipper, updaterWarner) case providers.Privado: - return privado.New(storage, randSource) + return privado.New(storage, randSource, client, unzipper, updaterWarner) case providers.PrivateInternetAccess: - return privateinternetaccess.New(storage, randSource, timeNow) + return privateinternetaccess.New(storage, randSource, timeNow, client) case providers.Privatevpn: - return privatevpn.New(storage, randSource) + return privatevpn.New(storage, randSource, unzipper, updaterWarner) case providers.Protonvpn: - return protonvpn.New(storage, randSource) + return protonvpn.New(storage, randSource, client, updaterWarner) case providers.Purevpn: - return purevpn.New(storage, randSource) + return purevpn.New(storage, randSource, client, unzipper, updaterWarner) case providers.Surfshark: - return surfshark.New(storage, randSource) + return surfshark.New(storage, randSource, client, unzipper, updaterWarner) case providers.Torguard: - return torguard.New(storage, randSource) + return torguard.New(storage, randSource, unzipper, updaterWarner) case providers.VPNUnlimited: - return vpnunlimited.New(storage, randSource) + return vpnunlimited.New(storage, randSource, unzipper, updaterWarner) case providers.Vyprvpn: - return vyprvpn.New(storage, randSource) + return vyprvpn.New(storage, randSource, unzipper, updaterWarner) case providers.Wevpn: - return wevpn.New(storage, randSource) + return wevpn.New(storage, randSource, updaterWarner) case providers.Windscribe: - return windscribe.New(storage, randSource) + return windscribe.New(storage, randSource, client, updaterWarner) default: panic("provider " + provider + " is unknown") // should never occur } diff --git a/internal/provider/purevpn/provider.go b/internal/provider/purevpn/provider.go index 64b48606..ac78689b 100644 --- a/internal/provider/purevpn/provider.go +++ b/internal/provider/purevpn/provider.go @@ -2,9 +2,11 @@ package purevpn import ( "math/rand" + "net/http" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/purevpn/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +14,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + client *http.Client, unzipper common.Unzipper, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Purevpn), + Fetcher: updater.New(client, unzipper, updaterWarner), } } diff --git a/internal/provider/purevpn/updater/hosttoserver.go b/internal/provider/purevpn/updater/hosttoserver.go index def5f741..c9ab8e83 100644 --- a/internal/provider/purevpn/updater/hosttoserver.go +++ b/internal/provider/purevpn/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package purevpn +package updater import ( "net" diff --git a/internal/provider/purevpn/updater/resolve.go b/internal/provider/purevpn/updater/resolve.go index f3865607..c01e93b3 100644 --- a/internal/provider/purevpn/updater/resolve.go +++ b/internal/provider/purevpn/updater/resolve.go @@ -1,4 +1,4 @@ -package purevpn +package updater import ( "time" diff --git a/internal/provider/purevpn/updater/servers.go b/internal/provider/purevpn/updater/servers.go index f3d35483..cf862a2d 100644 --- a/internal/provider/purevpn/updater/servers.go +++ b/internal/provider/purevpn/updater/servers.go @@ -1,6 +1,6 @@ -// Package purevpn contains code to obtain the server information +// Package updater contains code to obtain the server information // for the PureVPN provider. -package purevpn +package updater import ( "context" diff --git a/internal/provider/purevpn/updater/updater.go b/internal/provider/purevpn/updater/updater.go index bfbfb4df..37d0e74a 100644 --- a/internal/provider/purevpn/updater/updater.go +++ b/internal/provider/purevpn/updater/updater.go @@ -1,4 +1,4 @@ -package purevpn +package updater import ( "net/http" diff --git a/internal/provider/surfshark/provider.go b/internal/provider/surfshark/provider.go index ad184dd5..065b8f4d 100644 --- a/internal/provider/surfshark/provider.go +++ b/internal/provider/surfshark/provider.go @@ -2,9 +2,11 @@ package surfshark import ( "math/rand" + "net/http" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/surfshark/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +14,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + client *http.Client, unzipper common.Unzipper, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Surfshark), + Fetcher: updater.New(client, unzipper, updaterWarner), } } diff --git a/internal/provider/surfshark/updater/api.go b/internal/provider/surfshark/updater/api.go index 52462f99..4b2b9f68 100644 --- a/internal/provider/surfshark/updater/api.go +++ b/internal/provider/surfshark/updater/api.go @@ -1,4 +1,4 @@ -package surfshark +package updater import ( "context" diff --git a/internal/provider/surfshark/updater/api_test.go b/internal/provider/surfshark/updater/api_test.go index e0dfb3a9..58030394 100644 --- a/internal/provider/surfshark/updater/api_test.go +++ b/internal/provider/surfshark/updater/api_test.go @@ -1,4 +1,4 @@ -package surfshark +package updater import ( "context" diff --git a/internal/provider/surfshark/updater/hosttoserver.go b/internal/provider/surfshark/updater/hosttoserver.go index 97b9ab44..a9c62908 100644 --- a/internal/provider/surfshark/updater/hosttoserver.go +++ b/internal/provider/surfshark/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package surfshark +package updater import ( "net" diff --git a/internal/provider/surfshark/updater/location.go b/internal/provider/surfshark/updater/location.go index 0b8aa622..8f351d72 100644 --- a/internal/provider/surfshark/updater/location.go +++ b/internal/provider/surfshark/updater/location.go @@ -1,4 +1,4 @@ -package surfshark +package updater import ( "errors" diff --git a/internal/provider/surfshark/updater/remaining.go b/internal/provider/surfshark/updater/remaining.go index 002122cd..3061bfad 100644 --- a/internal/provider/surfshark/updater/remaining.go +++ b/internal/provider/surfshark/updater/remaining.go @@ -1,4 +1,4 @@ -package surfshark +package updater import ( "github.com/qdm12/gluetun/internal/provider/surfshark/servers" diff --git a/internal/provider/surfshark/updater/resolve.go b/internal/provider/surfshark/updater/resolve.go index 90b0afd2..c01e93b3 100644 --- a/internal/provider/surfshark/updater/resolve.go +++ b/internal/provider/surfshark/updater/resolve.go @@ -1,4 +1,4 @@ -package surfshark +package updater import ( "time" diff --git a/internal/provider/surfshark/updater/roundtrip_test.go b/internal/provider/surfshark/updater/roundtrip_test.go index d8d58399..9df23788 100644 --- a/internal/provider/surfshark/updater/roundtrip_test.go +++ b/internal/provider/surfshark/updater/roundtrip_test.go @@ -1,4 +1,4 @@ -package surfshark +package updater import "net/http" diff --git a/internal/provider/surfshark/updater/servers.go b/internal/provider/surfshark/updater/servers.go index ddc71b32..602bcd86 100644 --- a/internal/provider/surfshark/updater/servers.go +++ b/internal/provider/surfshark/updater/servers.go @@ -1,6 +1,6 @@ -// Package surfshark contains code to obtain the server information +// Package updater contains code to obtain the server information // for the Surshark provider. -package surfshark +package updater import ( "context" diff --git a/internal/provider/surfshark/updater/updater.go b/internal/provider/surfshark/updater/updater.go index 32049ccb..37d0e74a 100644 --- a/internal/provider/surfshark/updater/updater.go +++ b/internal/provider/surfshark/updater/updater.go @@ -1,4 +1,4 @@ -package surfshark +package updater import ( "net/http" diff --git a/internal/provider/surfshark/updater/zip.go b/internal/provider/surfshark/updater/zip.go index 06b2ba9f..28ae82ae 100644 --- a/internal/provider/surfshark/updater/zip.go +++ b/internal/provider/surfshark/updater/zip.go @@ -1,4 +1,4 @@ -package surfshark +package updater import ( "context" diff --git a/internal/provider/torguard/provider.go b/internal/provider/torguard/provider.go index e684b879..6f3a8e5f 100644 --- a/internal/provider/torguard/provider.go +++ b/internal/provider/torguard/provider.go @@ -5,6 +5,7 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" + "github.com/qdm12/gluetun/internal/provider/torguard/updater" "github.com/qdm12/gluetun/internal/provider/utils" ) @@ -12,13 +13,16 @@ type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + unzipper common.Unzipper, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Torguard), + Fetcher: updater.New(unzipper, updaterWarner), } } diff --git a/internal/provider/torguard/updater/filename.go b/internal/provider/torguard/updater/filename.go index 39b5b912..a4a1d8ea 100644 --- a/internal/provider/torguard/updater/filename.go +++ b/internal/provider/torguard/updater/filename.go @@ -1,4 +1,4 @@ -package torguard +package updater import ( "strings" diff --git a/internal/provider/torguard/updater/hosttoserver.go b/internal/provider/torguard/updater/hosttoserver.go index b9772f04..cb21f7e2 100644 --- a/internal/provider/torguard/updater/hosttoserver.go +++ b/internal/provider/torguard/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package torguard +package updater import ( "net" diff --git a/internal/provider/torguard/updater/resolve.go b/internal/provider/torguard/updater/resolve.go index 9a17cf7f..c01e93b3 100644 --- a/internal/provider/torguard/updater/resolve.go +++ b/internal/provider/torguard/updater/resolve.go @@ -1,4 +1,4 @@ -package torguard +package updater import ( "time" diff --git a/internal/provider/torguard/updater/servers.go b/internal/provider/torguard/updater/servers.go index 36da5af9..5c8e7851 100644 --- a/internal/provider/torguard/updater/servers.go +++ b/internal/provider/torguard/updater/servers.go @@ -1,6 +1,6 @@ -// Package torguard contains code to obtain the server information +// Package updater contains code to obtain the server information // for the Torguard provider. -package torguard +package updater import ( "context" diff --git a/internal/provider/torguard/updater/updater.go b/internal/provider/torguard/updater/updater.go index c24adbfb..3fff5dc8 100644 --- a/internal/provider/torguard/updater/updater.go +++ b/internal/provider/torguard/updater/updater.go @@ -1,4 +1,4 @@ -package torguard +package updater import ( "github.com/qdm12/gluetun/internal/provider/common" diff --git a/internal/provider/utils/nofetcher.go b/internal/provider/utils/nofetcher.go new file mode 100644 index 00000000..75ad76f7 --- /dev/null +++ b/internal/provider/utils/nofetcher.go @@ -0,0 +1,26 @@ +package utils + +import ( + "context" + "errors" + "fmt" + + "github.com/qdm12/gluetun/internal/models" +) + +type NoFetcher struct { + providerName string +} + +func NewNoFetcher(providerName string) *NoFetcher { + return &NoFetcher{ + providerName: providerName, + } +} + +var ErrFetcherNotSupported = errors.New("fetching of servers is not supported") + +func (n *NoFetcher) FetchServers(ctx context.Context, minServers int) ( + servers []models.Server, err error) { + return nil, fmt.Errorf("%w: for %s", ErrFetcherNotSupported, n.providerName) +} diff --git a/internal/provider/vpnunlimited/provider.go b/internal/provider/vpnunlimited/provider.go index 6d076905..51c0c999 100644 --- a/internal/provider/vpnunlimited/provider.go +++ b/internal/provider/vpnunlimited/provider.go @@ -6,19 +6,23 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" "github.com/qdm12/gluetun/internal/provider/utils" + "github.com/qdm12/gluetun/internal/provider/vpnunlimited/updater" ) type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + unzipper common.Unzipper, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.VPNUnlimited), + Fetcher: updater.New(unzipper, updaterWarner), } } diff --git a/internal/provider/vpnunlimited/updater/constants.go b/internal/provider/vpnunlimited/updater/constants.go index 17742993..58b3b4e0 100644 --- a/internal/provider/vpnunlimited/updater/constants.go +++ b/internal/provider/vpnunlimited/updater/constants.go @@ -1,4 +1,4 @@ -package vpnunlimited +package updater import ( "strings" diff --git a/internal/provider/vpnunlimited/updater/hosttoserver.go b/internal/provider/vpnunlimited/updater/hosttoserver.go index aeac86e5..54a03072 100644 --- a/internal/provider/vpnunlimited/updater/hosttoserver.go +++ b/internal/provider/vpnunlimited/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package vpnunlimited +package updater import ( "net" diff --git a/internal/provider/vpnunlimited/updater/resolve.go b/internal/provider/vpnunlimited/updater/resolve.go index 244493cb..c01e93b3 100644 --- a/internal/provider/vpnunlimited/updater/resolve.go +++ b/internal/provider/vpnunlimited/updater/resolve.go @@ -1,4 +1,4 @@ -package vpnunlimited +package updater import ( "time" diff --git a/internal/provider/vpnunlimited/updater/servers.go b/internal/provider/vpnunlimited/updater/servers.go index 5eedc324..c485556b 100644 --- a/internal/provider/vpnunlimited/updater/servers.go +++ b/internal/provider/vpnunlimited/updater/servers.go @@ -1,6 +1,6 @@ -// Package vpnunlimited contains code to obtain the server information +// Package updater contains code to obtain the server information // for the VPNUnlimited provider. -package vpnunlimited +package updater import ( "context" diff --git a/internal/provider/vpnunlimited/updater/updater.go b/internal/provider/vpnunlimited/updater/updater.go index 5b7afa94..3fff5dc8 100644 --- a/internal/provider/vpnunlimited/updater/updater.go +++ b/internal/provider/vpnunlimited/updater/updater.go @@ -1,4 +1,4 @@ -package vpnunlimited +package updater import ( "github.com/qdm12/gluetun/internal/provider/common" diff --git a/internal/provider/vyprvpn/provider.go b/internal/provider/vyprvpn/provider.go index 9ccb8f9a..d055489d 100644 --- a/internal/provider/vyprvpn/provider.go +++ b/internal/provider/vyprvpn/provider.go @@ -6,19 +6,23 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" "github.com/qdm12/gluetun/internal/provider/utils" + "github.com/qdm12/gluetun/internal/provider/vyprvpn/updater" ) type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + unzipper common.Unzipper, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Vyprvpn), + Fetcher: updater.New(unzipper, updaterWarner), } } diff --git a/internal/provider/vyprvpn/updater/filename.go b/internal/provider/vyprvpn/updater/filename.go index b2caa712..a2fd3f6e 100644 --- a/internal/provider/vyprvpn/updater/filename.go +++ b/internal/provider/vyprvpn/updater/filename.go @@ -1,4 +1,4 @@ -package vyprvpn +package updater import ( "errors" diff --git a/internal/provider/vyprvpn/updater/hosttoserver.go b/internal/provider/vyprvpn/updater/hosttoserver.go index adc88ce0..29912f51 100644 --- a/internal/provider/vyprvpn/updater/hosttoserver.go +++ b/internal/provider/vyprvpn/updater/hosttoserver.go @@ -1,4 +1,4 @@ -package vyprvpn +package updater import ( "net" diff --git a/internal/provider/vyprvpn/updater/resolve.go b/internal/provider/vyprvpn/updater/resolve.go index 518ae08e..7a04574b 100644 --- a/internal/provider/vyprvpn/updater/resolve.go +++ b/internal/provider/vyprvpn/updater/resolve.go @@ -1,4 +1,4 @@ -package vyprvpn +package updater import ( "time" diff --git a/internal/provider/vyprvpn/updater/servers.go b/internal/provider/vyprvpn/updater/servers.go index 9d091735..54dcc304 100644 --- a/internal/provider/vyprvpn/updater/servers.go +++ b/internal/provider/vyprvpn/updater/servers.go @@ -1,6 +1,6 @@ -// Package vyprvpn contains code to obtain the server information +// Package updater contains code to obtain the server information // for the VyprVPN provider. -package vyprvpn +package updater import ( "context" diff --git a/internal/provider/vyprvpn/updater/updater.go b/internal/provider/vyprvpn/updater/updater.go index bdc62f4e..3fff5dc8 100644 --- a/internal/provider/vyprvpn/updater/updater.go +++ b/internal/provider/vyprvpn/updater/updater.go @@ -1,4 +1,4 @@ -package vyprvpn +package updater import ( "github.com/qdm12/gluetun/internal/provider/common" diff --git a/internal/provider/wevpn/connection_test.go b/internal/provider/wevpn/connection_test.go index bf8f562e..7033f66c 100644 --- a/internal/provider/wevpn/connection_test.go +++ b/internal/provider/wevpn/connection_test.go @@ -92,7 +92,8 @@ func Test_Provider_GetConnection(t *testing.T) { Return(testCase.filteredServers, testCase.storageErr) randSource := rand.NewSource(0) - provider := New(storage, randSource) + warner := (common.Warner)(nil) + provider := New(storage, randSource, warner) if testCase.panicMessage != "" { assert.PanicsWithValue(t, testCase.panicMessage, func() { diff --git a/internal/provider/wevpn/provider.go b/internal/provider/wevpn/provider.go index e6fd601a..43db02fc 100644 --- a/internal/provider/wevpn/provider.go +++ b/internal/provider/wevpn/provider.go @@ -6,19 +6,23 @@ import ( "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" "github.com/qdm12/gluetun/internal/provider/utils" + "github.com/qdm12/gluetun/internal/provider/wevpn/updater" ) type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Wevpn), + Fetcher: updater.New(updaterWarner), } } diff --git a/internal/provider/wevpn/updater/cities.go b/internal/provider/wevpn/updater/cities.go index 1d139e59..3df11d1d 100644 --- a/internal/provider/wevpn/updater/cities.go +++ b/internal/provider/wevpn/updater/cities.go @@ -1,4 +1,4 @@ -package wevpn +package updater // getAvailableCities get available cities as listed on the WeVPN website. func getAvailableCities() (cities []string) { diff --git a/internal/provider/wevpn/updater/hostname.go b/internal/provider/wevpn/updater/hostname.go index 61ac4291..f96a7709 100644 --- a/internal/provider/wevpn/updater/hostname.go +++ b/internal/provider/wevpn/updater/hostname.go @@ -1,4 +1,4 @@ -package wevpn +package updater import "strings" diff --git a/internal/provider/wevpn/updater/resolve.go b/internal/provider/wevpn/updater/resolve.go index 3c3b5ca7..c01e93b3 100644 --- a/internal/provider/wevpn/updater/resolve.go +++ b/internal/provider/wevpn/updater/resolve.go @@ -1,4 +1,4 @@ -package wevpn +package updater import ( "time" diff --git a/internal/provider/wevpn/updater/servers.go b/internal/provider/wevpn/updater/servers.go index c5de3852..0647fc9c 100644 --- a/internal/provider/wevpn/updater/servers.go +++ b/internal/provider/wevpn/updater/servers.go @@ -1,6 +1,6 @@ -// package wevpn contains code to obtain the server information +// Package updater contains code to obtain the server information // for the WeVPN provider. -package wevpn +package updater import ( "context" diff --git a/internal/provider/wevpn/updater/updater.go b/internal/provider/wevpn/updater/updater.go index f1ace92b..a556bc6e 100644 --- a/internal/provider/wevpn/updater/updater.go +++ b/internal/provider/wevpn/updater/updater.go @@ -1,4 +1,4 @@ -package wevpn +package updater import "github.com/qdm12/gluetun/internal/provider/common" diff --git a/internal/provider/windscribe/connection_test.go b/internal/provider/windscribe/connection_test.go index 79754943..aac4a787 100644 --- a/internal/provider/windscribe/connection_test.go +++ b/internal/provider/windscribe/connection_test.go @@ -4,6 +4,7 @@ import ( "errors" "math/rand" "net" + "net/http" "testing" "github.com/golang/mock/gomock" @@ -97,7 +98,9 @@ func Test_Provider_GetConnection(t *testing.T) { Return(testCase.filteredServers, testCase.storageErr) randSource := rand.NewSource(0) - provider := New(storage, randSource) + client := (*http.Client)(nil) + warner := (common.Warner)(nil) + provider := New(storage, randSource, client, warner) if testCase.panicMessage != "" { assert.PanicsWithValue(t, testCase.panicMessage, func() { diff --git a/internal/provider/windscribe/provider.go b/internal/provider/windscribe/provider.go index 2acda23c..fd843617 100644 --- a/internal/provider/windscribe/provider.go +++ b/internal/provider/windscribe/provider.go @@ -2,23 +2,28 @@ package windscribe import ( "math/rand" + "net/http" "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/provider/common" "github.com/qdm12/gluetun/internal/provider/utils" + "github.com/qdm12/gluetun/internal/provider/windscribe/updater" ) type Provider struct { storage common.Storage randSource rand.Source utils.NoPortForwarder + common.Fetcher } -func New(storage common.Storage, randSource rand.Source) *Provider { +func New(storage common.Storage, randSource rand.Source, + client *http.Client, updaterWarner common.Warner) *Provider { return &Provider{ storage: storage, randSource: randSource, NoPortForwarder: utils.NewNoPortForwarding(providers.Windscribe), + Fetcher: updater.New(client, updaterWarner), } } diff --git a/internal/provider/windscribe/updater/api.go b/internal/provider/windscribe/updater/api.go index e8947b7a..27905909 100644 --- a/internal/provider/windscribe/updater/api.go +++ b/internal/provider/windscribe/updater/api.go @@ -1,4 +1,4 @@ -package windscribe +package updater import ( "context" diff --git a/internal/provider/windscribe/updater/servers.go b/internal/provider/windscribe/updater/servers.go index da4b1471..669fde82 100644 --- a/internal/provider/windscribe/updater/servers.go +++ b/internal/provider/windscribe/updater/servers.go @@ -1,6 +1,6 @@ -// Package windscribe contains code to obtain the server information +// Package updater contains code to obtain the server information // for the Windscribe provider. -package windscribe +package updater import ( "context" diff --git a/internal/provider/windscribe/updater/updater.go b/internal/provider/windscribe/updater/updater.go index eed8aa3f..f46ecfb5 100644 --- a/internal/provider/windscribe/updater/updater.go +++ b/internal/provider/windscribe/updater/updater.go @@ -1,4 +1,4 @@ -package windscribe +package updater import ( "net/http" diff --git a/internal/updater/loop/loop.go b/internal/updater/loop/loop.go index 7ccfe131..7940c520 100644 --- a/internal/updater/loop/loop.go +++ b/internal/updater/loop/loop.go @@ -23,7 +23,7 @@ type Looper interface { } type Updater interface { - UpdateServers(ctx context.Context) (err error) + UpdateServers(ctx context.Context, providers []string) (err error) } type looper struct { @@ -46,26 +46,20 @@ type looper struct { const defaultBackoffTime = 5 * time.Second -type Storage interface { - SetServers(provider string, servers []models.Server) (err error) - GetServersCount(provider string) (count int) - ServersAreEqual(provider string, servers []models.Server) (equal bool) -} - type Logger interface { Info(s string) Warn(s string) Error(s string) } -func NewLooper(settings settings.Updater, storage Storage, +func NewLooper(settings settings.Updater, storage updater.Storage, client *http.Client, logger Logger) Looper { return &looper{ state: state{ status: constants.Stopped, settings: settings, }, - updater: updater.New(settings, client, storage, logger), + updater: updater.New(client, storage, logger), logger: logger, start: make(chan struct{}), running: make(chan models.LoopStatus), @@ -106,12 +100,14 @@ func (l *looper) Run(ctx context.Context, done chan<- struct{}) { for ctx.Err() == nil { updateCtx, updateCancel := context.WithCancel(ctx) + settings := l.GetSettings() + errorCh := make(chan error) runWg := &sync.WaitGroup{} runWg.Add(1) go func() { defer runWg.Done() - err := l.updater.UpdateServers(updateCtx) + err := l.updater.UpdateServers(updateCtx, settings.Providers) if err != nil { if updateCtx.Err() == nil { errorCh <- err diff --git a/internal/updater/providers.go b/internal/updater/providers.go index b3e4e7ef..23028ace 100644 --- a/internal/updater/providers.go +++ b/internal/updater/providers.go @@ -4,39 +4,24 @@ import ( "context" "fmt" - "github.com/qdm12/gluetun/internal/constants/providers" "github.com/qdm12/gluetun/internal/models" - cyberghost "github.com/qdm12/gluetun/internal/provider/cyberghost/updater" - expressvpn "github.com/qdm12/gluetun/internal/provider/expressvpn/updater" - fastestvpn "github.com/qdm12/gluetun/internal/provider/fastestvpn/updater" - hidemyass "github.com/qdm12/gluetun/internal/provider/hidemyass/updater" - ipvanish "github.com/qdm12/gluetun/internal/provider/ipvanish/updater" - ivpn "github.com/qdm12/gluetun/internal/provider/ivpn/updater" - mullvad "github.com/qdm12/gluetun/internal/provider/mullvad/updater" - nordvpn "github.com/qdm12/gluetun/internal/provider/nordvpn/updater" - perfectprivacy "github.com/qdm12/gluetun/internal/provider/perfectprivacy/updater" - privado "github.com/qdm12/gluetun/internal/provider/privado/updater" - privateinternetaccess "github.com/qdm12/gluetun/internal/provider/privateinternetaccess/updater" - privatevpn "github.com/qdm12/gluetun/internal/provider/privatevpn/updater" - protonvpn "github.com/qdm12/gluetun/internal/provider/protonvpn/updater" - purevpn "github.com/qdm12/gluetun/internal/provider/purevpn/updater" - surfshark "github.com/qdm12/gluetun/internal/provider/surfshark/updater" - torguard "github.com/qdm12/gluetun/internal/provider/torguard/updater" - vpnunlimited "github.com/qdm12/gluetun/internal/provider/vpnunlimited/updater" - vyprvpn "github.com/qdm12/gluetun/internal/provider/vyprvpn/updater" - wevpn "github.com/qdm12/gluetun/internal/provider/wevpn/updater" - windscribe "github.com/qdm12/gluetun/internal/provider/windscribe/updater" ) -func (u *Updater) updateProvider(ctx context.Context, provider string) (err error) { - existingServersCount := u.storage.GetServersCount(provider) +type Provider interface { + Name() string + FetchServers(ctx context.Context, minServers int) (servers []models.Server, err error) +} + +func (u *Updater) updateProvider(ctx context.Context, provider Provider) (err error) { + providerName := provider.Name() + existingServersCount := u.storage.GetServersCount(providerName) minServers := getMinServers(existingServersCount) - servers, err := u.fetchServers(ctx, provider, minServers) + servers, err := provider.FetchServers(ctx, minServers) if err != nil { return fmt.Errorf("cannot get servers: %w", err) } - if u.storage.ServersAreEqual(provider, servers) { + if u.storage.ServersAreEqual(providerName, servers) { return nil } @@ -44,68 +29,13 @@ func (u *Updater) updateProvider(ctx context.Context, provider string) (err erro // since the implementation does not deep copy the servers. // TODO set in storage in provider updater directly, server by server, // to avoid accumulating server data in memory. - err = u.storage.SetServers(provider, servers) + err = u.storage.SetServers(providerName, servers) if err != nil { return fmt.Errorf("cannot set servers to storage: %w", err) } return nil } -func (u *Updater) fetchServers(ctx context.Context, provider string, - minServers int) (servers []models.Server, err error) { - var providerUpdater interface { - FetchServers(ctx context.Context, minServers int) (servers []models.Server, err error) - } - switch provider { - case providers.Custom: - panic("cannot update custom provider") - case providers.Cyberghost: - providerUpdater = cyberghost.New() - case providers.Expressvpn: - providerUpdater = expressvpn.New(u.unzipper, u.logger) - case providers.Fastestvpn: - providerUpdater = fastestvpn.New(u.unzipper, u.logger) - case providers.HideMyAss: - providerUpdater = hidemyass.New(u.client, u.logger) - case providers.Ipvanish: - providerUpdater = ipvanish.New(u.unzipper, u.logger) - case providers.Ivpn: - providerUpdater = ivpn.New(u.client, u.logger) - case providers.Mullvad: - providerUpdater = mullvad.New(u.client) - case providers.Nordvpn: - providerUpdater = nordvpn.New(u.client, u.logger) - case providers.Perfectprivacy: - providerUpdater = perfectprivacy.New(u.unzipper, u.logger) - case providers.Privado: - providerUpdater = privado.New(u.client, u.unzipper, u.logger) - case providers.PrivateInternetAccess: - providerUpdater = privateinternetaccess.New(u.client) - case providers.Privatevpn: - providerUpdater = privatevpn.New(u.unzipper, u.logger) - case providers.Protonvpn: - providerUpdater = protonvpn.New(u.client, u.logger) - case providers.Purevpn: - providerUpdater = purevpn.New(u.client, u.unzipper, u.logger) - case providers.Surfshark: - providerUpdater = surfshark.New(u.client, u.unzipper, u.logger) - case providers.Torguard: - providerUpdater = torguard.New(u.unzipper, u.logger) - case providers.VPNUnlimited: - providerUpdater = vpnunlimited.New(u.unzipper, u.logger) - case providers.Vyprvpn: - providerUpdater = vyprvpn.New(u.unzipper, u.logger) - case providers.Wevpn: - providerUpdater = wevpn.New(u.logger) - case providers.Windscribe: - providerUpdater = windscribe.New(u.client, u.logger) - default: - panic("provider " + provider + " is unknown") - } - - return providerUpdater.FetchServers(ctx, minServers) -} - func getMinServers(existingServersCount int) (minServers int) { const minRatio = 0.8 return int(minRatio * float64(existingServersCount)) diff --git a/internal/updater/updater.go b/internal/updater/updater.go index 2bfe6a03..f2f5cbdd 100644 --- a/internal/updater/updater.go +++ b/internal/updater/updater.go @@ -8,15 +8,13 @@ import ( "github.com/qdm12/gluetun/internal/configuration/settings" "github.com/qdm12/gluetun/internal/models" + "github.com/qdm12/gluetun/internal/provider" "github.com/qdm12/gluetun/internal/updater/unzip" "golang.org/x/text/cases" "golang.org/x/text/language" ) type Updater struct { - // configuration - options settings.Updater - // state storage Storage @@ -31,6 +29,9 @@ type Storage interface { SetServers(provider string, servers []models.Server) (err error) GetServersCount(provider string) (count int) ServersAreEqual(provider string, servers []models.Server) (equal bool) + // Extra methods to match the provider.New storage interface + FilterServers(provider string, selection settings.ServerSelection) (filtered []models.Server, err error) + GetServerByName(provider string, name string) (server models.Server, ok bool) } type Logger interface { @@ -39,11 +40,10 @@ type Logger interface { Error(s string) } -func New(settings settings.Updater, httpClient *http.Client, +func New(httpClient *http.Client, storage Storage, logger Logger) *Updater { unzipper := unzip.New(httpClient) return &Updater{ - options: settings, storage: storage, logger: logger, timeNow: time.Now, @@ -52,19 +52,23 @@ func New(settings settings.Updater, httpClient *http.Client, } } -func (u *Updater) UpdateServers(ctx context.Context) (err error) { +func (u *Updater) UpdateServers(ctx context.Context, providers []string) (err error) { caser := cases.Title(language.English) - for _, provider := range u.options.Providers { - u.logger.Info("updating " + caser.String(provider) + " servers...") + for _, providerName := range providers { + u.logger.Info("updating " + caser.String(providerName) + " servers...") + + fetcherStorage := (Storage)(nil) // unused + fetcher := provider.New(providerName, fetcherStorage, u.timeNow, + u.logger, u.client, u.unzipper) // TODO support servers offering only TCP or only UDP // for NordVPN and PureVPN - err := u.updateProvider(ctx, provider) + err := u.updateProvider(ctx, fetcher) if err == nil { continue } // return the only error for the single provider. - if len(u.options.Providers) == 1 { + if len(providers) == 1 { return err } diff --git a/internal/vpn/run.go b/internal/vpn/run.go index b27dc2ff..b1b9e161 100644 --- a/internal/vpn/run.go +++ b/internal/vpn/run.go @@ -2,11 +2,13 @@ package vpn import ( "context" + "net/http" "time" "github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/constants/vpn" "github.com/qdm12/gluetun/internal/provider" + "github.com/qdm12/gluetun/internal/updater/unzip" "github.com/qdm12/log" ) @@ -27,10 +29,16 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { return } + // Updater only objects which are unused in this loop + updaterWarner := (log.LoggerInterface)(nil) + updaterClient := (*http.Client)(nil) + updaterUnzipper := (unzip.Unzipper)(nil) + for ctx.Err() == nil { settings := l.state.GetSettings() - providerConf := provider.New(*settings.Provider.Name, l.storage, time.Now) + providerConf := provider.New(*settings.Provider.Name, l.storage, time.Now, + updaterWarner, updaterClient, updaterUnzipper) portForwarding := *settings.Provider.PortForwarding.Enabled var vpnRunner vpnRunner