diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index 01d6d84f..d69e2dc2 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -29,6 +29,7 @@ import ( "github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/netlink" "github.com/qdm12/gluetun/internal/openvpn" + "github.com/qdm12/gluetun/internal/openvpn/extract" "github.com/qdm12/gluetun/internal/portforward" "github.com/qdm12/gluetun/internal/pprof" "github.com/qdm12/gluetun/internal/provider" @@ -383,8 +384,9 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, unzipper := unzip.New(httpClient) parallelResolver := resolver.NewParallelResolver(allSettings.Updater.DNSAddress) - providers := provider.NewProviders(storage, time.Now, - updaterLogger, httpClient, unzipper, parallelResolver, ipFetcher) + openvpnFileExtractor := extract.New() + providers := provider.NewProviders(storage, time.Now, updaterLogger, + httpClient, unzipper, parallelResolver, ipFetcher, openvpnFileExtractor) vpnLogger := logger.New(log.SetComponent("vpn")) vpnLooper := vpn.NewLoop(allSettings.VPN, allSettings.Firewall.VPNInputPorts, diff --git a/internal/cli/openvpnconfig.go b/internal/cli/openvpnconfig.go index 31223873..85c1b8cb 100644 --- a/internal/cli/openvpnconfig.go +++ b/internal/cli/openvpnconfig.go @@ -10,6 +10,7 @@ import ( "github.com/qdm12/gluetun/internal/configuration/sources" "github.com/qdm12/gluetun/internal/constants" + "github.com/qdm12/gluetun/internal/openvpn/extract" "github.com/qdm12/gluetun/internal/provider" "github.com/qdm12/gluetun/internal/publicip/ipinfo" "github.com/qdm12/gluetun/internal/storage" @@ -56,9 +57,10 @@ func (c *CLI) OpenvpnConfig(logger OpenvpnConfigLogger, source sources.Source) e warner := (Warner)(nil) parallelResolver := (ParallelResolver)(nil) ipFetcher := (IPFetcher)(nil) + openvpnFileExtractor := extract.New() providers := provider.NewProviders(storage, time.Now, warner, client, - unzipper, parallelResolver, ipFetcher) + unzipper, parallelResolver, ipFetcher, openvpnFileExtractor) providerConf := providers.Get(*allSettings.VPN.Provider.Name) connection, err := providerConf.GetConnection(allSettings.VPN.Provider.ServerSelection) if err != nil { diff --git a/internal/cli/update.go b/internal/cli/update.go index 483b9be7..bd1285ff 100644 --- a/internal/cli/update.go +++ b/internal/cli/update.go @@ -12,6 +12,7 @@ import ( "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/openvpn/extract" "github.com/qdm12/gluetun/internal/provider" "github.com/qdm12/gluetun/internal/publicip/ipinfo" "github.com/qdm12/gluetun/internal/storage" @@ -76,9 +77,10 @@ func (c *CLI) Update(ctx context.Context, args []string, logger UpdaterLogger) e unzipper := unzip.New(httpClient) parallelResolver := resolver.NewParallelResolver(options.DNSAddress) ipFetcher := ipinfo.New(httpClient) + openvpnFileExtractor := extract.New() providers := provider.NewProviders(storage, time.Now, logger, httpClient, - unzipper, parallelResolver, ipFetcher) + unzipper, parallelResolver, ipFetcher, openvpnFileExtractor) updater := updater.New(httpClient, storage, providers, logger) err = updater.UpdateServers(ctx, options.Providers) diff --git a/internal/dns/interfaces.go b/internal/dns/interfaces.go index a6308272..efd1d4be 100644 --- a/internal/dns/interfaces.go +++ b/internal/dns/interfaces.go @@ -4,8 +4,6 @@ import ( "context" "github.com/qdm12/dns/pkg/unbound" - "github.com/qdm12/gluetun/internal/configuration/settings" - "github.com/qdm12/gluetun/internal/models" ) type Configurator interface { @@ -15,15 +13,3 @@ type Configurator interface { stdoutLines, stderrLines chan string, waitError chan error, err error) Version(ctx context.Context) (version string, err error) } - -type statusManager interface { - GetStatus() (status models.LoopStatus) - SetStatus(status models.LoopStatus) - ApplyStatus(ctx context.Context, status models.LoopStatus) ( - outcome string, err error) -} - -type stateManager interface { - GetSettings() (settings settings.DNS) - SetSettings(ctx context.Context, settings settings.DNS) (outcome string) -} diff --git a/internal/dns/loop.go b/internal/dns/loop.go index 44d76ace..c9991ad1 100644 --- a/internal/dns/loop.go +++ b/internal/dns/loop.go @@ -15,8 +15,8 @@ import ( ) type Loop struct { - statusManager statusManager - state stateManager + statusManager *loopstate.State + state *state.State conf Configurator resolvConf string blockBuilder blacklist.Builder diff --git a/internal/httpproxy/logger.go b/internal/httpproxy/logger.go index d60e1c4c..b7648605 100644 --- a/internal/httpproxy/logger.go +++ b/internal/httpproxy/logger.go @@ -1,21 +1,12 @@ package httpproxy type Logger interface { + infoErrorer Debug(s string) - infoer Warn(s string) - errorer } type infoErrorer interface { - infoer - errorer -} - -type infoer interface { Info(s string) -} - -type errorer interface { Error(s string) } diff --git a/internal/httpproxy/loop.go b/internal/httpproxy/loop.go index c87f9c61..fd604f7f 100644 --- a/internal/httpproxy/loop.go +++ b/internal/httpproxy/loop.go @@ -13,8 +13,8 @@ import ( ) type Loop struct { - statusManager statusManager - state StateManager + statusManager *loopstate.State + state *state.State // Other objects logger Logger // Internal channels and locks @@ -25,18 +25,6 @@ type Loop struct { backoffTime time.Duration } -type statusManager interface { - GetStatus() (status models.LoopStatus) - SetStatus(status models.LoopStatus) - ApplyStatus(ctx context.Context, status models.LoopStatus) ( - outcome string, err error) -} - -type StateManager interface { - GetSettings() settings.HTTPProxy - SetSettings(ctx context.Context, settings settings.HTTPProxy) (outcome string) -} - const defaultBackoffTime = 10 * time.Second func NewLoop(logger Logger, settings settings.HTTPProxy) *Loop { diff --git a/internal/portforward/interfaces.go b/internal/portforward/interfaces.go index 428b1333..a2e2ad5f 100644 --- a/internal/portforward/interfaces.go +++ b/internal/portforward/interfaces.go @@ -2,29 +2,9 @@ package portforward import ( "context" - - "github.com/qdm12/gluetun/internal/configuration/settings" - "github.com/qdm12/gluetun/internal/models" ) type PortAllower interface { SetAllowedPort(ctx context.Context, port uint16, intf string) (err error) RemoveAllowedPort(ctx context.Context, port uint16) (err error) } - -type statusManager interface { - GetStatus() (status models.LoopStatus) - SetStatus(status models.LoopStatus) - ApplyStatus(ctx context.Context, status models.LoopStatus) ( - outcome string, err error) -} - -type StateManager interface { - GetSettings() (settings settings.PortForwarding) - SetSettings(ctx context.Context, - settings settings.PortForwarding) (outcome string) - GetPortForwarded() (port uint16) - SetPortForwarded(port uint16) - GetStartData() (startData StartData) - SetStartData(startData StartData) -} diff --git a/internal/portforward/loop.go b/internal/portforward/loop.go index b3f8e24b..ae147aba 100644 --- a/internal/portforward/loop.go +++ b/internal/portforward/loop.go @@ -13,8 +13,8 @@ import ( ) type Loop struct { - statusManager statusManager - state StateManager + statusManager *loopstate.State + state *state.State // Objects client *http.Client portAllower PortAllower diff --git a/internal/provider/custom/connection.go b/internal/provider/custom/connection.go index 9a879a18..b5b426d3 100644 --- a/internal/provider/custom/connection.go +++ b/internal/provider/custom/connection.go @@ -27,7 +27,7 @@ func (p *Provider) GetConnection(selection settings.ServerSelection) ( } } -func getOpenVPNConnection(extractor extractor, +func getOpenVPNConnection(extractor Extractor, selection settings.ServerSelection) ( connection models.Connection, err error) { _, connection, err = extractor.Data(*selection.OpenVPN.ConfFile) diff --git a/internal/provider/custom/interfaces.go b/internal/provider/custom/interfaces.go index c7f462c1..a876efb9 100644 --- a/internal/provider/custom/interfaces.go +++ b/internal/provider/custom/interfaces.go @@ -2,7 +2,7 @@ package custom import "github.com/qdm12/gluetun/internal/models" -type extractor interface { +type Extractor interface { Data(filepath string) (lines []string, connection models.Connection, err error) } diff --git a/internal/provider/custom/provider.go b/internal/provider/custom/provider.go index 0bc5c7b9..d052f4bb 100644 --- a/internal/provider/custom/provider.go +++ b/internal/provider/custom/provider.go @@ -2,20 +2,19 @@ package custom import ( "github.com/qdm12/gluetun/internal/constants/providers" - "github.com/qdm12/gluetun/internal/openvpn/extract" "github.com/qdm12/gluetun/internal/provider/common" "github.com/qdm12/gluetun/internal/provider/utils" ) type Provider struct { - extractor extractor + extractor Extractor utils.NoPortForwarder common.Fetcher } -func New() *Provider { +func New(extractor Extractor) *Provider { return &Provider{ - extractor: extract.New(), + extractor: extractor, NoPortForwarder: utils.NewNoPortForwarding(providers.Custom), Fetcher: utils.NewNoFetcher(providers.Custom), } diff --git a/internal/provider/providers.go b/internal/provider/providers.go index b2f00f58..bd0ef286 100644 --- a/internal/provider/providers.go +++ b/internal/provider/providers.go @@ -43,14 +43,20 @@ type Storage interface { GetServerByName(provider, name string) (server models.Server, ok bool) } +type Extractor interface { + Data(filepath string) (lines []string, + connection models.Connection, err error) +} + func NewProviders(storage Storage, timeNow func() time.Time, updaterWarner common.Warner, client *http.Client, unzipper common.Unzipper, - parallelResolver common.ParallelResolver, ipFetcher common.IPFetcher) *Providers { + parallelResolver common.ParallelResolver, ipFetcher common.IPFetcher, + extractor custom.Extractor) *Providers { randSource := rand.NewSource(timeNow().UnixNano()) //nolint:lll providerNameToProvider := map[string]Provider{ - providers.Custom: custom.New(), + providers.Custom: custom.New(extractor), providers.Cyberghost: cyberghost.New(storage, randSource, parallelResolver), providers.Expressvpn: expressvpn.New(storage, randSource, unzipper, updaterWarner, parallelResolver), providers.Fastestvpn: fastestvpn.New(storage, randSource, unzipper, updaterWarner, parallelResolver), diff --git a/internal/publicip/interfaces.go b/internal/publicip/interfaces.go index 369fedd2..490d19c2 100644 --- a/internal/publicip/interfaces.go +++ b/internal/publicip/interfaces.go @@ -4,25 +4,9 @@ import ( "context" "net" - "github.com/qdm12/gluetun/internal/configuration/settings" - "github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/publicip/ipinfo" ) -type statusManager interface { - GetStatus() (status models.LoopStatus) - SetStatus(status models.LoopStatus) - ApplyStatus(ctx context.Context, status models.LoopStatus) ( - outcome string, err error) -} - -type stateManager interface { - GetData() (data ipinfo.Response) - SetData(data ipinfo.Response) - GetSettings() (settings settings.PublicIP) - SetSettings(ctx context.Context, settings settings.PublicIP) (outcome string) -} - type Fetcher interface { FetchInfo(ctx context.Context, ip net.IP) ( result ipinfo.Response, err error) diff --git a/internal/publicip/loop.go b/internal/publicip/loop.go index 0ab5ae62..1954c090 100644 --- a/internal/publicip/loop.go +++ b/internal/publicip/loop.go @@ -11,8 +11,8 @@ import ( ) type Loop struct { - statusManager statusManager - state stateManager + statusManager *loopstate.State + state *state.State // Objects fetcher Fetcher logger Logger diff --git a/internal/vpn/interfaces.go b/internal/vpn/interfaces.go index 7b549990..f22f4d46 100644 --- a/internal/vpn/interfaces.go +++ b/internal/vpn/interfaces.go @@ -32,11 +32,6 @@ type OpenVPN interface { WriteAuthFile(user, password string) error } -type StateManager interface { - GetSettings() (vpn settings.VPN) - SetSettings(ctx context.Context, vpn settings.VPN) (outcome string) -} - type Providers interface { Get(providerName string) provider.Provider } @@ -73,16 +68,3 @@ type PublicIPLoop interface { outcome string, err error) SetData(data ipinfo.Response) } - -type statusManager interface { - GetStatus() (status models.LoopStatus) - SetStatus(status models.LoopStatus) - ApplyStatus(ctx context.Context, status models.LoopStatus) ( - outcome string, err error) - Lock() - Unlock() -} - -type runner interface { - Run(ctx context.Context, waitError chan<- error, tunnelReady chan<- struct{}) -} diff --git a/internal/vpn/loop.go b/internal/vpn/loop.go index 07eacb80..1fb0da8a 100644 --- a/internal/vpn/loop.go +++ b/internal/vpn/loop.go @@ -14,8 +14,8 @@ import ( ) type Loop struct { - statusManager statusManager - state StateManager + statusManager *loopstate.State + state *state.State providers Providers storage Storage // Fixed parameters diff --git a/internal/vpn/run.go b/internal/vpn/run.go index 693cd8fa..e6f04626 100644 --- a/internal/vpn/run.go +++ b/internal/vpn/run.go @@ -23,7 +23,9 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { providerConf := l.providers.Get(*settings.Provider.Name) portForwarding := *settings.Provider.PortForwarding.Enabled - var vpnRunner runner + var vpnRunner interface { + Run(ctx context.Context, waitError chan<- error, tunnelReady chan<- struct{}) + } var serverName, vpnInterface string var err error subLogger := l.logger.New(log.SetComponent(settings.Type))