Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port forwarding mock provider to test restart functionality #2273

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion internal/configuration/settings/portforward.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ type PortForwarding struct {
// provider using Wireguard for a provider where Wireguard is not
// natively supported but custom port forwarding code is available.
// It defaults to the empty string, meaning the current provider
// should be the one used for port forwarding.
// should be the one used for port forwarding. It can also be set
// to "mock" to run a mock port forwarding for testing.
// It cannot be nil for the internal state.
Provider *string `json:"provider"`
// Filepath is the port forwarding status file path
Expand All @@ -46,6 +47,7 @@ func (p PortForwarding) Validate(vpnProvider string) (err error) {
providerSelected = *p.Provider
}
validProviders := []string{
providers.Mock,
providers.PrivateInternetAccess,
providers.Protonvpn,
}
Expand Down
2 changes: 2 additions & 0 deletions internal/constants/providers/providers.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const (
HideMyAss = "hidemyass"
Ipvanish = "ipvanish"
Ivpn = "ivpn"
Mock = "mock"
Mullvad = "mullvad"
Nordvpn = "nordvpn"
Perfectprivacy = "perfect privacy"
Expand Down Expand Up @@ -40,6 +41,7 @@ func All() []string {
HideMyAss,
Ipvanish,
Ivpn,
Mock,
Mullvad,
Nordvpn,
Perfectprivacy,
Expand Down
19 changes: 12 additions & 7 deletions internal/netlink/ipv6.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,21 @@ func (n *NetLink) IsIPv6Supported() (supported bool, err error) {
// as IPv6 routes at container start, see:
// https://github.com/qdm12/gluetun/issues/1241#issuecomment-1333405949
for _, route := range routes {
link, err := n.LinkByIndex(route.LinkIndex)
if err != nil {
return false, fmt.Errorf("finding link corresponding to route: %w", err)
}

sourceIsIPv6 := route.Src.IsValid() && route.Src.Is6()
destinationIsIPv6 := route.Dst.IsValid() && route.Dst.Addr().Is6()
if sourceIsIPv6 || destinationIsIPv6 {
link, err := n.LinkByIndex(route.LinkIndex)
if err != nil {
return false, fmt.Errorf("finding IPv6 supported link: %w", err)
}
n.debugLogger.Debugf("IPv6 is supported by link %s", link.Name)
return true, nil
switch {
case !sourceIsIPv6 && !destinationIsIPv6,
destinationIsIPv6 && route.Dst.Addr().IsLoopback():
continue
}

n.debugLogger.Debugf("IPv6 is supported by link %s", link.Name)
return true, nil
}

n.debugLogger.Debugf("IPv6 is not supported after searching %d routes",
Expand Down
4 changes: 4 additions & 0 deletions internal/portforward/loop.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,14 @@ func (l *Loop) UpdateWith(partialUpdate Settings) (err error) {
}

func (l *Loop) Stop() (err error) {
l.logger.Debug("loop stopping")
l.runCancel()
<-l.runDone
l.logger.Debug("run is done")

if l.service != nil {
l.logger.Debug("Stopping service")
defer l.logger.Debug("service stopped!")
return l.service.Stop()
}
return nil
Expand Down
74 changes: 74 additions & 0 deletions internal/provider/mock/provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package mock

import (
"context"
"time"

"github.com/qdm12/gluetun/internal/configuration/settings"
"github.com/qdm12/gluetun/internal/constants/providers"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/provider/utils"
"github.com/qdm12/log"
)

type Provider struct {
logger *log.Logger
}

func New() *Provider {
logger := log.New(log.SetComponent("mock provider"),
log.SetCallerFile(true), log.SetCallerLine(true))
return &Provider{
logger: logger,
}
}

func (p *Provider) Name() string {
return providers.Mock
}

func (p *Provider) GetConnection(_ settings.ServerSelection, _ bool) (
connection models.Connection, err error) {
p.logger.Info("getting connection")
return models.Connection{}, nil
}

func (p *Provider) OpenVPNConfig(_ models.Connection,
_ settings.OpenVPN, _ bool) (lines []string) {
p.logger.Info("generating openvpn config")
return nil
}

func (p *Provider) FetchServers(_ context.Context, _ int) (
servers []models.Server, err error) {
p.logger.Info("fetching servers")
return servers, nil
}

func (p *Provider) PortForward(_ context.Context,
_ utils.PortForwardObjects) (port uint16, err error) {
const mockPort = 12345
p.logger.Info("port forward")
return mockPort, nil
}

func (p *Provider) KeepPortForward(ctx context.Context,
_ utils.PortForwardObjects) (err error) {
p.logger.Info("keeping port forward start")
defer p.logger.Info("keeping port forward exited")
const keepAlivePeriod = 10 * time.Second
keepAliveTimer := time.NewTimer(keepAlivePeriod)
for {
select {
case <-ctx.Done():
p.logger.Info("keeping port forward context canceled")
if !keepAliveTimer.Stop() {
<-keepAliveTimer.C
}
return ctx.Err()
case <-keepAliveTimer.C:
p.logger.Info("keeping port forward ticked")
keepAliveTimer.Reset(keepAlivePeriod)
}
}
}
2 changes: 2 additions & 0 deletions internal/provider/providers.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/qdm12/gluetun/internal/provider/hidemyass"
"github.com/qdm12/gluetun/internal/provider/ipvanish"
"github.com/qdm12/gluetun/internal/provider/ivpn"
"github.com/qdm12/gluetun/internal/provider/mock"
"github.com/qdm12/gluetun/internal/provider/mullvad"
"github.com/qdm12/gluetun/internal/provider/nordvpn"
"github.com/qdm12/gluetun/internal/provider/perfectprivacy"
Expand Down Expand Up @@ -66,6 +67,7 @@ func NewProviders(storage Storage, timeNow func() time.Time,
providers.HideMyAss: hidemyass.New(storage, randSource, client, updaterWarner, parallelResolver),
providers.Ipvanish: ipvanish.New(storage, randSource, unzipper, updaterWarner, parallelResolver),
providers.Ivpn: ivpn.New(storage, randSource, client, updaterWarner, parallelResolver),
providers.Mock: mock.New(),
providers.Mullvad: mullvad.New(storage, randSource, client),
providers.Nordvpn: nordvpn.New(storage, randSource, client, updaterWarner),
providers.Perfectprivacy: perfectprivacy.New(storage, randSource, unzipper, updaterWarner),
Expand Down
16 changes: 6 additions & 10 deletions internal/provider/torguard/openvpnconf.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,13 @@ func (p *Provider) OpenVPNConfig(connection models.Connection,
AuthUserPass: true,
Ciphers: []string{
openvpn.AES256gcm,
openvpn.AES128gcm,
},
Auth: openvpn.SHA256,
MssFix: 1450, //nolint:gomnd
TunMTUExtra: 32, //nolint:gomnd
SndBuf: 393216, //nolint:gomnd
RcvBuf: 393216, //nolint:gomnd
Ping: 5, //nolint:gomnd
RenegDisabled: true,
KeyDirection: "1",
CAs: []string{"MIIDMTCCAhmgAwIBAgIJAKnGGJK6qLqSMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNVBAMMCVRHLVZQTi1DQTAgFw0xOTA1MjExNDIzMTFaGA8yMDU5MDUxMTE0MjMxMVowFDESMBAGA1UEAwwJVEctVlBOLUNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlv0UgPD3xVAvhhP6q1HCmeAWbH+9HPkyQ2P6qM5oHY5dntjmq8YT48FZGHWv7+s9O47v6Bv7rEc4UwQx15cc2LByivX2JwmE8JACvNfwEnZXYAPq9WU3ZgRrAGvA09ItuLqK2fQ4A7h8bFhmyxCbSzP1sSIT/zJY6ebuh5rDQSMJRMaoI0t1zorEZ7PlEmh+o0w5GPs0D0vY50UcnEzB4GOdWC9pJREwEqppWYLN7RRdG8JyIqmA59mhARCnQFUo38HWic4trxFe71jtD7YInNV7ShQtg0S0sXo36Rqfz72Jo08qqI70dNs5DN1aGNkQ/tRK9DhL5DLmTkaCw7mEFQIDAQABo4GDMIGAMB0GA1UdDgQWBBR7DcymXBp6u/jAaZOPUjUhEyhXfjBEBgNVHSMEPTA7gBR7DcymXBp6u/jAaZOPUjUhEyhXfqEYpBYwFDESMBAGA1UEAwwJVEctVlBOLUNBggkAqcYYkrqoupIwDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAE79ngbdSlP7IBbfnJ+2Ju7vqt9/GyhcsYtjibp6gsMUxKlD8HuvlSGj5kNO5wiwN7XXqsjYtJfdhmzzVbXksi8Fnbnfa8GhFl4IAjLJ5cxaWOxjr6wx2AhIs+BVVARjaU7iTK91RXJnl6u7UDHTkQylBTl7wgpMeG6GjhaHfcOL1t7D2w8x23cTO+p+n53P3cBq+9TiAUORdzXJvbCxlPMDSDArsgBjC57W7dtdnZo7gTfQG77JTDFBeSwPwLF7PjBB4S6rzU/4fcYwy83XKP6zDn9tgUJDnpFb/7jJ/PbNkK4BWYJp3XytOtt66v9SEKw+v/fJ+VkjU16vE/9Q3h4="}, //nolint:lll
TLSAuth: "770e8de5fc56e0248cc7b5aab56be80d0e19cbf003c1b3ed68efbaf08613c3a1a019dac6a4b84f13a6198f73229ffc21fa512394e288f82aa2cf0180f01fb3eb1a71e00a077a20f6d7a83633f5b4f47f27e30617eaf8485dd8c722a8606d56b3c183f65da5d3c9001a8cbdb96c793d936251098b24fe52a6dd2472e98cfccbc466e63520d63ade7a0eacc36208c3142a1068236a52142fbb7b3ed83d785e12a28261bccfb3bcb62a8d2f6d18f5df5f3652e59c5627d8d9c8f7877c4d7b08e19a5c363556ba68d392be78b75152dd55ba0f74d45089e84f77f4492d886524ea6c82b9f4dd83d46528d4f5c3b51cfeaf2838d938bd0597c426b0e440434f2c451f", //nolint:lll
Auth: openvpn.SHA256,
TunMTUExtra: 32, //nolint:gomnd
KeyDirection: "1",
CAs: []string{"MIIDMTCCAhmgAwIBAgIJAKnGGJK6qLqSMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNVBAMMCVRHLVZQTi1DQTAgFw0xOTA1MjExNDIzMTFaGA8yMDU5MDUxMTE0MjMxMVowFDESMBAGA1UEAwwJVEctVlBOLUNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlv0UgPD3xVAvhhP6q1HCmeAWbH+9HPkyQ2P6qM5oHY5dntjmq8YT48FZGHWv7+s9O47v6Bv7rEc4UwQx15cc2LByivX2JwmE8JACvNfwEnZXYAPq9WU3ZgRrAGvA09ItuLqK2fQ4A7h8bFhmyxCbSzP1sSIT/zJY6ebuh5rDQSMJRMaoI0t1zorEZ7PlEmh+o0w5GPs0D0vY50UcnEzB4GOdWC9pJREwEqppWYLN7RRdG8JyIqmA59mhARCnQFUo38HWic4trxFe71jtD7YInNV7ShQtg0S0sXo36Rqfz72Jo08qqI70dNs5DN1aGNkQ/tRK9DhL5DLmTkaCw7mEFQIDAQABo4GDMIGAMB0GA1UdDgQWBBR7DcymXBp6u/jAaZOPUjUhEyhXfjBEBgNVHSMEPTA7gBR7DcymXBp6u/jAaZOPUjUhEyhXfqEYpBYwFDESMBAGA1UEAwwJVEctVlBOLUNBggkAqcYYkrqoupIwDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAE79ngbdSlP7IBbfnJ+2Ju7vqt9/GyhcsYtjibp6gsMUxKlD8HuvlSGj5kNO5wiwN7XXqsjYtJfdhmzzVbXksi8Fnbnfa8GhFl4IAjLJ5cxaWOxjr6wx2AhIs+BVVARjaU7iTK91RXJnl6u7UDHTkQylBTl7wgpMeG6GjhaHfcOL1t7D2w8x23cTO+p+n53P3cBq+9TiAUORdzXJvbCxlPMDSDArsgBjC57W7dtdnZo7gTfQG77JTDFBeSwPwLF7PjBB4S6rzU/4fcYwy83XKP6zDn9tgUJDnpFb/7jJ/PbNkK4BWYJp3XytOtt66v9SEKw+v/fJ+VkjU16vE/9Q3h4="}, //nolint:lll
TLSAuth: "770e8de5fc56e0248cc7b5aab56be80d0e19cbf003c1b3ed68efbaf08613c3a1a019dac6a4b84f13a6198f73229ffc21fa512394e288f82aa2cf0180f01fb3eb1a71e00a077a20f6d7a83633f5b4f47f27e30617eaf8485dd8c722a8606d56b3c183f65da5d3c9001a8cbdb96c793d936251098b24fe52a6dd2472e98cfccbc466e63520d63ade7a0eacc36208c3142a1068236a52142fbb7b3ed83d785e12a28261bccfb3bcb62a8d2f6d18f5df5f3652e59c5627d8d9c8f7877c4d7b08e19a5c363556ba68d392be78b75152dd55ba0f74d45089e84f77f4492d886524ea6c82b9f4dd83d46528d4f5c3b51cfeaf2838d938bd0597c426b0e440434f2c451f", //nolint:lll
}
return utils.OpenVPNConfig(providerSettings, connection, settings, ipv6Supported)
}
4 changes: 4 additions & 0 deletions internal/storage/servers.json
Original file line number Diff line number Diff line change
Expand Up @@ -49904,6 +49904,10 @@
}
]
},
"mock": {
"version": 1,
"timestamp": 0
},
"mullvad": {
"version": 4,
"timestamp": 1687957586,
Expand Down
Loading