chore(updater): internal/updater/loop subpackage

- Do not export updater interface
- Export updater struct
- Define local interfaces where needed
- More restrictive updater loop interface in http control server
- Inject `Updater` into updater loop as an interface
This commit is contained in:
Quentin McGaw
2022-05-28 16:03:59 +00:00
parent 991d75a1d0
commit 292813831d
10 changed files with 45 additions and 51 deletions

View File

@@ -37,7 +37,7 @@ import (
"github.com/qdm12/gluetun/internal/shadowsocks" "github.com/qdm12/gluetun/internal/shadowsocks"
"github.com/qdm12/gluetun/internal/storage" "github.com/qdm12/gluetun/internal/storage"
"github.com/qdm12/gluetun/internal/tun" "github.com/qdm12/gluetun/internal/tun"
"github.com/qdm12/gluetun/internal/updater" updater "github.com/qdm12/gluetun/internal/updater/loop"
"github.com/qdm12/gluetun/internal/vpn" "github.com/qdm12/gluetun/internal/vpn"
"github.com/qdm12/golibs/command" "github.com/qdm12/golibs/command"
"github.com/qdm12/goshutdown" "github.com/qdm12/goshutdown"

View File

@@ -9,7 +9,6 @@ import (
"github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/portforward" "github.com/qdm12/gluetun/internal/portforward"
"github.com/qdm12/gluetun/internal/publicip" "github.com/qdm12/gluetun/internal/publicip"
"github.com/qdm12/gluetun/internal/updater"
"github.com/qdm12/gluetun/internal/vpn" "github.com/qdm12/gluetun/internal/vpn"
) )
@@ -18,7 +17,7 @@ func newHandler(ctx context.Context, logger infoWarner, logging bool,
vpnLooper vpn.Looper, vpnLooper vpn.Looper,
pfGetter portforward.Getter, pfGetter portforward.Getter,
unboundLooper dns.Looper, unboundLooper dns.Looper,
updaterLooper updater.Looper, updaterLooper UpdaterLooper,
publicIPLooper publicip.Looper, publicIPLooper publicip.Looper,
) http.Handler { ) http.Handler {
handler := &handler{} handler := &handler{}

View File

@@ -6,12 +6,11 @@ import (
"github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/dns" "github.com/qdm12/gluetun/internal/dns"
"github.com/qdm12/gluetun/internal/updater"
"github.com/qdm12/gluetun/internal/vpn" "github.com/qdm12/gluetun/internal/vpn"
) )
func newHandlerV0(ctx context.Context, logger infoWarner, func newHandlerV0(ctx context.Context, logger infoWarner,
vpn vpn.Looper, dns dns.Looper, updater updater.Looper) http.Handler { vpn vpn.Looper, dns dns.Looper, updater UpdaterLooper) http.Handler {
return &handlerV0{ return &handlerV0{
ctx: ctx, ctx: ctx,
logger: logger, logger: logger,
@@ -26,7 +25,7 @@ type handlerV0 struct {
logger infoWarner logger infoWarner
vpn vpn.Looper vpn vpn.Looper
dns dns.Looper dns dns.Looper
updater updater.Looper updater UpdaterLooper
} }
func (h *handlerV0) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (h *handlerV0) ServeHTTP(w http.ResponseWriter, r *http.Request) {

View File

@@ -10,14 +10,13 @@ import (
"github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/portforward" "github.com/qdm12/gluetun/internal/portforward"
"github.com/qdm12/gluetun/internal/publicip" "github.com/qdm12/gluetun/internal/publicip"
"github.com/qdm12/gluetun/internal/updater"
"github.com/qdm12/gluetun/internal/vpn" "github.com/qdm12/gluetun/internal/vpn"
) )
func New(ctx context.Context, address string, logEnabled bool, logger Logger, func New(ctx context.Context, address string, logEnabled bool, logger Logger,
buildInfo models.BuildInformation, openvpnLooper vpn.Looper, buildInfo models.BuildInformation, openvpnLooper vpn.Looper,
pfGetter portforward.Getter, unboundLooper dns.Looper, pfGetter portforward.Getter, unboundLooper dns.Looper,
updaterLooper updater.Looper, publicIPLooper publicip.Looper) (server httpserver.Runner, err error) { updaterLooper UpdaterLooper, publicIPLooper publicip.Looper) (server httpserver.Runner, err error) {
handler := newHandler(ctx, logger, logEnabled, buildInfo, handler := newHandler(ctx, logger, logEnabled, buildInfo,
openvpnLooper, pfGetter, unboundLooper, updaterLooper, publicIPLooper) openvpnLooper, pfGetter, unboundLooper, updaterLooper, publicIPLooper)

View File

@@ -6,12 +6,20 @@ import (
"net/http" "net/http"
"strings" "strings"
"github.com/qdm12/gluetun/internal/updater" "github.com/qdm12/gluetun/internal/configuration/settings"
"github.com/qdm12/gluetun/internal/models"
) )
type UpdaterLooper interface {
GetStatus() (status models.LoopStatus)
SetStatus(ctx context.Context, status models.LoopStatus) (
outcome string, err error)
SetSettings(settings settings.Updater) (outcome string)
}
func newUpdaterHandler( func newUpdaterHandler(
ctx context.Context, ctx context.Context,
looper updater.Looper, looper UpdaterLooper,
warner warner) http.Handler { warner warner) http.Handler {
return &updaterHandler{ return &updaterHandler{
ctx: ctx, ctx: ctx,
@@ -22,7 +30,7 @@ func newUpdaterHandler(
type updaterHandler struct { type updaterHandler struct {
ctx context.Context //nolint:containedctx ctx context.Context //nolint:containedctx
looper updater.Looper looper UpdaterLooper
warner warner warner warner
} }

View File

@@ -1,24 +0,0 @@
package updater
type Logger interface {
infoer
warner
errorer
}
type infoErrorer interface {
infoer
errorer
}
type infoer interface {
Info(s string)
}
type warner interface {
Warn(s string)
}
type errorer interface {
Error(s string)
}

View File

@@ -1,4 +1,4 @@
package updater package loop
import ( import (
"context" "context"
@@ -10,6 +10,7 @@ import (
"github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/storage" "github.com/qdm12/gluetun/internal/storage"
"github.com/qdm12/gluetun/internal/updater"
) )
type Looper interface { type Looper interface {
@@ -22,13 +23,17 @@ type Looper interface {
SetSettings(settings settings.Updater) (outcome string) SetSettings(settings settings.Updater) (outcome string)
} }
type Updater interface {
UpdateServers(ctx context.Context) (allServers models.AllServers, err error)
}
type looper struct { type looper struct {
state state state state
// Objects // Objects
updater Updater updater Updater
flusher storage.Flusher flusher storage.Flusher
setAllServers func(allServers models.AllServers) setAllServers func(allServers models.AllServers)
logger infoErrorer logger Logger
// Internal channels and locks // Internal channels and locks
loopLock sync.Mutex loopLock sync.Mutex
start chan struct{} start chan struct{}
@@ -44,6 +49,12 @@ type looper struct {
const defaultBackoffTime = 5 * time.Second const defaultBackoffTime = 5 * time.Second
type Logger interface {
Info(s string)
Warn(s string)
Error(s string)
}
func NewLooper(settings settings.Updater, currentServers models.AllServers, func NewLooper(settings settings.Updater, currentServers models.AllServers,
flusher storage.Flusher, setAllServers func(allServers models.AllServers), flusher storage.Flusher, setAllServers func(allServers models.AllServers),
client *http.Client, logger Logger) Looper { client *http.Client, logger Logger) Looper {
@@ -52,7 +63,7 @@ func NewLooper(settings settings.Updater, currentServers models.AllServers,
status: constants.Stopped, status: constants.Stopped,
settings: settings, settings: settings,
}, },
updater: New(settings, client, currentServers, logger), updater: updater.New(settings, client, currentServers, logger),
flusher: flusher, flusher: flusher,
setAllServers: setAllServers, setAllServers: setAllServers,
logger: logger, logger: logger,

View File

@@ -1,4 +1,4 @@
package updater package loop
import ( import (
"context" "context"

View File

@@ -30,7 +30,7 @@ import (
windscribe "github.com/qdm12/gluetun/internal/provider/windscribe/updater" windscribe "github.com/qdm12/gluetun/internal/provider/windscribe/updater"
) )
func (u *updater) updateProvider(ctx context.Context, provider string) ( func (u *Updater) updateProvider(ctx context.Context, provider string) (
warnings []string, err error) { warnings []string, err error) {
existingServers := u.getProviderServers(provider) existingServers := u.getProviderServers(provider)
minServers := getMinServers(existingServers) minServers := getMinServers(existingServers)
@@ -47,7 +47,7 @@ func (u *updater) updateProvider(ctx context.Context, provider string) (
return warnings, nil return warnings, nil
} }
func (u *updater) getServers(ctx context.Context, provider string, func (u *Updater) getServers(ctx context.Context, provider string,
minServers int) (servers []models.Server, warnings []string, err error) { minServers int) (servers []models.Server, warnings []string, err error) {
switch provider { switch provider {
case providers.Custom: case providers.Custom:
@@ -101,7 +101,7 @@ func (u *updater) getServers(ctx context.Context, provider string,
} }
} }
func (u *updater) getProviderServers(provider string) (servers []models.Server) { func (u *Updater) getProviderServers(provider string) (servers []models.Server) {
providerServers, ok := u.servers.ProviderToServers[provider] providerServers, ok := u.servers.ProviderToServers[provider]
if !ok { if !ok {
panic(fmt.Sprintf("provider %s is unknown", provider)) panic(fmt.Sprintf("provider %s is unknown", provider))
@@ -114,7 +114,7 @@ func getMinServers(servers []models.Server) (minServers int) {
return int(minRatio * float64(len(servers))) return int(minRatio * float64(len(servers)))
} }
func (u *updater) patchProvider(provider string, servers []models.Server) { func (u *Updater) patchProvider(provider string, servers []models.Server) {
providerServers, ok := u.servers.ProviderToServers[provider] providerServers, ok := u.servers.ProviderToServers[provider]
if !ok { if !ok {
panic(fmt.Sprintf("provider %s is unknown", provider)) panic(fmt.Sprintf("provider %s is unknown", provider))

View File

@@ -14,11 +14,7 @@ import (
"golang.org/x/text/language" "golang.org/x/text/language"
) )
type Updater interface { type Updater struct {
UpdateServers(ctx context.Context) (allServers models.AllServers, err error)
}
type updater struct {
// configuration // configuration
options settings.Updater options settings.Updater
@@ -33,10 +29,16 @@ type updater struct {
unzipper unzip.Unzipper unzipper unzip.Unzipper
} }
type Logger interface {
Info(s string)
Warn(s string)
Error(s string)
}
func New(settings settings.Updater, httpClient *http.Client, func New(settings settings.Updater, httpClient *http.Client,
currentServers models.AllServers, logger Logger) Updater { currentServers models.AllServers, logger Logger) *Updater {
unzipper := unzip.New(httpClient) unzipper := unzip.New(httpClient)
return &updater{ return &Updater{
logger: logger, logger: logger,
timeNow: time.Now, timeNow: time.Now,
presolver: resolver.NewParallelResolver(settings.DNSAddress.String()), presolver: resolver.NewParallelResolver(settings.DNSAddress.String()),
@@ -49,7 +51,7 @@ func New(settings settings.Updater, httpClient *http.Client,
var caser = cases.Title(language.English) //nolint:gochecknoglobals var caser = cases.Title(language.English) //nolint:gochecknoglobals
func (u *updater) UpdateServers(ctx context.Context) (allServers models.AllServers, err error) { func (u *Updater) UpdateServers(ctx context.Context) (allServers models.AllServers, err error) {
for _, provider := range u.options.Providers { for _, provider := range u.options.Providers {
u.logger.Info("updating " + caser.String(provider) + " servers...") u.logger.Info("updating " + caser.String(provider) + " servers...")
// TODO support servers offering only TCP or only UDP // TODO support servers offering only TCP or only UDP