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:
@@ -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"
|
||||||
|
|||||||
@@ -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{}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
@@ -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,
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package updater
|
package loop
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user