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/storage"
"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/golibs/command"
"github.com/qdm12/goshutdown"

View File

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

View File

@@ -6,12 +6,11 @@ import (
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/dns"
"github.com/qdm12/gluetun/internal/updater"
"github.com/qdm12/gluetun/internal/vpn"
)
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{
ctx: ctx,
logger: logger,
@@ -26,7 +25,7 @@ type handlerV0 struct {
logger infoWarner
vpn vpn.Looper
dns dns.Looper
updater updater.Looper
updater UpdaterLooper
}
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/portforward"
"github.com/qdm12/gluetun/internal/publicip"
"github.com/qdm12/gluetun/internal/updater"
"github.com/qdm12/gluetun/internal/vpn"
)
func New(ctx context.Context, address string, logEnabled bool, logger Logger,
buildInfo models.BuildInformation, openvpnLooper vpn.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,
openvpnLooper, pfGetter, unboundLooper, updaterLooper, publicIPLooper)

View File

@@ -6,12 +6,20 @@ import (
"net/http"
"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(
ctx context.Context,
looper updater.Looper,
looper UpdaterLooper,
warner warner) http.Handler {
return &updaterHandler{
ctx: ctx,
@@ -22,7 +30,7 @@ func newUpdaterHandler(
type updaterHandler struct {
ctx context.Context //nolint:containedctx
looper updater.Looper
looper UpdaterLooper
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 (
"context"
@@ -10,6 +10,7 @@ import (
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/storage"
"github.com/qdm12/gluetun/internal/updater"
)
type Looper interface {
@@ -22,13 +23,17 @@ type Looper interface {
SetSettings(settings settings.Updater) (outcome string)
}
type Updater interface {
UpdateServers(ctx context.Context) (allServers models.AllServers, err error)
}
type looper struct {
state state
// Objects
updater Updater
flusher storage.Flusher
setAllServers func(allServers models.AllServers)
logger infoErrorer
logger Logger
// Internal channels and locks
loopLock sync.Mutex
start chan struct{}
@@ -44,6 +49,12 @@ type looper struct {
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,
flusher storage.Flusher, setAllServers func(allServers models.AllServers),
client *http.Client, logger Logger) Looper {
@@ -52,7 +63,7 @@ func NewLooper(settings settings.Updater, currentServers models.AllServers,
status: constants.Stopped,
settings: settings,
},
updater: New(settings, client, currentServers, logger),
updater: updater.New(settings, client, currentServers, logger),
flusher: flusher,
setAllServers: setAllServers,
logger: logger,

View File

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

View File

@@ -30,7 +30,7 @@ import (
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) {
existingServers := u.getProviderServers(provider)
minServers := getMinServers(existingServers)
@@ -47,7 +47,7 @@ func (u *updater) updateProvider(ctx context.Context, provider string) (
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) {
switch provider {
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]
if !ok {
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)))
}
func (u *updater) patchProvider(provider string, servers []models.Server) {
func (u *Updater) patchProvider(provider string, servers []models.Server) {
providerServers, ok := u.servers.ProviderToServers[provider]
if !ok {
panic(fmt.Sprintf("provider %s is unknown", provider))

View File

@@ -14,11 +14,7 @@ import (
"golang.org/x/text/language"
)
type Updater interface {
UpdateServers(ctx context.Context) (allServers models.AllServers, err error)
}
type updater struct {
type Updater struct {
// configuration
options settings.Updater
@@ -33,10 +29,16 @@ type updater struct {
unzipper unzip.Unzipper
}
type Logger interface {
Info(s string)
Warn(s string)
Error(s string)
}
func New(settings settings.Updater, httpClient *http.Client,
currentServers models.AllServers, logger Logger) Updater {
currentServers models.AllServers, logger Logger) *Updater {
unzipper := unzip.New(httpClient)
return &updater{
return &Updater{
logger: logger,
timeNow: time.Now,
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
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 {
u.logger.Info("updating " + caser.String(provider) + " servers...")
// TODO support servers offering only TCP or only UDP