mirror of
https://github.com/qdm12/gluetun.git
synced 2026-07-25 11:56:24 +02:00
chore(updater): move updater packages to pkg/updaters/<name>
This commit is contained in:
+2
-2
@@ -45,9 +45,9 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/storage"
|
"github.com/qdm12/gluetun/internal/storage"
|
||||||
"github.com/qdm12/gluetun/internal/tun"
|
"github.com/qdm12/gluetun/internal/tun"
|
||||||
updater "github.com/qdm12/gluetun/internal/updater/loop"
|
updater "github.com/qdm12/gluetun/internal/updater/loop"
|
||||||
"github.com/qdm12/gluetun/internal/updater/resolver"
|
|
||||||
"github.com/qdm12/gluetun/internal/updater/unzip"
|
|
||||||
"github.com/qdm12/gluetun/internal/vpn"
|
"github.com/qdm12/gluetun/internal/vpn"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/resolver"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/unzip"
|
||||||
"github.com/qdm12/gosettings/reader"
|
"github.com/qdm12/gosettings/reader"
|
||||||
"github.com/qdm12/gosettings/reader/sources/env"
|
"github.com/qdm12/gosettings/reader/sources/env"
|
||||||
"github.com/qdm12/goshutdown"
|
"github.com/qdm12/goshutdown"
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
|
||||||
"github.com/qdm12/gluetun/internal/netlink"
|
"github.com/qdm12/gluetun/internal/netlink"
|
||||||
"github.com/qdm12/gluetun/internal/openvpn/extract"
|
"github.com/qdm12/gluetun/internal/openvpn/extract"
|
||||||
"github.com/qdm12/gluetun/internal/provider"
|
"github.com/qdm12/gluetun/internal/provider"
|
||||||
"github.com/qdm12/gluetun/internal/storage"
|
"github.com/qdm12/gluetun/internal/storage"
|
||||||
"github.com/qdm12/gluetun/internal/updater/resolver"
|
"github.com/qdm12/gluetun/pkg/publicip/models"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/resolver"
|
||||||
"github.com/qdm12/gosettings/reader"
|
"github.com/qdm12/gosettings/reader"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/openvpn/extract"
|
"github.com/qdm12/gluetun/internal/openvpn/extract"
|
||||||
"github.com/qdm12/gluetun/internal/provider"
|
"github.com/qdm12/gluetun/internal/provider"
|
||||||
"github.com/qdm12/gluetun/internal/publicip/api"
|
|
||||||
"github.com/qdm12/gluetun/internal/storage"
|
"github.com/qdm12/gluetun/internal/storage"
|
||||||
"github.com/qdm12/gluetun/internal/updater"
|
"github.com/qdm12/gluetun/internal/updater"
|
||||||
"github.com/qdm12/gluetun/internal/updater/resolver"
|
"github.com/qdm12/gluetun/pkg/publicip/api"
|
||||||
"github.com/qdm12/gluetun/internal/updater/unzip"
|
"github.com/qdm12/gluetun/pkg/updaters/resolver"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/unzip"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UpdaterLogger interface {
|
type UpdaterLogger interface {
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings/helpers"
|
"github.com/qdm12/gluetun/internal/configuration/settings/helpers"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/privateinternetaccess/presets"
|
"github.com/qdm12/gluetun/internal/provider/privateinternetaccess/presets"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gosettings"
|
"github.com/qdm12/gosettings"
|
||||||
"github.com/qdm12/gosettings/reader"
|
"github.com/qdm12/gosettings/reader"
|
||||||
"github.com/qdm12/gosettings/validate"
|
"github.com/qdm12/gosettings/validate"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gosettings"
|
"github.com/qdm12/gosettings"
|
||||||
"github.com/qdm12/gosettings/reader"
|
"github.com/qdm12/gosettings/reader"
|
||||||
"github.com/qdm12/gosettings/validate"
|
"github.com/qdm12/gosettings/validate"
|
||||||
@@ -31,9 +31,9 @@ func (p *Provider) validate(vpnType string, filterChoicesGetter FilterChoicesGet
|
|||||||
// Validate Name
|
// Validate Name
|
||||||
var validNames []string
|
var validNames []string
|
||||||
switch vpnType {
|
switch vpnType {
|
||||||
case vpn.AmneziaWg:
|
case constants.AmneziaWg:
|
||||||
validNames = []string{providers.Custom}
|
validNames = []string{providers.Custom}
|
||||||
case vpn.OpenVPN:
|
case constants.OpenVPN:
|
||||||
validNames = providers.AllWithCustom()
|
validNames = providers.AllWithCustom()
|
||||||
validNames = append(validNames, "pia") // Retro-compatibility
|
validNames = append(validNames, "pia") // Retro-compatibility
|
||||||
// Remove Mullvad since it no longer supports OpenVPN as of January 15th, 2026
|
// Remove Mullvad since it no longer supports OpenVPN as of January 15th, 2026
|
||||||
@@ -41,7 +41,7 @@ func (p *Provider) validate(vpnType string, filterChoicesGetter FilterChoicesGet
|
|||||||
validNames[mullvadIndex], validNames[len(validNames)-1] = validNames[len(validNames)-1], validNames[mullvadIndex]
|
validNames[mullvadIndex], validNames[len(validNames)-1] = validNames[len(validNames)-1], validNames[mullvadIndex]
|
||||||
validNames = validNames[:len(validNames)-1]
|
validNames = validNames[:len(validNames)-1]
|
||||||
sort.Strings(validNames)
|
sort.Strings(validNames)
|
||||||
case vpn.Wireguard:
|
case constants.Wireguard:
|
||||||
validNames = []string{
|
validNames = []string{
|
||||||
providers.Airvpn,
|
providers.Airvpn,
|
||||||
providers.Custom,
|
providers.Custom,
|
||||||
@@ -122,7 +122,7 @@ func (p *Provider) read(r *reader.Reader, vpnType string) (err error) {
|
|||||||
func readVPNServiceProvider(r *reader.Reader, vpnType string) (vpnProvider string) {
|
func readVPNServiceProvider(r *reader.Reader, vpnType string) (vpnProvider string) {
|
||||||
vpnProvider = r.String("VPN_SERVICE_PROVIDER", reader.RetroKeys("VPNSP"))
|
vpnProvider = r.String("VPN_SERVICE_PROVIDER", reader.RetroKeys("VPNSP"))
|
||||||
if vpnProvider == "" {
|
if vpnProvider == "" {
|
||||||
if vpnType != vpn.Wireguard && r.Get("OPENVPN_CUSTOM_CONFIG") != nil {
|
if vpnType != constants.Wireguard && r.Get("OPENVPN_CUSTOM_CONFIG") != nil {
|
||||||
// retro compatibility
|
// retro compatibility
|
||||||
return providers.Custom
|
return providers.Custom
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/publicip/api"
|
"github.com/qdm12/gluetun/pkg/publicip/api"
|
||||||
"github.com/qdm12/gosettings"
|
"github.com/qdm12/gosettings"
|
||||||
"github.com/qdm12/gosettings/reader"
|
"github.com/qdm12/gosettings/reader"
|
||||||
"github.com/qdm12/gotree"
|
"github.com/qdm12/gotree"
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/configuration/settings/helpers"
|
"github.com/qdm12/gluetun/internal/configuration/settings/helpers"
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings/validation"
|
"github.com/qdm12/gluetun/internal/configuration/settings/validation"
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gosettings"
|
"github.com/qdm12/gosettings"
|
||||||
"github.com/qdm12/gosettings/reader"
|
"github.com/qdm12/gosettings/reader"
|
||||||
"github.com/qdm12/gosettings/validate"
|
"github.com/qdm12/gosettings/validate"
|
||||||
@@ -75,7 +75,7 @@ func (ss *ServerSelection) validate(vpnServiceProvider string,
|
|||||||
filterChoicesGetter FilterChoicesGetter, warner Warner,
|
filterChoicesGetter FilterChoicesGetter, warner Warner,
|
||||||
) (err error) {
|
) (err error) {
|
||||||
switch ss.VPN {
|
switch ss.VPN {
|
||||||
case vpn.AmneziaWg, vpn.OpenVPN, vpn.Wireguard:
|
case constants.AmneziaWg, constants.OpenVPN, constants.Wireguard:
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("VPN type is not valid: %s", ss.VPN)
|
return fmt.Errorf("VPN type is not valid: %s", ss.VPN)
|
||||||
}
|
}
|
||||||
@@ -108,7 +108,7 @@ func (ss *ServerSelection) validate(vpnServiceProvider string,
|
|||||||
return fmt.Errorf("for VPN service provider %s: %w", vpnServiceProvider, err)
|
return fmt.Errorf("for VPN service provider %s: %w", vpnServiceProvider, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ss.VPN == vpn.OpenVPN {
|
if ss.VPN == constants.OpenVPN {
|
||||||
err = ss.OpenVPN.validate(vpnServiceProvider)
|
err = ss.OpenVPN.validate(vpnServiceProvider)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("OpenVPN server selection settings: %w", err)
|
return fmt.Errorf("OpenVPN server selection settings: %w", err)
|
||||||
@@ -324,7 +324,7 @@ func (ss *ServerSelection) overrideWith(other ServerSelection) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ss *ServerSelection) setDefaults(vpnProvider string, portForwardingEnabled bool) {
|
func (ss *ServerSelection) setDefaults(vpnProvider string, portForwardingEnabled bool) {
|
||||||
ss.VPN = gosettings.DefaultComparable(ss.VPN, vpn.OpenVPN)
|
ss.VPN = gosettings.DefaultComparable(ss.VPN, constants.OpenVPN)
|
||||||
ss.OwnedOnly = gosettings.DefaultPointer(ss.OwnedOnly, false)
|
ss.OwnedOnly = gosettings.DefaultPointer(ss.OwnedOnly, false)
|
||||||
ss.FreeOnly = gosettings.DefaultPointer(ss.FreeOnly, false)
|
ss.FreeOnly = gosettings.DefaultPointer(ss.FreeOnly, false)
|
||||||
ss.PremiumOnly = gosettings.DefaultPointer(ss.PremiumOnly, false)
|
ss.PremiumOnly = gosettings.DefaultPointer(ss.PremiumOnly, false)
|
||||||
@@ -414,7 +414,7 @@ func (ss ServerSelection) toLinesNode() (node *gotree.Node) {
|
|||||||
node.Appendf("Port forwarding only servers: yes")
|
node.Appendf("Port forwarding only servers: yes")
|
||||||
}
|
}
|
||||||
|
|
||||||
if ss.VPN == vpn.OpenVPN {
|
if ss.VPN == constants.OpenVPN {
|
||||||
node.AppendNode(ss.OpenVPN.toLinesNode())
|
node.AppendNode(ss.OpenVPN.toLinesNode())
|
||||||
} else {
|
} else {
|
||||||
node.AppendNode(ss.Wireguard.toLinesNode())
|
node.AppendNode(ss.Wireguard.toLinesNode())
|
||||||
@@ -506,7 +506,7 @@ func (ss *ServerSelection) read(r *reader.Reader,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
amneziawg := ss.VPN == vpn.AmneziaWg
|
amneziawg := ss.VPN == constants.AmneziaWg
|
||||||
err = ss.Wireguard.read(r, amneziawg)
|
err = ss.Wireguard.read(r, amneziawg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings/helpers"
|
"github.com/qdm12/gluetun/internal/configuration/settings/helpers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/pprof"
|
"github.com/qdm12/gluetun/internal/pprof"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gosettings/reader"
|
"github.com/qdm12/gosettings/reader"
|
||||||
"github.com/qdm12/gotree"
|
"github.com/qdm12/gotree"
|
||||||
)
|
)
|
||||||
@@ -175,7 +175,7 @@ func (s Settings) Warnings() (warnings []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if helpers.IsOneOf(s.VPN.Provider.Name, providers.SlickVPN) &&
|
if helpers.IsOneOf(s.VPN.Provider.Name, providers.SlickVPN) &&
|
||||||
s.VPN.Type == vpn.OpenVPN {
|
s.VPN.Type == constants.OpenVPN {
|
||||||
warnings = append(warnings, "OpenVPN 2.5 and 2.6 use OpenSSL 3 "+
|
warnings = append(warnings, "OpenVPN 2.5 and 2.6 use OpenSSL 3 "+
|
||||||
"which prohibits the usage of weak security in today's standards. "+
|
"which prohibits the usage of weak security in today's standards. "+
|
||||||
s.VPN.Provider.Name+" uses weak security which is out "+
|
s.VPN.Provider.Name+" uses weak security which is out "+
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package settings
|
|||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/surfshark/servers"
|
"github.com/qdm12/gluetun/pkg/updaters/providers/surfshark/servers"
|
||||||
)
|
)
|
||||||
|
|
||||||
func surfsharkRetroRegion(selection ServerSelection) (
|
func surfsharkRetroRegion(selection ServerSelection) (
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package validation
|
|||||||
import (
|
import (
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func sortedInsert(ss []string, s string) []string {
|
func sortedInsert(ss []string, s string) []string {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package validation
|
package validation
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/provider/surfshark/servers"
|
"github.com/qdm12/gluetun/pkg/updaters/providers/surfshark/servers"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO remove in v4.
|
// TODO remove in v4.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package settings
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gosettings"
|
"github.com/qdm12/gosettings"
|
||||||
"github.com/qdm12/gosettings/reader"
|
"github.com/qdm12/gosettings/reader"
|
||||||
"github.com/qdm12/gosettings/validate"
|
"github.com/qdm12/gosettings/validate"
|
||||||
@@ -35,7 +35,7 @@ type VPN struct {
|
|||||||
// TODO v4 remove pointer for receiver (because of Surfshark).
|
// TODO v4 remove pointer for receiver (because of Surfshark).
|
||||||
func (v *VPN) Validate(filterChoicesGetter FilterChoicesGetter, ipv6Supported bool, warner Warner) (err error) {
|
func (v *VPN) Validate(filterChoicesGetter FilterChoicesGetter, ipv6Supported bool, warner Warner) (err error) {
|
||||||
// Validate Type
|
// Validate Type
|
||||||
validVPNTypes := []string{vpn.AmneziaWg, vpn.OpenVPN, vpn.Wireguard}
|
validVPNTypes := []string{constants.AmneziaWg, constants.OpenVPN, constants.Wireguard}
|
||||||
if err = validate.IsOneOf(v.Type, validVPNTypes...); err != nil {
|
if err = validate.IsOneOf(v.Type, validVPNTypes...); err != nil {
|
||||||
return fmt.Errorf("VPN type is not valid: %w", err)
|
return fmt.Errorf("VPN type is not valid: %w", err)
|
||||||
}
|
}
|
||||||
@@ -46,17 +46,17 @@ func (v *VPN) Validate(filterChoicesGetter FilterChoicesGetter, ipv6Supported bo
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch v.Type {
|
switch v.Type {
|
||||||
case vpn.AmneziaWg:
|
case constants.AmneziaWg:
|
||||||
err = v.AmneziaWg.validate(v.Provider.Name, ipv6Supported)
|
err = v.AmneziaWg.validate(v.Provider.Name, ipv6Supported)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("AmneziaWG settings: %w", err)
|
return fmt.Errorf("AmneziaWG settings: %w", err)
|
||||||
}
|
}
|
||||||
case vpn.OpenVPN:
|
case constants.OpenVPN:
|
||||||
err := v.OpenVPN.validate(v.Provider.Name)
|
err := v.OpenVPN.validate(v.Provider.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("OpenVPN settings: %w", err)
|
return fmt.Errorf("OpenVPN settings: %w", err)
|
||||||
}
|
}
|
||||||
case vpn.Wireguard:
|
case constants.Wireguard:
|
||||||
const amneziawg = false
|
const amneziawg = false
|
||||||
err := v.Wireguard.validate(v.Provider.Name, ipv6Supported, amneziawg)
|
err := v.Wireguard.validate(v.Provider.Name, ipv6Supported, amneziawg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -97,7 +97,7 @@ func (v *VPN) OverrideWith(other VPN) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (v *VPN) setDefaults() {
|
func (v *VPN) setDefaults() {
|
||||||
v.Type = gosettings.DefaultComparable(v.Type, vpn.OpenVPN)
|
v.Type = gosettings.DefaultComparable(v.Type, constants.OpenVPN)
|
||||||
v.Provider.setDefaults()
|
v.Provider.setDefaults()
|
||||||
v.AmneziaWg.setDefaults(v.Provider.Name)
|
v.AmneziaWg.setDefaults(v.Provider.Name)
|
||||||
v.OpenVPN.setDefaults(v.Provider.Name)
|
v.OpenVPN.setDefaults(v.Provider.Name)
|
||||||
@@ -117,11 +117,11 @@ func (v VPN) toLinesNode() (node *gotree.Node) {
|
|||||||
node.AppendNode(v.Provider.toLinesNode())
|
node.AppendNode(v.Provider.toLinesNode())
|
||||||
|
|
||||||
switch v.Type {
|
switch v.Type {
|
||||||
case vpn.AmneziaWg:
|
case constants.AmneziaWg:
|
||||||
node.AppendNode(v.AmneziaWg.toLinesNode())
|
node.AppendNode(v.AmneziaWg.toLinesNode())
|
||||||
case vpn.OpenVPN:
|
case constants.OpenVPN:
|
||||||
node.AppendNode(v.OpenVPN.toLinesNode())
|
node.AppendNode(v.OpenVPN.toLinesNode())
|
||||||
case vpn.Wireguard:
|
case constants.Wireguard:
|
||||||
node.AppendNode(v.Wireguard.toLinesNode())
|
node.AppendNode(v.Wireguard.toLinesNode())
|
||||||
}
|
}
|
||||||
node.AppendNode(v.PMTUD.toLinesNode())
|
node.AppendNode(v.PMTUD.toLinesNode())
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ package providers
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_All(t *testing.T) {
|
func Test_All(t *testing.T) {
|
||||||
@@ -21,3 +23,27 @@ func Test_AllWithCustom(t *testing.T) {
|
|||||||
assert.Contains(t, all, Custom)
|
assert.Contains(t, all, Custom)
|
||||||
assert.Len(t, all, len(All())+1)
|
assert.Len(t, all, len(All())+1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_MatchUpdaters(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
fetcherNames := updaters.ListAllNames()
|
||||||
|
|
||||||
|
allProviders := All()
|
||||||
|
require.Equal(t, len(allProviders), len(fetcherNames), "number of providers in All() should match number of fetchers")
|
||||||
|
nameToFound := make(map[string]bool, len(allProviders))
|
||||||
|
for _, provider := range allProviders {
|
||||||
|
nameToFound[provider] = false
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, fetcherName := range fetcherNames {
|
||||||
|
found, ok := nameToFound[fetcherName]
|
||||||
|
require.True(t, ok, "fetcher name %q not found in %v", fetcherName, allProviders)
|
||||||
|
require.False(t, found, "fetcher name %q is duplicated in %v", fetcherName, allProviders)
|
||||||
|
nameToFound[fetcherName] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for provider, found := range nameToFound {
|
||||||
|
assert.True(t, found, "provider %q from All() does not have a matching fetcher", provider)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func boolToMarkdown(b bool) string {
|
func boolToMarkdown(b bool) string {
|
||||||
@@ -42,7 +43,7 @@ const (
|
|||||||
vpnHeader = "VPN"
|
vpnHeader = "VPN"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *Server) ToMarkdown(headers ...string) (markdown string) {
|
func serverToMarkdown(s models.Server, headers ...string) (markdown string) {
|
||||||
if len(headers) == 0 {
|
if len(headers) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@@ -81,7 +82,7 @@ func (s *Server) ToMarkdown(headers ...string) (markdown string) {
|
|||||||
case tcpHeader:
|
case tcpHeader:
|
||||||
fields[i] = boolToMarkdown(s.TCP)
|
fields[i] = boolToMarkdown(s.TCP)
|
||||||
case udpHeader:
|
case udpHeader:
|
||||||
fields[i] = boolToMarkdown(s.UDP || s.VPN == vpn.Wireguard)
|
fields[i] = boolToMarkdown(s.UDP || s.VPN == constants.Wireguard)
|
||||||
case vpnHeader:
|
case vpnHeader:
|
||||||
fields[i] = s.VPN
|
fields[i] = s.VPN
|
||||||
}
|
}
|
||||||
@@ -90,7 +91,7 @@ func (s *Server) ToMarkdown(headers ...string) (markdown string) {
|
|||||||
return "| " + strings.Join(fields, " | ") + " |"
|
return "| " + strings.Join(fields, " | ") + " |"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Servers) toMarkdown(vpnProvider string) (formatted string, err error) {
|
func serversToMarkdown(s models.Servers, vpnProvider string) (formatted string, err error) {
|
||||||
headers, err := getMarkdownHeaders(vpnProvider)
|
headers, err := getMarkdownHeaders(vpnProvider)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("getting markdown headers: %w", err)
|
return "", fmt.Errorf("getting markdown headers: %w", err)
|
||||||
@@ -100,7 +101,7 @@ func (s *Servers) toMarkdown(vpnProvider string) (formatted string, err error) {
|
|||||||
|
|
||||||
entries := make([]string, len(s.Servers))
|
entries := make([]string, len(s.Servers))
|
||||||
for i, server := range s.Servers {
|
for i, server := range s.Servers {
|
||||||
entries[i] = server.ToMarkdown(headers...)
|
entries[i] = serverToMarkdown(server, headers...)
|
||||||
}
|
}
|
||||||
|
|
||||||
formatted = legend + "\n" +
|
formatted = legend + "\n" +
|
||||||
|
|||||||
@@ -4,16 +4,17 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test_Servers_ToMarkdown(t *testing.T) {
|
func Test_serversToMarkdown(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
testCases := map[string]struct {
|
testCases := map[string]struct {
|
||||||
provider string
|
provider string
|
||||||
servers Servers
|
servers models.Servers
|
||||||
formatted string
|
formatted string
|
||||||
errMessage string
|
errMessage string
|
||||||
}{
|
}{
|
||||||
@@ -23,8 +24,8 @@ func Test_Servers_ToMarkdown(t *testing.T) {
|
|||||||
},
|
},
|
||||||
providers.Cyberghost: {
|
providers.Cyberghost: {
|
||||||
provider: providers.Cyberghost,
|
provider: providers.Cyberghost,
|
||||||
servers: Servers{
|
servers: models.Servers{
|
||||||
Servers: []Server{
|
Servers: []models.Server{
|
||||||
{Country: "a", UDP: true, Hostname: "xa"},
|
{Country: "a", UDP: true, Hostname: "xa"},
|
||||||
{Country: "b", TCP: true, Hostname: "xb"},
|
{Country: "b", TCP: true, Hostname: "xb"},
|
||||||
},
|
},
|
||||||
@@ -36,10 +37,10 @@ func Test_Servers_ToMarkdown(t *testing.T) {
|
|||||||
},
|
},
|
||||||
providers.Fastestvpn: {
|
providers.Fastestvpn: {
|
||||||
provider: providers.Fastestvpn,
|
provider: providers.Fastestvpn,
|
||||||
servers: Servers{
|
servers: models.Servers{
|
||||||
Servers: []Server{
|
Servers: []models.Server{
|
||||||
{Country: "a", Hostname: "xa", VPN: vpn.OpenVPN, TCP: true},
|
{Country: "a", Hostname: "xa", VPN: constants.OpenVPN, TCP: true},
|
||||||
{Country: "b", Hostname: "xb", VPN: vpn.OpenVPN, UDP: true},
|
{Country: "b", Hostname: "xb", VPN: constants.OpenVPN, UDP: true},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
formatted: "| Country | Hostname | VPN | TCP | UDP |\n" +
|
formatted: "| Country | Hostname | VPN | TCP | UDP |\n" +
|
||||||
@@ -53,7 +54,7 @@ func Test_Servers_ToMarkdown(t *testing.T) {
|
|||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
markdown, err := testCase.servers.toMarkdown(testCase.provider)
|
markdown, err := serversToMarkdown(testCase.servers, testCase.provider)
|
||||||
|
|
||||||
assert.Equal(t, testCase.formatted, markdown)
|
assert.Equal(t, testCase.formatted, markdown)
|
||||||
if testCase.errMessage != "" {
|
if testCase.errMessage != "" {
|
||||||
|
|||||||
@@ -9,11 +9,12 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type AllServers struct {
|
type AllServers struct {
|
||||||
Version uint16 // used for migration of the top level scheme
|
Version uint16 // used for migration of the top level scheme
|
||||||
ProviderToServers map[string]Servers
|
ProviderToServers map[string]models.Servers
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ json.Marshaler = (*AllServers)(nil)
|
var _ json.Marshaler = (*AllServers)(nil)
|
||||||
@@ -110,7 +111,7 @@ func (a *AllServers) UnmarshalJSON(data []byte) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
a.ProviderToServers = make(map[string]Servers, len(keyValues))
|
a.ProviderToServers = make(map[string]models.Servers, len(keyValues))
|
||||||
|
|
||||||
allProviders := providers.All()
|
allProviders := providers.All()
|
||||||
allProvidersSet := make(map[string]struct{}, len(allProviders))
|
allProvidersSet := make(map[string]struct{}, len(allProviders))
|
||||||
@@ -131,7 +132,7 @@ func (a *AllServers) UnmarshalJSON(data []byte) (err error) {
|
|||||||
key, err)
|
key, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var servers Servers
|
var servers models.Servers
|
||||||
err = json.Unmarshal(jsonValue, &servers)
|
err = json.Unmarshal(jsonValue, &servers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("decoding %s servers: %w",
|
return fmt.Errorf("decoding %s servers: %w",
|
||||||
@@ -151,24 +152,18 @@ func (a *AllServers) Count() (count int) {
|
|||||||
return count
|
return count
|
||||||
}
|
}
|
||||||
|
|
||||||
type Servers struct {
|
func FormatServers(s models.Servers, vpnProvider, format string) (formatted string, err error) {
|
||||||
Version uint16 `json:"version"`
|
|
||||||
Timestamp int64 `json:"timestamp"`
|
|
||||||
Servers []Server `json:"servers,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Servers) Format(vpnProvider, format string) (formatted string, err error) {
|
|
||||||
switch format {
|
switch format {
|
||||||
case "markdown":
|
case "markdown":
|
||||||
return s.toMarkdown(vpnProvider)
|
return serversToMarkdown(s, vpnProvider)
|
||||||
case "json":
|
case "json":
|
||||||
return s.toJSON()
|
return serversToJSON(s)
|
||||||
default:
|
default:
|
||||||
return "", fmt.Errorf("servers format not supported: %s", format)
|
return "", fmt.Errorf("servers format not supported: %s", format)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Servers) toJSON() (formatted string, err error) {
|
func serversToJSON(s models.Servers) (formatted string, err error) {
|
||||||
buffer := bytes.NewBuffer(nil)
|
buffer := bytes.NewBuffer(nil)
|
||||||
encoder := json.NewEncoder(buffer)
|
encoder := json.NewEncoder(buffer)
|
||||||
encoder.SetIndent("", " ")
|
encoder.SetIndent("", " ")
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
@@ -20,18 +21,18 @@ func Test_AllServers_MarshalJSON(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
"no provider": {
|
"no provider": {
|
||||||
allServers: &AllServers{
|
allServers: &AllServers{
|
||||||
ProviderToServers: map[string]Servers{},
|
ProviderToServers: map[string]models.Servers{},
|
||||||
},
|
},
|
||||||
dataString: `{"version":0}`,
|
dataString: `{"version":0}`,
|
||||||
},
|
},
|
||||||
"two providers": {
|
"two providers": {
|
||||||
allServers: &AllServers{
|
allServers: &AllServers{
|
||||||
Version: 1,
|
Version: 1,
|
||||||
ProviderToServers: map[string]Servers{
|
ProviderToServers: map[string]models.Servers{
|
||||||
providers.Cyberghost: {
|
providers.Cyberghost: {
|
||||||
Version: 1,
|
Version: 1,
|
||||||
Timestamp: 1000,
|
Timestamp: 1000,
|
||||||
Servers: []Server{
|
Servers: []models.Server{
|
||||||
{Country: "A"},
|
{Country: "A"},
|
||||||
{Country: "B"},
|
{Country: "B"},
|
||||||
},
|
},
|
||||||
@@ -39,7 +40,7 @@ func Test_AllServers_MarshalJSON(t *testing.T) {
|
|||||||
providers.Privado: {
|
providers.Privado: {
|
||||||
Version: 2,
|
Version: 2,
|
||||||
Timestamp: 2000,
|
Timestamp: 2000,
|
||||||
Servers: []Server{
|
Servers: []models.Server{
|
||||||
{City: "C"},
|
{City: "C"},
|
||||||
{City: "D"},
|
{City: "D"},
|
||||||
},
|
},
|
||||||
@@ -100,11 +101,11 @@ func Test_AllServers_UnmarshalJSON(t *testing.T) {
|
|||||||
`"privado":{"version":2,"timestamp":2000,"servers":[{"city":"C"},{"city":"D"}]}}`,
|
`"privado":{"version":2,"timestamp":2000,"servers":[{"city":"C"},{"city":"D"}]}}`,
|
||||||
allServers: AllServers{
|
allServers: AllServers{
|
||||||
Version: 1,
|
Version: 1,
|
||||||
ProviderToServers: map[string]Servers{
|
ProviderToServers: map[string]models.Servers{
|
||||||
providers.Cyberghost: {
|
providers.Cyberghost: {
|
||||||
Version: 1,
|
Version: 1,
|
||||||
Timestamp: 1000,
|
Timestamp: 1000,
|
||||||
Servers: []Server{
|
Servers: []models.Server{
|
||||||
{Country: "A"},
|
{Country: "A"},
|
||||||
{Country: "B"},
|
{Country: "B"},
|
||||||
},
|
},
|
||||||
@@ -112,7 +113,7 @@ func Test_AllServers_UnmarshalJSON(t *testing.T) {
|
|||||||
providers.Privado: {
|
providers.Privado: {
|
||||||
Version: 2,
|
Version: 2,
|
||||||
Timestamp: 2000,
|
Timestamp: 2000,
|
||||||
Servers: []Server{
|
Servers: []models.Server{
|
||||||
{City: "C"},
|
{City: "C"},
|
||||||
{City: "D"},
|
{City: "D"},
|
||||||
},
|
},
|
||||||
@@ -146,11 +147,11 @@ func Test_AllServers_JSON_Marshal_Unmarshal(t *testing.T) {
|
|||||||
|
|
||||||
allServers := &AllServers{
|
allServers := &AllServers{
|
||||||
Version: 1,
|
Version: 1,
|
||||||
ProviderToServers: map[string]Servers{
|
ProviderToServers: map[string]models.Servers{
|
||||||
providers.Cyberghost: {
|
providers.Cyberghost: {
|
||||||
Version: 1,
|
Version: 1,
|
||||||
Timestamp: 1000,
|
Timestamp: 1000,
|
||||||
Servers: []Server{
|
Servers: []models.Server{
|
||||||
{Country: "A"},
|
{Country: "A"},
|
||||||
{Country: "B"},
|
{Country: "B"},
|
||||||
},
|
},
|
||||||
@@ -158,7 +159,7 @@ func Test_AllServers_JSON_Marshal_Unmarshal(t *testing.T) {
|
|||||||
providers.Privado: {
|
providers.Privado: {
|
||||||
Version: 2,
|
Version: 2,
|
||||||
Timestamp: 2000,
|
Timestamp: 2000,
|
||||||
Servers: []Server{
|
Servers: []models.Server{
|
||||||
{City: "C"},
|
{City: "C"},
|
||||||
{City: "D"},
|
{City: "D"},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
func extractDataFromLines(lines []string) (
|
func extractDataFromLines(lines []string) (
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import (
|
|||||||
"net/netip"
|
"net/netip"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
package pmtud
|
package pmtud
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
pconstants "github.com/qdm12/gluetun/internal/pmtud/constants"
|
pconstants "github.com/qdm12/gluetun/internal/pmtud/constants"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MaxTheoreticalVPNMTU returns the theoretical maximum MTU for a VPN tunnel
|
// MaxTheoreticalVPNMTU returns the theoretical maximum MTU for a VPN tunnel
|
||||||
@@ -27,9 +26,9 @@ func MaxTheoreticalVPNMTU(vpnType, network string, ipv6 bool) uint32 {
|
|||||||
panic("unknown network protocol: " + network)
|
panic("unknown network protocol: " + network)
|
||||||
}
|
}
|
||||||
switch vpnType {
|
switch vpnType {
|
||||||
case vpn.Wireguard, vpn.AmneziaWg:
|
case constants.Wireguard, constants.AmneziaWg:
|
||||||
vpnLinkMTU -= pconstants.WireguardHeaderLength
|
vpnLinkMTU -= pconstants.WireguardHeaderLength
|
||||||
case vpn.OpenVPN:
|
case constants.OpenVPN:
|
||||||
vpnLinkMTU -= pconstants.OpenVPNHeaderMaxLength
|
vpnLinkMTU -= pconstants.OpenVPNHeaderMaxLength
|
||||||
default:
|
default:
|
||||||
panic("unknown VPN type: " + vpnType)
|
panic("unknown VPN type: " + vpnType)
|
||||||
|
|||||||
@@ -4,22 +4,23 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/airvpn/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/airvpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client) *Provider {
|
func New(storage common.Storage, client *http.Client) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client),
|
Fetcher: airvpn.New(client),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,59 +1,17 @@
|
|||||||
// Code generated by MockGen. DO NOT EDIT.
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
// Source: github.com/qdm12/gluetun/internal/provider/common (interfaces: ParallelResolver,Storage,Unzipper,Warner)
|
// Source: github.com/qdm12/gluetun/internal/provider/common (interfaces: Storage)
|
||||||
|
|
||||||
// Package common is a generated GoMock package.
|
// Package common is a generated GoMock package.
|
||||||
package common
|
package common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
|
||||||
netip "net/netip"
|
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
settings "github.com/qdm12/gluetun/internal/configuration/settings"
|
settings "github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
models "github.com/qdm12/gluetun/internal/models"
|
models "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
resolver "github.com/qdm12/gluetun/internal/updater/resolver"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockParallelResolver is a mock of ParallelResolver interface.
|
|
||||||
type MockParallelResolver struct {
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
recorder *MockParallelResolverMockRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockParallelResolverMockRecorder is the mock recorder for MockParallelResolver.
|
|
||||||
type MockParallelResolverMockRecorder struct {
|
|
||||||
mock *MockParallelResolver
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockParallelResolver creates a new mock instance.
|
|
||||||
func NewMockParallelResolver(ctrl *gomock.Controller) *MockParallelResolver {
|
|
||||||
mock := &MockParallelResolver{ctrl: ctrl}
|
|
||||||
mock.recorder = &MockParallelResolverMockRecorder{mock}
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|
||||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
|
||||||
func (m *MockParallelResolver) EXPECT() *MockParallelResolverMockRecorder {
|
|
||||||
return m.recorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resolve mocks base method.
|
|
||||||
func (m *MockParallelResolver) Resolve(arg0 context.Context, arg1 resolver.ParallelSettings) (map[string][]netip.Addr, []string, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "Resolve", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(map[string][]netip.Addr)
|
|
||||||
ret1, _ := ret[1].([]string)
|
|
||||||
ret2, _ := ret[2].(error)
|
|
||||||
return ret0, ret1, ret2
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resolve indicates an expected call of Resolve.
|
|
||||||
func (mr *MockParallelResolverMockRecorder) Resolve(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Resolve", reflect.TypeOf((*MockParallelResolver)(nil).Resolve), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockStorage is a mock of Storage interface.
|
// MockStorage is a mock of Storage interface.
|
||||||
type MockStorage struct {
|
type MockStorage struct {
|
||||||
ctrl *gomock.Controller
|
ctrl *gomock.Controller
|
||||||
@@ -91,76 +49,3 @@ func (mr *MockStorageMockRecorder) FilterServers(arg0, arg1 interface{}) *gomock
|
|||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterServers", reflect.TypeOf((*MockStorage)(nil).FilterServers), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterServers", reflect.TypeOf((*MockStorage)(nil).FilterServers), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MockUnzipper is a mock of Unzipper interface.
|
|
||||||
type MockUnzipper struct {
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
recorder *MockUnzipperMockRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockUnzipperMockRecorder is the mock recorder for MockUnzipper.
|
|
||||||
type MockUnzipperMockRecorder struct {
|
|
||||||
mock *MockUnzipper
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockUnzipper creates a new mock instance.
|
|
||||||
func NewMockUnzipper(ctrl *gomock.Controller) *MockUnzipper {
|
|
||||||
mock := &MockUnzipper{ctrl: ctrl}
|
|
||||||
mock.recorder = &MockUnzipperMockRecorder{mock}
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|
||||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
|
||||||
func (m *MockUnzipper) EXPECT() *MockUnzipperMockRecorder {
|
|
||||||
return m.recorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// FetchAndExtract mocks base method.
|
|
||||||
func (m *MockUnzipper) FetchAndExtract(arg0 context.Context, arg1 string) (map[string][]byte, error) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
ret := m.ctrl.Call(m, "FetchAndExtract", arg0, arg1)
|
|
||||||
ret0, _ := ret[0].(map[string][]byte)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// FetchAndExtract indicates an expected call of FetchAndExtract.
|
|
||||||
func (mr *MockUnzipperMockRecorder) FetchAndExtract(arg0, arg1 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchAndExtract", reflect.TypeOf((*MockUnzipper)(nil).FetchAndExtract), arg0, arg1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockWarner is a mock of Warner interface.
|
|
||||||
type MockWarner struct {
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
recorder *MockWarnerMockRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockWarnerMockRecorder is the mock recorder for MockWarner.
|
|
||||||
type MockWarnerMockRecorder struct {
|
|
||||||
mock *MockWarner
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockWarner creates a new mock instance.
|
|
||||||
func NewMockWarner(ctrl *gomock.Controller) *MockWarner {
|
|
||||||
mock := &MockWarner{ctrl: ctrl}
|
|
||||||
mock.recorder = &MockWarnerMockRecorder{mock}
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|
||||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
|
||||||
func (m *MockWarner) EXPECT() *MockWarnerMockRecorder {
|
|
||||||
return m.recorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn mocks base method.
|
|
||||||
func (m *MockWarner) Warn(arg0 string) {
|
|
||||||
m.ctrl.T.Helper()
|
|
||||||
m.ctrl.Call(m, "Warn", arg0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn indicates an expected call of Warn.
|
|
||||||
func (mr *MockWarnerMockRecorder) Warn(arg0 interface{}) *gomock.Call {
|
|
||||||
mr.mock.ctrl.T.Helper()
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Warn", reflect.TypeOf((*MockWarner)(nil).Warn), arg0)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -3,4 +3,4 @@ package common
|
|||||||
// Exceptionally, these mocks are exported since they are used by all
|
// Exceptionally, these mocks are exported since they are used by all
|
||||||
// provider subpackages tests, and it reduces test code duplication a lot.
|
// provider subpackages tests, and it reduces test code duplication a lot.
|
||||||
// Note mocks.go might need to be removed before re-generating it.
|
// Note mocks.go might need to be removed before re-generating it.
|
||||||
//go:generate mockgen -destination=mocks.go -package $GOPACKAGE . ParallelResolver,Storage,Unzipper,Warner
|
//go:generate mockgen -destination=mocks.go -package $GOPACKAGE . Storage
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package common
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Storage interface {
|
type Storage interface {
|
||||||
|
|||||||
@@ -4,9 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetConnection gets the connection from the OpenVPN configuration file.
|
// GetConnection gets the connection from the OpenVPN configuration file.
|
||||||
@@ -14,9 +13,9 @@ func (p *Provider) GetConnection(selection settings.ServerSelection, _ bool) (
|
|||||||
connection models.Connection, err error,
|
connection models.Connection, err error,
|
||||||
) {
|
) {
|
||||||
switch selection.VPN {
|
switch selection.VPN {
|
||||||
case vpn.OpenVPN:
|
case constants.OpenVPN:
|
||||||
return getOpenVPNConnection(p.extractor, selection)
|
return getOpenVPNConnection(p.extractor, selection)
|
||||||
case vpn.Wireguard, vpn.AmneziaWg:
|
case constants.Wireguard, constants.AmneziaWg:
|
||||||
return getWireguardConnection(selection), nil
|
return getWireguardConnection(selection), nil
|
||||||
default:
|
default:
|
||||||
return connection, fmt.Errorf("VPN type not supported for custom provider: %s", selection.VPN)
|
return connection, fmt.Errorf("VPN type not supported for custom provider: %s", selection.VPN)
|
||||||
@@ -52,7 +51,7 @@ func getWireguardConnection(selection settings.ServerSelection) (
|
|||||||
connection models.Connection,
|
connection models.Connection,
|
||||||
) {
|
) {
|
||||||
connection = models.Connection{
|
connection = models.Connection{
|
||||||
Type: vpn.Wireguard,
|
Type: constants.Wireguard,
|
||||||
IP: selection.Wireguard.EndpointIP,
|
IP: selection.Wireguard.EndpointIP,
|
||||||
Port: *selection.Wireguard.EndpointPort,
|
Port: *selection.Wireguard.EndpointPort,
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ package custom
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"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/utils"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
|
|||||||
@@ -3,23 +3,24 @@ package cyberghost
|
|||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/cyberghost/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/cyberghost"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, updaterWarner common.Warner,
|
func New(storage common.Storage, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(parallelResolver, updaterWarner),
|
Fetcher: cyberghost.New(parallelResolver, updaterWarner),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,24 +5,25 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/example/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/example"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: remove unneeded arguments once the updater is implemented.
|
// TODO: remove unneeded arguments once the updater is implemented.
|
||||||
func New(storage common.Storage, updaterWarner common.Warner, client *http.Client,
|
func New(storage common.Storage, updaterWarner updaters.Warner, client *http.Client,
|
||||||
unzipper common.Unzipper, parallelResolver common.ParallelResolver,
|
unzipper updaters.Unzipper, parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(updaterWarner, unzipper, client, parallelResolver),
|
Fetcher: example.New(updaterWarner, unzipper, client, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,11 +7,12 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -21,7 +22,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
const provider = providers.Expressvpn
|
const provider = providers.Expressvpn
|
||||||
|
|
||||||
testCases := map[string]struct {
|
testCases := map[string]struct {
|
||||||
filteredServers []models.Server
|
filteredServers []umodels.Server
|
||||||
storageErr error
|
storageErr error
|
||||||
selection settings.ServerSelection
|
selection settings.ServerSelection
|
||||||
ipv6Supported bool
|
ipv6Supported bool
|
||||||
@@ -34,7 +35,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
errMessage: "filtering servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"default OpenVPN TCP port": {
|
"default OpenVPN TCP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
@@ -45,7 +46,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
panicMessage: "no default OpenVPN TCP port is defined!",
|
panicMessage: "no default OpenVPN TCP port is defined!",
|
||||||
},
|
},
|
||||||
"default OpenVPN UDP port": {
|
"default OpenVPN UDP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
@@ -54,18 +55,18 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}.WithDefaults(provider),
|
}.WithDefaults(provider),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.OpenVPN,
|
Type: constants.OpenVPN,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Port: 1195,
|
Port: 1195,
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"default Wireguard port": {
|
"default Wireguard port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
}.WithDefaults(provider),
|
}.WithDefaults(provider),
|
||||||
panicMessage: "no default Wireguard port is defined!",
|
panicMessage: "no default Wireguard port is defined!",
|
||||||
},
|
},
|
||||||
@@ -80,9 +81,9 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
storage.EXPECT().FilterServers(provider, testCase.selection).
|
storage.EXPECT().FilterServers(provider, testCase.selection).
|
||||||
Return(testCase.filteredServers, testCase.storageErr)
|
Return(testCase.filteredServers, testCase.storageErr)
|
||||||
|
|
||||||
unzipper := (common.Unzipper)(nil)
|
unzipper := (updaters.Unzipper)(nil)
|
||||||
warner := (common.Warner)(nil)
|
warner := (updaters.Warner)(nil)
|
||||||
parallelResolver := (common.ParallelResolver)(nil)
|
parallelResolver := (updaters.ParallelResolver)(nil)
|
||||||
provider := New(storage, unzipper, warner, parallelResolver)
|
provider := New(storage, unzipper, warner, parallelResolver)
|
||||||
|
|
||||||
if testCase.panicMessage != "" {
|
if testCase.panicMessage != "" {
|
||||||
|
|||||||
@@ -3,23 +3,24 @@ package expressvpn
|
|||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/expressvpn/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/expressvpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, unzipper common.Unzipper, updaterWarner common.Warner,
|
func New(storage common.Storage, unzipper updaters.Unzipper, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(unzipper, updaterWarner, parallelResolver),
|
Fetcher: expressvpn.New(unzipper, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,23 +5,24 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/fastestvpn/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/fastestvpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client, updaterWarner common.Warner,
|
func New(storage common.Storage, client *http.Client, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client, updaterWarner, parallelResolver),
|
Fetcher: fastestvpn.New(client, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,23 +3,24 @@ package giganews
|
|||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/giganews/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/giganews"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, unzipper common.Unzipper, updaterWarner common.Warner,
|
func New(storage common.Storage, unzipper updaters.Unzipper, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(unzipper, updaterWarner, parallelResolver),
|
Fetcher: giganews.New(unzipper, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,23 +5,24 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/hidemyass/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/hidemyass"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client, updaterWarner common.Warner,
|
func New(storage common.Storage, client *http.Client, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client, updaterWarner, parallelResolver),
|
Fetcher: hidemyass.New(client, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,23 +3,24 @@ package ipvanish
|
|||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/ipvanish/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/ipvanish"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, unzipper common.Unzipper, updaterWarner common.Warner,
|
func New(storage common.Storage, unzipper updaters.Unzipper, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(unzipper, updaterWarner, parallelResolver),
|
Fetcher: ipvanish.New(unzipper, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,11 +8,12 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -22,7 +23,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
const provider = providers.Ivpn
|
const provider = providers.Ivpn
|
||||||
|
|
||||||
testCases := map[string]struct {
|
testCases := map[string]struct {
|
||||||
filteredServers []models.Server
|
filteredServers []umodels.Server
|
||||||
storageErr error
|
storageErr error
|
||||||
selection settings.ServerSelection
|
selection settings.ServerSelection
|
||||||
ipv6Supported bool
|
ipv6Supported bool
|
||||||
@@ -34,7 +35,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
errMessage: "filtering servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"default OpenVPN TCP port": {
|
"default OpenVPN TCP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
@@ -43,14 +44,14 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}.WithDefaults(provider),
|
}.WithDefaults(provider),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.OpenVPN,
|
Type: constants.OpenVPN,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Port: 443,
|
Port: 443,
|
||||||
Protocol: constants.TCP,
|
Protocol: constants.TCP,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"default OpenVPN UDP port": {
|
"default OpenVPN UDP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
@@ -59,21 +60,21 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}.WithDefaults(provider),
|
}.WithDefaults(provider),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.OpenVPN,
|
Type: constants.OpenVPN,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Port: 1194,
|
Port: 1194,
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"default Wireguard port": {
|
"default Wireguard port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}, WgPubKey: "x"},
|
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}, WgPubKey: "x"},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
}.WithDefaults(provider),
|
}.WithDefaults(provider),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.Wireguard,
|
Type: constants.Wireguard,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Port: 58237,
|
Port: 58237,
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
@@ -92,8 +93,8 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
Return(testCase.filteredServers, testCase.storageErr)
|
Return(testCase.filteredServers, testCase.storageErr)
|
||||||
|
|
||||||
client := (*http.Client)(nil)
|
client := (*http.Client)(nil)
|
||||||
warner := (common.Warner)(nil)
|
warner := (updaters.Warner)(nil)
|
||||||
parallelResolver := (common.ParallelResolver)(nil)
|
parallelResolver := (updaters.ParallelResolver)(nil)
|
||||||
provider := New(storage, client, warner, parallelResolver)
|
provider := New(storage, client, warner, parallelResolver)
|
||||||
|
|
||||||
connection, err := provider.GetConnection(testCase.selection, testCase.ipv6Supported)
|
connection, err := provider.GetConnection(testCase.selection, testCase.ipv6Supported)
|
||||||
|
|||||||
@@ -5,23 +5,24 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/ivpn/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/ivpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client, updaterWarner common.Warner,
|
func New(storage common.Storage, client *http.Client, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client, updaterWarner, parallelResolver),
|
Fetcher: ivpn.New(client, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
const provider = providers.Mullvad
|
const provider = providers.Mullvad
|
||||||
|
|
||||||
testCases := map[string]struct {
|
testCases := map[string]struct {
|
||||||
filteredServers []models.Server
|
filteredServers []umodels.Server
|
||||||
storageErr error
|
storageErr error
|
||||||
selection settings.ServerSelection
|
selection settings.ServerSelection
|
||||||
ipv6Supported bool
|
ipv6Supported bool
|
||||||
@@ -34,14 +34,14 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
errMessage: "filtering servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"default Wireguard port": {
|
"default Wireguard port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}, WgPubKey: "x"},
|
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}, WgPubKey: "x"},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
}.WithDefaults(provider),
|
}.WithDefaults(provider),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.Wireguard,
|
Type: constants.Wireguard,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Port: 51820,
|
Port: 51820,
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
|
|||||||
@@ -5,14 +5,15 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/mullvad/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/mullvad"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client,
|
func New(storage common.Storage, client *http.Client,
|
||||||
@@ -20,7 +21,7 @@ func New(storage common.Storage, client *http.Client,
|
|||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client),
|
Fetcher: mullvad.New(client),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,22 +5,23 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/nordvpn/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/nordvpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client, updaterWarner common.Warner,
|
func New(storage common.Storage, client *http.Client, updaterWarner updaters.Warner,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client, updaterWarner),
|
Fetcher: nordvpn.New(client, updaterWarner),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,22 +3,23 @@ package perfectprivacy
|
|||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/perfectprivacy/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/perfectprivacy"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, unzipper common.Unzipper, updaterWarner common.Warner,
|
func New(storage common.Storage, unzipper updaters.Unzipper, updaterWarner updaters.Warner,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(unzipper, updaterWarner),
|
Fetcher: perfectprivacy.New(unzipper, updaterWarner),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,22 +5,23 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/privado/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/privado"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client, updaterWarner common.Warner,
|
func New(storage common.Storage, client *http.Client, updaterWarner updaters.Warner,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client, updaterWarner),
|
Fetcher: privado.New(client, updaterWarner),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,15 +7,16 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/privateinternetaccess/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/privateinternetaccess"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
timeNow func() time.Time
|
timeNow func() time.Time
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
// Port forwarding
|
// Port forwarding
|
||||||
portForwardPath string
|
portForwardPath string
|
||||||
apiIP netip.Addr
|
apiIP netip.Addr
|
||||||
@@ -30,7 +31,7 @@ func New(storage common.Storage, timeNow func() time.Time,
|
|||||||
timeNow: timeNow,
|
timeNow: timeNow,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
portForwardPath: jsonPortForwardPath,
|
portForwardPath: jsonPortForwardPath,
|
||||||
Fetcher: updater.New(client),
|
Fetcher: privateinternetaccess.New(client),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,23 +3,24 @@ package privatevpn
|
|||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/privatevpn/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/privatevpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, unzipper common.Unzipper, updaterWarner common.Warner,
|
func New(storage common.Storage, unzipper updaters.Unzipper, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(unzipper, updaterWarner, parallelResolver),
|
Fetcher: privatevpn.New(unzipper, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,24 +5,25 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/protonvpn/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/protonvpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
internalToExternalPorts map[uint16]uint16
|
internalToExternalPorts map[uint16]uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client, updaterWarner common.Warner,
|
func New(storage common.Storage, client *http.Client, updaterWarner updaters.Warner,
|
||||||
email, password string,
|
email, password string,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client, updaterWarner, email, password),
|
Fetcher: protonvpn.New(client, updaterWarner, email, password),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Provider contains methods to read and modify the openvpn configuration to connect as a client.
|
// Provider contains methods to read and modify the openvpn configuration to connect as a client.
|
||||||
@@ -13,5 +14,5 @@ type Provider interface {
|
|||||||
OpenVPNConfig(connection models.Connection, settings settings.OpenVPN, ipv6Supported bool) (lines []string)
|
OpenVPNConfig(connection models.Connection, settings settings.OpenVPN, ipv6Supported bool) (lines []string)
|
||||||
Name() string
|
Name() string
|
||||||
FetchServers(ctx context.Context, minServers int) (
|
FetchServers(ctx context.Context, minServers int) (
|
||||||
servers []models.Server, err error)
|
servers []umodels.Server, err error)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/provider/airvpn"
|
"github.com/qdm12/gluetun/internal/provider/airvpn"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/custom"
|
"github.com/qdm12/gluetun/internal/provider/custom"
|
||||||
"github.com/qdm12/gluetun/internal/provider/cyberghost"
|
"github.com/qdm12/gluetun/internal/provider/cyberghost"
|
||||||
"github.com/qdm12/gluetun/internal/provider/expressvpn"
|
"github.com/qdm12/gluetun/internal/provider/expressvpn"
|
||||||
@@ -33,6 +32,8 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/provider/vpnunlimited"
|
"github.com/qdm12/gluetun/internal/provider/vpnunlimited"
|
||||||
"github.com/qdm12/gluetun/internal/provider/vyprvpn"
|
"github.com/qdm12/gluetun/internal/provider/vyprvpn"
|
||||||
"github.com/qdm12/gluetun/internal/provider/windscribe"
|
"github.com/qdm12/gluetun/internal/provider/windscribe"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Providers struct {
|
type Providers struct {
|
||||||
@@ -41,7 +42,7 @@ type Providers struct {
|
|||||||
|
|
||||||
type Storage interface {
|
type Storage interface {
|
||||||
FilterServers(provider string, selection settings.ServerSelection) (
|
FilterServers(provider string, selection settings.ServerSelection) (
|
||||||
servers []models.Server, err error)
|
servers []umodels.Server, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Extractor interface {
|
type Extractor interface {
|
||||||
@@ -50,8 +51,8 @@ type Extractor interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewProviders(storage Storage, timeNow func() time.Time,
|
func NewProviders(storage Storage, timeNow func() time.Time,
|
||||||
updaterWarner common.Warner, client *http.Client, unzipper common.Unzipper,
|
updaterWarner updaters.Warner, client *http.Client, unzipper updaters.Unzipper,
|
||||||
parallelResolver common.ParallelResolver, ipFetcher common.IPFetcher,
|
parallelResolver updaters.ParallelResolver, ipFetcher updaters.IPFetcher,
|
||||||
extractor custom.Extractor, credentials settings.Updater,
|
extractor custom.Extractor, credentials settings.Updater,
|
||||||
) *Providers {
|
) *Providers {
|
||||||
//nolint:lll
|
//nolint:lll
|
||||||
|
|||||||
@@ -3,23 +3,24 @@ package purevpn
|
|||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/purevpn/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/purevpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, ipFetcher common.IPFetcher, unzipper common.Unzipper,
|
func New(storage common.Storage, ipFetcher updaters.IPFetcher, unzipper updaters.Unzipper,
|
||||||
updaterWarner common.Warner, parallelResolver common.ParallelResolver,
|
updaterWarner updaters.Warner, parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(ipFetcher, unzipper, updaterWarner, parallelResolver),
|
Fetcher: purevpn.New(ipFetcher, unzipper, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,23 +5,24 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/slickvpn/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/slickvpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client, updaterWarner common.Warner,
|
func New(storage common.Storage, client *http.Client, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client, updaterWarner, parallelResolver),
|
Fetcher: slickvpn.New(client, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,23 +5,24 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/surfshark/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/surfshark"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client, unzipper common.Unzipper,
|
func New(storage common.Storage, client *http.Client, unzipper updaters.Unzipper,
|
||||||
updaterWarner common.Warner, parallelResolver common.ParallelResolver,
|
updaterWarner updaters.Warner, parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client, unzipper, updaterWarner, parallelResolver),
|
Fetcher: surfshark.New(client, unzipper, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/updater/resolver"
|
|
||||||
)
|
|
||||||
|
|
||||||
func parallelResolverSettings(hosts []string) (settings resolver.ParallelSettings) {
|
|
||||||
const (
|
|
||||||
maxFailRatio = 0.1
|
|
||||||
maxDuration = 20 * time.Second
|
|
||||||
betweenDuration = time.Second
|
|
||||||
maxNoNew = 2
|
|
||||||
maxFails = 2
|
|
||||||
)
|
|
||||||
return resolver.ParallelSettings{
|
|
||||||
Hosts: hosts,
|
|
||||||
MaxFailRatio: maxFailRatio,
|
|
||||||
Repeat: resolver.RepeatSettings{
|
|
||||||
MaxDuration: maxDuration,
|
|
||||||
BetweenDuration: betweenDuration,
|
|
||||||
MaxNoNew: maxNoNew,
|
|
||||||
MaxFails: maxFails,
|
|
||||||
SortIPs: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -3,23 +3,24 @@ package torguard
|
|||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/torguard/updater"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/torguard"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, unzipper common.Unzipper, updaterWarner common.Warner,
|
func New(storage common.Storage, unzipper updaters.Unzipper, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(unzipper, updaterWarner, parallelResolver),
|
Fetcher: torguard.New(unzipper, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/updater/resolver"
|
|
||||||
)
|
|
||||||
|
|
||||||
func parallelResolverSettings(hosts []string) (settings resolver.ParallelSettings) {
|
|
||||||
const (
|
|
||||||
maxFailRatio = 0.1
|
|
||||||
maxDuration = 20 * time.Second
|
|
||||||
betweenDuration = time.Second
|
|
||||||
maxNoNew = 2
|
|
||||||
maxFails = 2
|
|
||||||
)
|
|
||||||
return resolver.ParallelSettings{
|
|
||||||
Hosts: hosts,
|
|
||||||
MaxFailRatio: maxFailRatio,
|
|
||||||
Repeat: resolver.RepeatSettings{
|
|
||||||
MaxDuration: maxDuration,
|
|
||||||
BetweenDuration: betweenDuration,
|
|
||||||
MaxNoNew: maxNoNew,
|
|
||||||
MaxFails: maxFails,
|
|
||||||
SortIPs: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Updater struct {
|
|
||||||
unzipper common.Unzipper
|
|
||||||
parallelResolver common.ParallelResolver
|
|
||||||
warner common.Warner
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(unzipper common.Unzipper, warner common.Warner,
|
|
||||||
parallelResolver common.ParallelResolver,
|
|
||||||
) *Updater {
|
|
||||||
return &Updater{
|
|
||||||
unzipper: unzipper,
|
|
||||||
parallelResolver: parallelResolver,
|
|
||||||
warner: warner,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,8 +5,9 @@ import (
|
|||||||
"slices"
|
"slices"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ConnectionDefaults struct {
|
type ConnectionDefaults struct {
|
||||||
@@ -27,7 +28,7 @@ func NewConnectionDefaults(openvpnTCPPort, openvpnUDPPort,
|
|||||||
|
|
||||||
type Storage interface {
|
type Storage interface {
|
||||||
FilterServers(provider string, selection settings.ServerSelection) (
|
FilterServers(provider string, selection settings.ServerSelection) (
|
||||||
servers []models.Server, err error)
|
servers []umodels.Server, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetConnection(provider string,
|
func GetConnection(provider string,
|
||||||
@@ -56,7 +57,7 @@ func GetConnection(provider string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
hostname := server.Hostname
|
hostname := server.Hostname
|
||||||
if selection.VPN == vpn.OpenVPN && server.OvpnX509 != "" {
|
if selection.VPN == constants.OpenVPN && server.OvpnX509 != "" {
|
||||||
// For Windscribe where hostname and
|
// For Windscribe where hostname and
|
||||||
// OpenVPN x509 are not the same.
|
// OpenVPN x509 are not the same.
|
||||||
hostname = server.OvpnX509
|
hostname = server.OvpnX509
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
|
|
||||||
testCases := map[string]struct {
|
testCases := map[string]struct {
|
||||||
provider string
|
provider string
|
||||||
filteredServers []models.Server
|
filteredServers []umodels.Server
|
||||||
filterError error
|
filterError error
|
||||||
serverSelection settings.ServerSelection
|
serverSelection settings.ServerSelection
|
||||||
defaults ConnectionDefaults
|
defaults ConnectionDefaults
|
||||||
@@ -35,9 +35,9 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
errMessage: "filtering servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"server without IPs": {
|
"server without IPs": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{VPN: vpn.OpenVPN, UDP: true},
|
{VPN: constants.OpenVPN, UDP: true},
|
||||||
{VPN: vpn.OpenVPN, UDP: true},
|
{VPN: constants.OpenVPN, UDP: true},
|
||||||
},
|
},
|
||||||
serverSelection: settings.ServerSelection{}.
|
serverSelection: settings.ServerSelection{}.
|
||||||
WithDefaults(providers.Mullvad),
|
WithDefaults(providers.Mullvad),
|
||||||
@@ -49,9 +49,9 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
errMessage: "no connection to pick from",
|
errMessage: "no connection to pick from",
|
||||||
},
|
},
|
||||||
"OpenVPN server with hostname": {
|
"OpenVPN server with hostname": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{
|
{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
UDP: true,
|
UDP: true,
|
||||||
IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})},
|
IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})},
|
||||||
Hostname: "name",
|
Hostname: "name",
|
||||||
@@ -62,7 +62,7 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
defaults: NewConnectionDefaults(443, 1194, 58820),
|
defaults: NewConnectionDefaults(443, 1194, 58820),
|
||||||
randSource: rand.NewSource(0),
|
randSource: rand.NewSource(0),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.OpenVPN,
|
Type: constants.OpenVPN,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
Port: 1194,
|
Port: 1194,
|
||||||
@@ -70,9 +70,9 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
"OpenVPN server with x509": {
|
"OpenVPN server with x509": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{
|
{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
UDP: true,
|
UDP: true,
|
||||||
IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})},
|
IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})},
|
||||||
Hostname: "hostname",
|
Hostname: "hostname",
|
||||||
@@ -84,7 +84,7 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
defaults: NewConnectionDefaults(443, 1194, 58820),
|
defaults: NewConnectionDefaults(443, 1194, 58820),
|
||||||
randSource: rand.NewSource(0),
|
randSource: rand.NewSource(0),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.OpenVPN,
|
Type: constants.OpenVPN,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
Port: 1194,
|
Port: 1194,
|
||||||
@@ -92,9 +92,9 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
"server with IPv4 and IPv6": {
|
"server with IPv4 and IPv6": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{
|
{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
UDP: true,
|
UDP: true,
|
||||||
IPs: []netip.Addr{
|
IPs: []netip.Addr{
|
||||||
netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
@@ -112,16 +112,16 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
defaults: NewConnectionDefaults(443, 1194, 58820),
|
defaults: NewConnectionDefaults(443, 1194, 58820),
|
||||||
randSource: rand.NewSource(0),
|
randSource: rand.NewSource(0),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.OpenVPN,
|
Type: constants.OpenVPN,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
Port: 1194,
|
Port: 1194,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"server with IPv4 and IPv6 and ipv6 supported": {
|
"server with IPv4 and IPv6 and ipv6 supported": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{
|
{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
UDP: true,
|
UDP: true,
|
||||||
IPs: []netip.Addr{
|
IPs: []netip.Addr{
|
||||||
netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
@@ -135,28 +135,28 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
ipv6Supported: true,
|
ipv6Supported: true,
|
||||||
randSource: rand.NewSource(0),
|
randSource: rand.NewSource(0),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.OpenVPN,
|
Type: constants.OpenVPN,
|
||||||
IP: netip.IPv6Unspecified(),
|
IP: netip.IPv6Unspecified(),
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
Port: 1194,
|
Port: 1194,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"mixed servers": {
|
"mixed servers": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{
|
{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
UDP: true,
|
UDP: true,
|
||||||
IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})},
|
IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})},
|
||||||
OvpnX509: "ovpnx509",
|
OvpnX509: "ovpnx509",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
UDP: true,
|
UDP: true,
|
||||||
IPs: []netip.Addr{netip.AddrFrom4([4]byte{2, 2, 2, 2})},
|
IPs: []netip.Addr{netip.AddrFrom4([4]byte{2, 2, 2, 2})},
|
||||||
OvpnX509: "ovpnx509",
|
OvpnX509: "ovpnx509",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
UDP: true,
|
UDP: true,
|
||||||
IPs: []netip.Addr{
|
IPs: []netip.Addr{
|
||||||
netip.AddrFrom4([4]byte{3, 3, 3, 3}),
|
netip.AddrFrom4([4]byte{3, 3, 3, 3}),
|
||||||
@@ -170,7 +170,7 @@ func Test_GetConnection(t *testing.T) {
|
|||||||
defaults: NewConnectionDefaults(443, 1194, 58820),
|
defaults: NewConnectionDefaults(443, 1194, 58820),
|
||||||
randSource: rand.NewSource(0),
|
randSource: rand.NewSource(0),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.OpenVPN,
|
Type: constants.OpenVPN,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
Port: 1194,
|
Port: 1194,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type NoFetcher struct {
|
type NoFetcher struct {
|
||||||
@@ -22,3 +22,11 @@ func (n *NoFetcher) FetchServers(context.Context, int) (
|
|||||||
) {
|
) {
|
||||||
return nil, fmt.Errorf("fetching of servers is not supported for %s", n.providerName)
|
return nil, fmt.Errorf("fetching of servers is not supported for %s", n.providerName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n *NoFetcher) Version() uint16 {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *NoFetcher) Name() string {
|
||||||
|
return n.providerName
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/openvpn"
|
"github.com/qdm12/gluetun/internal/constants/openvpn"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/openvpn/pkcs8"
|
"github.com/qdm12/gluetun/internal/openvpn/pkcs8"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
type OpenVPNProviderSettings struct {
|
type OpenVPNProviderSettings struct {
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ConnectionPicker is a struct that holds the state of the connection pool cycler.
|
// ConnectionPicker is a struct that holds the state of the connection pool cycler.
|
||||||
@@ -89,16 +89,16 @@ func pickConnection(connections []models.Connection,
|
|||||||
|
|
||||||
var targetIP netip.Addr
|
var targetIP netip.Addr
|
||||||
switch selection.VPN {
|
switch selection.VPN {
|
||||||
case vpn.OpenVPN:
|
case constants.OpenVPN:
|
||||||
targetIP = selection.OpenVPN.EndpointIP
|
targetIP = selection.OpenVPN.EndpointIP
|
||||||
case vpn.Wireguard, vpn.AmneziaWg:
|
case constants.Wireguard, constants.AmneziaWg:
|
||||||
targetIP = selection.Wireguard.EndpointIP
|
targetIP = selection.Wireguard.EndpointIP
|
||||||
default:
|
default:
|
||||||
panic("unknown VPN type: " + selection.VPN)
|
panic("unknown VPN type: " + selection.VPN)
|
||||||
}
|
}
|
||||||
targetIPSet := targetIP.IsValid() && !targetIP.IsUnspecified()
|
targetIPSet := targetIP.IsValid() && !targetIP.IsUnspecified()
|
||||||
|
|
||||||
if targetIPSet && selection.VPN == vpn.Wireguard {
|
if targetIPSet && selection.VPN == constants.Wireguard {
|
||||||
// we need the right public key
|
// we need the right public key
|
||||||
return getTargetIPConnection(connections, targetIP)
|
return getTargetIPConnection(connections, targetIP)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -58,56 +58,56 @@ func Test_pickConnection(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"openvpn_cycles": {
|
"openvpn_cycles": {
|
||||||
connections: []models.Connection{
|
connections: []models.Connection{
|
||||||
{Type: vpn.OpenVPN, Port: 1, Hostname: "one"},
|
{Type: constants.OpenVPN, Port: 1, Hostname: "one"},
|
||||||
{Type: vpn.OpenVPN, Port: 2, Hostname: "two"},
|
{Type: constants.OpenVPN, Port: 2, Hostname: "two"},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{VPN: vpn.OpenVPN},
|
selection: settings.ServerSelection{VPN: constants.OpenVPN},
|
||||||
connection1: models.Connection{
|
connection1: models.Connection{
|
||||||
Type: vpn.OpenVPN, Port: 1,
|
Type: constants.OpenVPN, Port: 1,
|
||||||
Hostname: "one",
|
Hostname: "one",
|
||||||
},
|
},
|
||||||
connection2: models.Connection{
|
connection2: models.Connection{
|
||||||
Type: vpn.OpenVPN, Port: 2,
|
Type: constants.OpenVPN, Port: 2,
|
||||||
Hostname: "two",
|
Hostname: "two",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"openvpn_endpoint_ip_overrides_cycle_pick": {
|
"openvpn_endpoint_ip_overrides_cycle_pick": {
|
||||||
connections: []models.Connection{
|
connections: []models.Connection{
|
||||||
{Type: vpn.OpenVPN, Hostname: "one", IP: netip.AddrFrom4([4]byte{1, 1, 1, 1})},
|
{Type: constants.OpenVPN, Hostname: "one", IP: netip.AddrFrom4([4]byte{1, 1, 1, 1})},
|
||||||
{Type: vpn.OpenVPN, Hostname: "two", IP: netip.AddrFrom4([4]byte{2, 2, 2, 2})},
|
{Type: constants.OpenVPN, Hostname: "two", IP: netip.AddrFrom4([4]byte{2, 2, 2, 2})},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
EndpointIP: netip.AddrFrom4([4]byte{9, 9, 9, 9}),
|
EndpointIP: netip.AddrFrom4([4]byte{9, 9, 9, 9}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
connection1: models.Connection{
|
connection1: models.Connection{
|
||||||
Type: vpn.OpenVPN, Hostname: "one",
|
Type: constants.OpenVPN, Hostname: "one",
|
||||||
IP: netip.AddrFrom4([4]byte{9, 9, 9, 9}),
|
IP: netip.AddrFrom4([4]byte{9, 9, 9, 9}),
|
||||||
},
|
},
|
||||||
connection2: models.Connection{
|
connection2: models.Connection{
|
||||||
Type: vpn.OpenVPN, Hostname: "two",
|
Type: constants.OpenVPN, Hostname: "two",
|
||||||
IP: netip.AddrFrom4([4]byte{9, 9, 9, 9}),
|
IP: netip.AddrFrom4([4]byte{9, 9, 9, 9}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"wireguard_endpoint_ip_picks_target": {
|
"wireguard_endpoint_ip_picks_target": {
|
||||||
connections: []models.Connection{
|
connections: []models.Connection{
|
||||||
{Type: vpn.Wireguard, Hostname: "one", IP: netip.AddrFrom4([4]byte{1, 1, 1, 1})},
|
{Type: constants.Wireguard, Hostname: "one", IP: netip.AddrFrom4([4]byte{1, 1, 1, 1})},
|
||||||
{Type: vpn.Wireguard, Hostname: "two", IP: netip.AddrFrom4([4]byte{2, 2, 2, 2})},
|
{Type: constants.Wireguard, Hostname: "two", IP: netip.AddrFrom4([4]byte{2, 2, 2, 2})},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
Wireguard: settings.WireguardSelection{
|
Wireguard: settings.WireguardSelection{
|
||||||
EndpointIP: netip.AddrFrom4([4]byte{2, 2, 2, 2}),
|
EndpointIP: netip.AddrFrom4([4]byte{2, 2, 2, 2}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
connection1: models.Connection{
|
connection1: models.Connection{
|
||||||
Type: vpn.Wireguard, Hostname: "two",
|
Type: constants.Wireguard, Hostname: "two",
|
||||||
IP: netip.AddrFrom4([4]byte{2, 2, 2, 2}),
|
IP: netip.AddrFrom4([4]byte{2, 2, 2, 2}),
|
||||||
},
|
},
|
||||||
connection2: models.Connection{
|
connection2: models.Connection{
|
||||||
Type: vpn.Wireguard, Hostname: "two",
|
Type: constants.Wireguard, Hostname: "two",
|
||||||
IP: netip.AddrFrom4([4]byte{2, 2, 2, 2}),
|
IP: netip.AddrFrom4([4]byte{2, 2, 2, 2}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,15 +4,14 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func getPort(selection settings.ServerSelection,
|
func getPort(selection settings.ServerSelection,
|
||||||
defaultOpenVPNTCP, defaultOpenVPNUDP, defaultWireguard uint16,
|
defaultOpenVPNTCP, defaultOpenVPNUDP, defaultWireguard uint16,
|
||||||
) (port uint16) {
|
) (port uint16) {
|
||||||
switch selection.VPN {
|
switch selection.VPN {
|
||||||
case vpn.Wireguard:
|
case constants.Wireguard:
|
||||||
customPort := *selection.Wireguard.EndpointPort
|
customPort := *selection.Wireguard.EndpointPort
|
||||||
if customPort > 0 {
|
if customPort > 0 {
|
||||||
return customPort
|
return customPort
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -37,7 +36,7 @@ func Test_GetPort(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"OpenVPN UDP": {
|
"OpenVPN UDP": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
CustomPort: uint16Ptr(0),
|
CustomPort: uint16Ptr(0),
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
@@ -50,7 +49,7 @@ func Test_GetPort(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"OpenVPN UDP no default port defined": {
|
"OpenVPN UDP no default port defined": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
CustomPort: uint16Ptr(0),
|
CustomPort: uint16Ptr(0),
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
@@ -60,7 +59,7 @@ func Test_GetPort(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"OpenVPN TCP": {
|
"OpenVPN TCP": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
CustomPort: uint16Ptr(0),
|
CustomPort: uint16Ptr(0),
|
||||||
Protocol: constants.TCP,
|
Protocol: constants.TCP,
|
||||||
@@ -71,7 +70,7 @@ func Test_GetPort(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"OpenVPN TCP no default port defined": {
|
"OpenVPN TCP no default port defined": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
CustomPort: uint16Ptr(0),
|
CustomPort: uint16Ptr(0),
|
||||||
Protocol: constants.TCP,
|
Protocol: constants.TCP,
|
||||||
@@ -81,7 +80,7 @@ func Test_GetPort(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"OpenVPN custom port": {
|
"OpenVPN custom port": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
CustomPort: uint16Ptr(1234),
|
CustomPort: uint16Ptr(1234),
|
||||||
},
|
},
|
||||||
@@ -90,14 +89,14 @@ func Test_GetPort(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"Wireguard": {
|
"Wireguard": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
}.WithDefaults(""),
|
}.WithDefaults(""),
|
||||||
defaultWireguard: defaultWireguard,
|
defaultWireguard: defaultWireguard,
|
||||||
port: defaultWireguard,
|
port: defaultWireguard,
|
||||||
},
|
},
|
||||||
"Wireguard custom port": {
|
"Wireguard custom port": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
Wireguard: settings.WireguardSelection{
|
Wireguard: settings.WireguardSelection{
|
||||||
EndpointPort: uint16Ptr(1234),
|
EndpointPort: uint16Ptr(1234),
|
||||||
},
|
},
|
||||||
@@ -107,7 +106,7 @@ func Test_GetPort(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"Wireguard no default port defined": {
|
"Wireguard no default port defined": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
}.WithDefaults(""),
|
}.WithDefaults(""),
|
||||||
panics: "no default Wireguard port is defined!",
|
panics: "no default Wireguard port is defined!",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,12 +2,11 @@ package utils
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func getProtocol(selection settings.ServerSelection) (protocol string) {
|
func getProtocol(selection settings.ServerSelection) (protocol string) {
|
||||||
if selection.VPN == vpn.OpenVPN && selection.OpenVPN.Protocol == constants.TCP {
|
if selection.VPN == constants.OpenVPN && selection.OpenVPN.Protocol == constants.TCP {
|
||||||
return constants.TCP
|
return constants.TCP
|
||||||
}
|
}
|
||||||
return constants.UDP
|
return constants.UDP
|
||||||
@@ -17,7 +16,7 @@ func filterByProtocol(selection settings.ServerSelection,
|
|||||||
serverTCP, serverUDP bool,
|
serverTCP, serverUDP bool,
|
||||||
) (filtered bool) {
|
) (filtered bool) {
|
||||||
switch selection.VPN {
|
switch selection.VPN {
|
||||||
case vpn.Wireguard:
|
case constants.Wireguard:
|
||||||
return !serverUDP
|
return !serverUDP
|
||||||
default: // OpenVPN
|
default: // OpenVPN
|
||||||
wantTCP := selection.OpenVPN.Protocol == constants.TCP
|
wantTCP := selection.OpenVPN.Protocol == constants.TCP
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -21,7 +20,7 @@ func Test_getProtocol(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"OpenVPN UDP": {
|
"OpenVPN UDP": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
},
|
},
|
||||||
@@ -30,7 +29,7 @@ func Test_getProtocol(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"OpenVPN TCP": {
|
"OpenVPN TCP": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
Protocol: constants.TCP,
|
Protocol: constants.TCP,
|
||||||
},
|
},
|
||||||
@@ -39,7 +38,7 @@ func Test_getProtocol(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"Wireguard": {
|
"Wireguard": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
},
|
},
|
||||||
protocol: constants.UDP,
|
protocol: constants.UDP,
|
||||||
},
|
},
|
||||||
@@ -67,21 +66,21 @@ func Test_filterByProtocol(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
"Wireguard and server has UDP": {
|
"Wireguard and server has UDP": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
},
|
},
|
||||||
serverUDP: true,
|
serverUDP: true,
|
||||||
filtered: false,
|
filtered: false,
|
||||||
},
|
},
|
||||||
"Wireguard and server has not UDP": {
|
"Wireguard and server has not UDP": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
},
|
},
|
||||||
serverUDP: false,
|
serverUDP: false,
|
||||||
filtered: true,
|
filtered: true,
|
||||||
},
|
},
|
||||||
"OpenVPN UDP and server has UDP": {
|
"OpenVPN UDP and server has UDP": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
},
|
},
|
||||||
@@ -91,7 +90,7 @@ func Test_filterByProtocol(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"OpenVPN UDP and server has not UDP": {
|
"OpenVPN UDP and server has not UDP": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
},
|
},
|
||||||
@@ -101,7 +100,7 @@ func Test_filterByProtocol(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"OpenVPN TCP and server has TCP": {
|
"OpenVPN TCP and server has TCP": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
Protocol: constants.TCP,
|
Protocol: constants.TCP,
|
||||||
},
|
},
|
||||||
@@ -111,7 +110,7 @@ func Test_filterByProtocol(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"OpenVPN TCP and server has not TCP": {
|
"OpenVPN TCP and server has not TCP": {
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.OpenVPN,
|
VPN: constants.OpenVPN,
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
OpenVPN: settings.OpenVPNSelection{
|
||||||
Protocol: constants.TCP,
|
Protocol: constants.TCP,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -6,22 +6,23 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
"github.com/qdm12/gluetun/internal/provider/vpnsecure/updater"
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/vpnsecure"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client, updaterWarner common.Warner,
|
func New(storage common.Storage, client *http.Client, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client, updaterWarner, parallelResolver),
|
Fetcher: vpnsecure.New(client, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Updater struct {
|
|
||||||
client *http.Client
|
|
||||||
parallelResolver common.ParallelResolver
|
|
||||||
warner common.Warner
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(client *http.Client, warner common.Warner,
|
|
||||||
parallelResolver common.ParallelResolver,
|
|
||||||
) *Updater {
|
|
||||||
return &Updater{
|
|
||||||
client: client,
|
|
||||||
parallelResolver: parallelResolver,
|
|
||||||
warner: warner,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,22 +4,23 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
"github.com/qdm12/gluetun/internal/provider/vpnunlimited/updater"
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/vpnunlimited"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, unzipper common.Unzipper, updaterWarner common.Warner,
|
func New(storage common.Storage, unzipper updaters.Unzipper, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(unzipper, updaterWarner, parallelResolver),
|
Fetcher: vpnunlimited.New(unzipper, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/updater/resolver"
|
|
||||||
)
|
|
||||||
|
|
||||||
func parallelResolverSettings(hosts []string) (settings resolver.ParallelSettings) {
|
|
||||||
const (
|
|
||||||
maxFailRatio = 0.1
|
|
||||||
maxDuration = 20 * time.Second
|
|
||||||
betweenDuration = time.Second
|
|
||||||
maxNoNew = 2
|
|
||||||
maxFails = 2
|
|
||||||
)
|
|
||||||
return resolver.ParallelSettings{
|
|
||||||
Hosts: hosts,
|
|
||||||
MaxFailRatio: maxFailRatio,
|
|
||||||
Repeat: resolver.RepeatSettings{
|
|
||||||
MaxDuration: maxDuration,
|
|
||||||
BetweenDuration: betweenDuration,
|
|
||||||
MaxNoNew: maxNoNew,
|
|
||||||
MaxFails: maxFails,
|
|
||||||
SortIPs: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Updater struct {
|
|
||||||
unzipper common.Unzipper
|
|
||||||
parallelResolver common.ParallelResolver
|
|
||||||
warner common.Warner
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(unzipper common.Unzipper, warner common.Warner,
|
|
||||||
parallelResolver common.ParallelResolver,
|
|
||||||
) *Updater {
|
|
||||||
return &Updater{
|
|
||||||
unzipper: unzipper,
|
|
||||||
parallelResolver: parallelResolver,
|
|
||||||
warner: warner,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,22 +4,23 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
"github.com/qdm12/gluetun/internal/provider/vyprvpn/updater"
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/vyprvpn"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, unzipper common.Unzipper, updaterWarner common.Warner,
|
func New(storage common.Storage, unzipper updaters.Unzipper, updaterWarner updaters.Warner,
|
||||||
parallelResolver common.ParallelResolver,
|
parallelResolver updaters.ParallelResolver,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(unzipper, updaterWarner, parallelResolver),
|
Fetcher: vyprvpn.New(unzipper, updaterWarner, parallelResolver),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Updater struct {
|
|
||||||
unzipper common.Unzipper
|
|
||||||
parallelResolver common.ParallelResolver
|
|
||||||
warner common.Warner
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(unzipper common.Unzipper, warner common.Warner,
|
|
||||||
parallelResolver common.ParallelResolver,
|
|
||||||
) *Updater {
|
|
||||||
return &Updater{
|
|
||||||
unzipper: unzipper,
|
|
||||||
parallelResolver: parallelResolver,
|
|
||||||
warner: warner,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,11 +8,12 @@ import (
|
|||||||
|
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -22,7 +23,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
const provider = providers.Windscribe
|
const provider = providers.Windscribe
|
||||||
|
|
||||||
testCases := map[string]struct {
|
testCases := map[string]struct {
|
||||||
filteredServers []models.Server
|
filteredServers []umodels.Server
|
||||||
storageErr error
|
storageErr error
|
||||||
selection settings.ServerSelection
|
selection settings.ServerSelection
|
||||||
ipv6Supported bool
|
ipv6Supported bool
|
||||||
@@ -35,7 +36,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
errMessage: "filtering servers: test error",
|
errMessage: "filtering servers: test error",
|
||||||
},
|
},
|
||||||
"default OpenVPN TCP port": {
|
"default OpenVPN TCP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
@@ -44,14 +45,14 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}.WithDefaults(provider),
|
}.WithDefaults(provider),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.OpenVPN,
|
Type: constants.OpenVPN,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Port: 443,
|
Port: 443,
|
||||||
Protocol: constants.TCP,
|
Protocol: constants.TCP,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"default OpenVPN UDP port": {
|
"default OpenVPN UDP port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
@@ -60,21 +61,21 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}.WithDefaults(provider),
|
}.WithDefaults(provider),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.OpenVPN,
|
Type: constants.OpenVPN,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Port: 1194,
|
Port: 1194,
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"default Wireguard port": {
|
"default Wireguard port": {
|
||||||
filteredServers: []models.Server{
|
filteredServers: []umodels.Server{
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}, WgPubKey: "x"},
|
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}, WgPubKey: "x"},
|
||||||
},
|
},
|
||||||
selection: settings.ServerSelection{
|
selection: settings.ServerSelection{
|
||||||
VPN: vpn.Wireguard,
|
VPN: constants.Wireguard,
|
||||||
}.WithDefaults(provider),
|
}.WithDefaults(provider),
|
||||||
connection: models.Connection{
|
connection: models.Connection{
|
||||||
Type: vpn.Wireguard,
|
Type: constants.Wireguard,
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
||||||
Port: 1194,
|
Port: 1194,
|
||||||
Protocol: constants.UDP,
|
Protocol: constants.UDP,
|
||||||
@@ -93,7 +94,7 @@ func Test_Provider_GetConnection(t *testing.T) {
|
|||||||
Return(testCase.filteredServers, testCase.storageErr)
|
Return(testCase.filteredServers, testCase.storageErr)
|
||||||
|
|
||||||
client := (*http.Client)(nil)
|
client := (*http.Client)(nil)
|
||||||
warner := (common.Warner)(nil)
|
warner := (updaters.Warner)(nil)
|
||||||
provider := New(storage, client, warner)
|
provider := New(storage, client, warner)
|
||||||
|
|
||||||
if testCase.panicMessage != "" {
|
if testCase.panicMessage != "" {
|
||||||
|
|||||||
@@ -6,21 +6,22 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/internal/provider/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
"github.com/qdm12/gluetun/internal/provider/windscribe/updater"
|
updaters "github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/providers/windscribe"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider struct {
|
type Provider struct {
|
||||||
storage common.Storage
|
storage common.Storage
|
||||||
connPicker *utils.ConnectionPicker
|
connPicker *utils.ConnectionPicker
|
||||||
common.Fetcher
|
updaters.Fetcher
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(storage common.Storage, client *http.Client, updaterWarner common.Warner,
|
func New(storage common.Storage, client *http.Client, updaterWarner updaters.Warner,
|
||||||
) *Provider {
|
) *Provider {
|
||||||
return &Provider{
|
return &Provider{
|
||||||
storage: storage,
|
storage: storage,
|
||||||
connPicker: utils.NewConnectionPicker(),
|
connPicker: utils.NewConnectionPicker(),
|
||||||
Fetcher: updater.New(client, updaterWarner),
|
Fetcher: windscribe.New(client, updaterWarner),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package publicip
|
package publicip
|
||||||
|
|
||||||
import "github.com/qdm12/gluetun/internal/models"
|
import "github.com/qdm12/gluetun/pkg/publicip/models"
|
||||||
|
|
||||||
// GetData returns the public IP data obtained from the last
|
// GetData returns the public IP data obtained from the last
|
||||||
// fetch. It is notably used by the HTTP control server.
|
// fetch. It is notably used by the HTTP control server.
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/publicip/api"
|
||||||
"github.com/qdm12/gluetun/internal/publicip/api"
|
"github.com/qdm12/gluetun/pkg/publicip/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Loop struct {
|
type Loop struct {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/publicip/api"
|
"github.com/qdm12/gluetun/pkg/publicip/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (l *Loop) update(partialUpdate settings.PublicIP) (err error) {
|
func (l *Loop) update(partialUpdate settings.PublicIP) (err error) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
publicipmodels "github.com/qdm12/gluetun/pkg/publicip/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type VPNLooper interface {
|
type VPNLooper interface {
|
||||||
@@ -27,7 +28,7 @@ type PortForwarding interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type PublicIPLoop interface {
|
type PublicIPLoop interface {
|
||||||
GetData() (data models.PublicIP)
|
GetData() (data publicipmodels.PublicIP)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Storage interface {
|
type Storage interface {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
uconstants "github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newOpenvpnHandler(ctx context.Context, looper VPNLooper, w warner) http.Handler {
|
func newOpenvpnHandler(ctx context.Context, looper VPNLooper, w warner) http.Handler {
|
||||||
@@ -60,7 +60,7 @@ func (h *openvpnHandler) getStatus(w http.ResponseWriter) {
|
|||||||
openVPNStatus := vpnStatus
|
openVPNStatus := vpnStatus
|
||||||
if vpnStatus != constants.Stopped {
|
if vpnStatus != constants.Stopped {
|
||||||
vpnSettings := h.looper.GetSettings()
|
vpnSettings := h.looper.GetSettings()
|
||||||
if vpnSettings.Type != vpn.OpenVPN {
|
if vpnSettings.Type != uconstants.OpenVPN {
|
||||||
openVPNStatus = constants.Stopped
|
openVPNStatus = constants.Stopped
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -88,9 +88,9 @@ func (h *openvpnHandler) setStatus(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
var outcome string
|
var outcome string
|
||||||
loopSettings := h.looper.GetSettings()
|
loopSettings := h.looper.GetSettings()
|
||||||
if status == constants.Running && loopSettings.Type != vpn.OpenVPN {
|
if status == constants.Running && loopSettings.Type != uconstants.OpenVPN {
|
||||||
// Stop Wireguard if it was the selected type and we want to start OpenVPN
|
// Stop Wireguard if it was the selected type and we want to start OpenVPN
|
||||||
loopSettings.Type = vpn.OpenVPN
|
loopSettings.Type = uconstants.OpenVPN
|
||||||
outcome = h.looper.SetSettings(h.ctx, loopSettings)
|
outcome = h.looper.SetSettings(h.ctx, loopSettings)
|
||||||
} else {
|
} else {
|
||||||
// Only update status of OpenVPN
|
// Only update status of OpenVPN
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package storage
|
|||||||
import (
|
import (
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func copyServer(server models.Server) (serverCopy models.Server) {
|
func copyServer(server models.Server) (serverCopy models.Server) {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import (
|
|||||||
"net/netip"
|
"net/netip"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// FilterServers filter servers for the given provider and according
|
// FilterServers filter servers for the given provider and according
|
||||||
@@ -57,7 +56,7 @@ func filterServer(server models.Server,
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if server.VPN != vpn.Wireguard &&
|
if server.VPN != constants.Wireguard &&
|
||||||
filterByProtocol(selection, server.TCP, server.UDP) {
|
filterByProtocol(selection, server.TCP, server.UDP) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -157,7 +156,7 @@ func filterByProtocol(selection settings.ServerSelection,
|
|||||||
serverTCP, serverUDP bool,
|
serverTCP, serverUDP bool,
|
||||||
) (filtered bool) {
|
) (filtered bool) {
|
||||||
switch selection.VPN {
|
switch selection.VPN {
|
||||||
case vpn.Wireguard:
|
case constants.Wireguard:
|
||||||
return !serverUDP
|
return !serverUDP
|
||||||
default: // OpenVPN
|
default: // OpenVPN
|
||||||
wantTCP := selection.OpenVPN.Protocol == constants.TCP
|
wantTCP := selection.OpenVPN.Protocol == constants.TCP
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// FlushToFile flushes the merged servers data to the file
|
// FlushToFile flushes the merged servers data to the file
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func commaJoin(slice []string) string {
|
func commaJoin(slice []string) string {
|
||||||
@@ -147,7 +146,7 @@ func noServerFoundError(selection settings.ServerSelection) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
targetIP := selection.OpenVPN.EndpointIP
|
targetIP := selection.OpenVPN.EndpointIP
|
||||||
if selection.VPN == vpn.Wireguard {
|
if selection.VPN == constants.Wireguard {
|
||||||
targetIP = selection.Wireguard.EndpointIP
|
targetIP = selection.Wireguard.EndpointIP
|
||||||
}
|
}
|
||||||
if targetIP.IsValid() {
|
if targetIP.IsValid() {
|
||||||
|
|||||||
@@ -8,13 +8,14 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/format"
|
"github.com/qdm12/gluetun/internal/format"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *Storage) mergeServers(hardcoded, persisted models.AllServers) models.AllServers {
|
func (s *Storage) mergeServers(hardcoded, persisted models.AllServers) models.AllServers {
|
||||||
allProviders := providers.All()
|
allProviders := providers.All()
|
||||||
merged := models.AllServers{
|
merged := models.AllServers{
|
||||||
Version: hardcoded.Version,
|
Version: hardcoded.Version,
|
||||||
ProviderToServers: make(map[string]models.Servers, len(allProviders)),
|
ProviderToServers: make(map[string]umodels.Servers, len(allProviders)),
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, provider := range allProviders {
|
for _, provider := range allProviders {
|
||||||
@@ -28,8 +29,8 @@ func (s *Storage) mergeServers(hardcoded, persisted models.AllServers) models.Al
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) mergeProviderServers(provider string,
|
func (s *Storage) mergeProviderServers(provider string,
|
||||||
hardcoded, persisted models.Servers,
|
hardcoded, persisted umodels.Servers,
|
||||||
) (merged models.Servers) {
|
) (merged umodels.Servers) {
|
||||||
nowTimestamp := time.Now().Unix()
|
nowTimestamp := time.Now().Unix()
|
||||||
if persisted.Timestamp > nowTimestamp {
|
if persisted.Timestamp > nowTimestamp {
|
||||||
s.logger.Warn(fmt.Sprintf(
|
s.logger.Warn(fmt.Sprintf(
|
||||||
@@ -48,7 +49,7 @@ func (s *Storage) mergeProviderServers(provider string,
|
|||||||
return persisted
|
return persisted
|
||||||
}
|
}
|
||||||
|
|
||||||
persistedServerKeyToServer := make(map[string]models.Server)
|
persistedServerKeyToServer := make(map[string]umodels.Server)
|
||||||
for _, persistedServer := range persisted.Servers {
|
for _, persistedServer := range persisted.Servers {
|
||||||
if persistedServer.Keep {
|
if persistedServer.Keep {
|
||||||
persistedServerKeyToServer[persistedServer.Key()] = persistedServer
|
persistedServerKeyToServer[persistedServer.Key()] = persistedServer
|
||||||
@@ -56,7 +57,7 @@ func (s *Storage) mergeProviderServers(provider string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
merged = hardcoded // use all fields from hardcoded
|
merged = hardcoded // use all fields from hardcoded
|
||||||
merged.Servers = make([]models.Server, 0, len(hardcoded.Servers)+len(persistedServerKeyToServer))
|
merged.Servers = make([]umodels.Server, 0, len(hardcoded.Servers)+len(persistedServerKeyToServer))
|
||||||
|
|
||||||
for _, hardcodedServer := range hardcoded.Servers {
|
for _, hardcodedServer := range hardcoded.Servers {
|
||||||
hardcodedServerKey := hardcodedServer.Key()
|
hardcodedServerKey := hardcodedServer.Key()
|
||||||
@@ -75,7 +76,7 @@ func (s *Storage) mergeProviderServers(provider string,
|
|||||||
merged.Servers = append(merged.Servers, persistedServer)
|
merged.Servers = append(merged.Servers, persistedServer)
|
||||||
}
|
}
|
||||||
|
|
||||||
sort.Sort(models.SortableServers(merged.Servers))
|
sort.Sort(umodels.SortableServers(merged.Servers))
|
||||||
|
|
||||||
return merged
|
return merged
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
"golang.org/x/text/cases"
|
"golang.org/x/text/cases"
|
||||||
"golang.org/x/text/language"
|
"golang.org/x/text/language"
|
||||||
)
|
)
|
||||||
@@ -48,7 +49,7 @@ func (s *Storage) extractServersFromBytes(b []byte, hardcodedVersions map[string
|
|||||||
// Note schema version is at map key "version" as number
|
// Note schema version is at map key "version" as number
|
||||||
|
|
||||||
allProviders := providers.All()
|
allProviders := providers.All()
|
||||||
servers.ProviderToServers = make(map[string]models.Servers, len(allProviders))
|
servers.ProviderToServers = make(map[string]umodels.Servers, len(allProviders))
|
||||||
titleCaser := cases.Title(language.English)
|
titleCaser := cases.Title(language.English)
|
||||||
for _, provider := range allProviders {
|
for _, provider := range allProviders {
|
||||||
hardcodedVersion, ok := hardcodedVersions[provider]
|
hardcodedVersion, ok := hardcodedVersions[provider]
|
||||||
@@ -81,7 +82,7 @@ func (s *Storage) extractServersFromBytes(b []byte, hardcodedVersions map[string
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) readServers(provider string, hardcodedVersion uint16,
|
func (s *Storage) readServers(provider string, hardcodedVersion uint16,
|
||||||
rawMessage json.RawMessage, titleCaser cases.Caser) (servers models.Servers,
|
rawMessage json.RawMessage, titleCaser cases.Caser) (servers umodels.Servers,
|
||||||
versionsMatch bool, err error,
|
versionsMatch bool, err error,
|
||||||
) {
|
) {
|
||||||
provider = titleCaser.String(provider)
|
provider = titleCaser.String(provider)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
@@ -58,7 +59,7 @@ func Test_extractServersFromBytes(t *testing.T) {
|
|||||||
providers.Cyberghost: 1,
|
providers.Cyberghost: 1,
|
||||||
}),
|
}),
|
||||||
persisted: models.AllServers{
|
persisted: models.AllServers{
|
||||||
ProviderToServers: map[string]models.Servers{},
|
ProviderToServers: map[string]umodels.Servers{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"same versions": {
|
"same versions": {
|
||||||
@@ -69,7 +70,7 @@ func Test_extractServersFromBytes(t *testing.T) {
|
|||||||
providers.Cyberghost: 1,
|
providers.Cyberghost: 1,
|
||||||
}),
|
}),
|
||||||
persisted: models.AllServers{
|
persisted: models.AllServers{
|
||||||
ProviderToServers: map[string]models.Servers{
|
ProviderToServers: map[string]umodels.Servers{
|
||||||
providers.Cyberghost: {Version: 1},
|
providers.Cyberghost: {Version: 1},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -85,7 +86,7 @@ func Test_extractServersFromBytes(t *testing.T) {
|
|||||||
"Cyberghost servers from file discarded because they have version 1 and hardcoded servers have version 2",
|
"Cyberghost servers from file discarded because they have version 1 and hardcoded servers have version 2",
|
||||||
},
|
},
|
||||||
persisted: models.AllServers{
|
persisted: models.AllServers{
|
||||||
ProviderToServers: map[string]models.Servers{},
|
ProviderToServers: map[string]umodels.Servers{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
"github.com/qdm12/gluetun/internal/constants/providers"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SetServers sets the given servers for the given provider
|
// SetServers sets the given servers for the given provider
|
||||||
@@ -13,7 +14,7 @@ import (
|
|||||||
// to file.
|
// to file.
|
||||||
// Note the servers given are not copied so the caller must
|
// Note the servers given are not copied so the caller must
|
||||||
// NOT MUTATE them after calling this method.
|
// NOT MUTATE them after calling this method.
|
||||||
func (s *Storage) SetServers(provider string, servers []models.Server) (err error) {
|
func (s *Storage) SetServers(provider string, servers []umodels.Server) (err error) {
|
||||||
if provider == providers.Custom {
|
if provider == providers.Custom {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -57,12 +58,12 @@ func (s *Storage) Format(provider, format string) (formatted string, err error)
|
|||||||
defer s.mergedMutex.RUnlock()
|
defer s.mergedMutex.RUnlock()
|
||||||
|
|
||||||
serversObject := s.getMergedServersObject(provider)
|
serversObject := s.getMergedServersObject(provider)
|
||||||
return serversObject.Format(provider, format)
|
return models.FormatServers(serversObject, provider, format)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServersAreEqual returns whether the servers for the provider
|
// ServersAreEqual returns whether the servers for the provider
|
||||||
// in storage are equal to the servers slice given.
|
// in storage are equal to the servers slice given.
|
||||||
func (s *Storage) ServersAreEqual(provider string, servers []models.Server) (equal bool) {
|
func (s *Storage) ServersAreEqual(provider string, servers []umodels.Server) (equal bool) {
|
||||||
if provider == providers.Custom {
|
if provider == providers.Custom {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -86,7 +87,7 @@ func (s *Storage) ServersAreEqual(provider string, servers []models.Server) (equ
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Storage) getMergedServersObject(provider string) (serversObject models.Servers) {
|
func (s *Storage) getMergedServersObject(provider string) (serversObject umodels.Servers) {
|
||||||
serversObject, ok := s.mergedServers.ProviderToServers[provider]
|
serversObject, ok := s.mergedServers.ProviderToServers[provider]
|
||||||
if !ok {
|
if !ok {
|
||||||
panicOnProviderMissingHardcoded(provider)
|
panicOnProviderMissingHardcoded(provider)
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider"
|
"github.com/qdm12/gluetun/internal/provider"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Providers interface {
|
type Providers interface {
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Provider interface {
|
type Provider interface {
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
"github.com/qdm12/gluetun/pkg/updaters/common"
|
||||||
"github.com/qdm12/gluetun/internal/updater/unzip"
|
"github.com/qdm12/gluetun/pkg/updaters/unzip"
|
||||||
"golang.org/x/text/cases"
|
"golang.org/x/text/cases"
|
||||||
"golang.org/x/text/language"
|
"golang.org/x/text/language"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (l *Loop) cleanup() {
|
func (l *Loop) cleanup() {
|
||||||
@@ -49,9 +49,9 @@ func (l *Loop) cleanup() {
|
|||||||
|
|
||||||
func getVPNInterface(settings settings.VPN) string {
|
func getVPNInterface(settings settings.VPN) string {
|
||||||
switch settings.Type {
|
switch settings.Type {
|
||||||
case vpn.OpenVPN:
|
case constants.OpenVPN:
|
||||||
return settings.OpenVPN.Interface
|
return settings.OpenVPN.Interface
|
||||||
case vpn.Wireguard:
|
case constants.Wireguard:
|
||||||
return settings.Wireguard.Interface
|
return settings.Wireguard.Interface
|
||||||
default:
|
default:
|
||||||
panic("invalid VPN type: " + settings.Type)
|
panic("invalid VPN type: " + settings.Type)
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
portforward "github.com/qdm12/gluetun/internal/portforward"
|
portforward "github.com/qdm12/gluetun/internal/portforward"
|
||||||
"github.com/qdm12/gluetun/internal/provider"
|
"github.com/qdm12/gluetun/internal/provider"
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
|
umodels "github.com/qdm12/gluetun/pkg/updaters/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Firewall interface {
|
type Firewall interface {
|
||||||
@@ -46,7 +47,7 @@ type Provider interface {
|
|||||||
OpenVPNConfig(connection models.Connection, settings settings.OpenVPN, ipv6Supported bool) (lines []string)
|
OpenVPNConfig(connection models.Connection, settings settings.OpenVPN, ipv6Supported bool) (lines []string)
|
||||||
Name() string
|
Name() string
|
||||||
FetchServers(ctx context.Context, minServers int) (
|
FetchServers(ctx context.Context, minServers int) (
|
||||||
servers []models.Server, err error)
|
servers []umodels.Server, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type PortForwarder interface {
|
type PortForwarder interface {
|
||||||
@@ -57,7 +58,7 @@ type PortForwarder interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Storage interface {
|
type Storage interface {
|
||||||
FilterServers(provider string, selection settings.ServerSelection) (servers []models.Server, err error)
|
FilterServers(provider string, selection settings.ServerSelection) (servers []umodels.Server, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type NetLinker interface {
|
type NetLinker interface {
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ package vpn
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/netlink"
|
"github.com/qdm12/gluetun/internal/netlink"
|
||||||
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (l *Loop) isIPv6Used(settings settings.VPN) bool {
|
func (l *Loop) isIPv6Used(settings settings.VPN) bool {
|
||||||
@@ -11,14 +11,14 @@ func (l *Loop) isIPv6Used(settings settings.VPN) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
switch settings.Type {
|
switch settings.Type {
|
||||||
case vpn.AmneziaWg:
|
case constants.AmneziaWg:
|
||||||
for _, prefix := range settings.AmneziaWg.Wireguard.Addresses {
|
for _, prefix := range settings.AmneziaWg.Wireguard.Addresses {
|
||||||
if prefix.Addr().Is6() {
|
if prefix.Addr().Is6() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
case vpn.OpenVPN:
|
case constants.OpenVPN:
|
||||||
link, err := l.netLinker.LinkByName(settings.OpenVPN.Interface)
|
link, err := l.netLinker.LinkByName(settings.OpenVPN.Interface)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.logger.Warnf("assuming IPv6 is not supported, cannot get OpenVPN link by name: %v", err)
|
l.logger.Warnf("assuming IPv6 is not supported, cannot get OpenVPN link by name: %v", err)
|
||||||
@@ -35,7 +35,7 @@ func (l *Loop) isIPv6Used(settings settings.VPN) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
case vpn.Wireguard:
|
case constants.Wireguard:
|
||||||
for _, prefix := range settings.Wireguard.Addresses {
|
for _, prefix := range settings.Wireguard.Addresses {
|
||||||
if prefix.Addr().Is6() {
|
if prefix.Addr().Is6() {
|
||||||
return true
|
return true
|
||||||
|
|||||||
+5
-5
@@ -4,8 +4,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
uconstants "github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/log"
|
"github.com/qdm12/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -34,15 +34,15 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) {
|
|||||||
var err error
|
var err error
|
||||||
subLogger := l.logger.New(log.SetComponent(settings.Type))
|
subLogger := l.logger.New(log.SetComponent(settings.Type))
|
||||||
switch settings.Type {
|
switch settings.Type {
|
||||||
case vpn.AmneziaWg:
|
case uconstants.AmneziaWg:
|
||||||
vpnInterface = settings.AmneziaWg.Wireguard.Interface
|
vpnInterface = settings.AmneziaWg.Wireguard.Interface
|
||||||
vpnRunner, connection, err = setupAmneziaWg(ctx, l.netLinker, l.fw,
|
vpnRunner, connection, err = setupAmneziaWg(ctx, l.netLinker, l.fw,
|
||||||
providerConf, settings, l.ipv6SupportLevel, subLogger)
|
providerConf, settings, l.ipv6SupportLevel, subLogger)
|
||||||
case vpn.OpenVPN:
|
case uconstants.OpenVPN:
|
||||||
vpnInterface = settings.OpenVPN.Interface
|
vpnInterface = settings.OpenVPN.Interface
|
||||||
vpnRunner, connection, err = setupOpenVPN(ctx, l.fw,
|
vpnRunner, connection, err = setupOpenVPN(ctx, l.fw,
|
||||||
l.openvpnConf, providerConf, settings, l.ipv6SupportLevel, l.cmder, subLogger)
|
l.openvpnConf, providerConf, settings, l.ipv6SupportLevel, l.cmder, subLogger)
|
||||||
case vpn.Wireguard:
|
case uconstants.Wireguard:
|
||||||
vpnInterface = settings.Wireguard.Interface
|
vpnInterface = settings.Wireguard.Interface
|
||||||
vpnRunner, connection, err = setupWireguard(ctx, l.netLinker, l.fw,
|
vpnRunner, connection, err = setupWireguard(ctx, l.netLinker, l.fw,
|
||||||
providerConf, settings, l.ipv6SupportLevel, subLogger)
|
providerConf, settings, l.ipv6SupportLevel, subLogger)
|
||||||
@@ -56,7 +56,7 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) {
|
|||||||
tunnelUpData := tunnelUpData{
|
tunnelUpData := tunnelUpData{
|
||||||
upCommand: *settings.UpCommand,
|
upCommand: *settings.UpCommand,
|
||||||
pmtud: tunnelUpPMTUDData{
|
pmtud: tunnelUpPMTUDData{
|
||||||
enabled: settings.Type != vpn.Wireguard || *settings.Wireguard.MTU == 0,
|
enabled: settings.Type != uconstants.Wireguard || *settings.Wireguard.MTU == 0,
|
||||||
vpnType: settings.Type,
|
vpnType: settings.Type,
|
||||||
network: connection.Protocol,
|
network: connection.Protocol,
|
||||||
ipv6: l.isIPv6Used(settings),
|
ipv6: l.isIPv6Used(settings),
|
||||||
|
|||||||
@@ -9,12 +9,12 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/netlink"
|
"github.com/qdm12/gluetun/internal/netlink"
|
||||||
"github.com/qdm12/gluetun/internal/pmtud"
|
"github.com/qdm12/gluetun/internal/pmtud"
|
||||||
pconstants "github.com/qdm12/gluetun/internal/pmtud/constants"
|
pconstants "github.com/qdm12/gluetun/internal/pmtud/constants"
|
||||||
"github.com/qdm12/gluetun/internal/pmtud/tcp"
|
"github.com/qdm12/gluetun/internal/pmtud/tcp"
|
||||||
"github.com/qdm12/gluetun/internal/version"
|
"github.com/qdm12/gluetun/internal/version"
|
||||||
|
uconstants "github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
"github.com/qdm12/log"
|
"github.com/qdm12/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ type tunnelUpPMTUDData struct {
|
|||||||
// enabled is notably false if the user specifies a custom MTU.
|
// enabled is notably false if the user specifies a custom MTU.
|
||||||
enabled bool
|
enabled bool
|
||||||
// vpnType is used to find the maximum VPN header overhead.
|
// vpnType is used to find the maximum VPN header overhead.
|
||||||
// It can be [vpn.Wireguard] or [vpn.OpenVPN].
|
// It can be [constants.Wireguard] or [constants.OpenVPN].
|
||||||
vpnType string
|
vpnType string
|
||||||
// network is used to find the network level header overhead.
|
// network is used to find the network level header overhead.
|
||||||
// It can be [constants.UDP] or [constants.TCP].
|
// It can be [constants.UDP] or [constants.TCP].
|
||||||
@@ -53,7 +53,7 @@ type tunnelUpPMTUDData struct {
|
|||||||
|
|
||||||
func (l *Loop) onTunnelUp(ctx, loopCtx context.Context, data tunnelUpData) {
|
func (l *Loop) onTunnelUp(ctx, loopCtx context.Context, data tunnelUpData) {
|
||||||
switch vpnType := l.GetSettings().Type; vpnType {
|
switch vpnType := l.GetSettings().Type; vpnType {
|
||||||
case vpn.Wireguard, vpn.AmneziaWg:
|
case uconstants.Wireguard, uconstants.AmneziaWg:
|
||||||
l.logger.Infof("%s setup is complete. "+
|
l.logger.Infof("%s setup is complete. "+
|
||||||
"Note %s is a silent protocol and it may or may not work, without giving any error message. "+
|
"Note %s is a silent protocol and it may or may not work, without giving any error message. "+
|
||||||
"Typically i/o timeout errors indicate the %s connection is not working.",
|
"Typically i/o timeout errors indicate the %s connection is not working.",
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/pkg/publicip/models"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/updaters/constants"
|
||||||
)
|
)
|
||||||
|
|
||||||
type cloudflare struct {
|
type cloudflare struct {
|
||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/pkg/publicip/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type echoip struct {
|
type echoip struct {
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user