mirror of
https://github.com/qdm12/gluetun.git
synced 2026-07-23 02:46:31 +02:00
d9cc7dcffb
- new directory structure containing manifest.json and one json file per provider, by default. - the manifest.json file can specify a filepath for each vpn provider - each vpn provider json data file can contain the `"preferred": true` field to enforce it is used even if outdated, unless there is a version mismatch - `STORAGE_SERVERS_DIRECTORY_PATH` replaces `STORAGE_FILEPATH` (which is now a migration source only). It sets the directory where server manifest and per-provider JSON files are stored (default: `/gluetun/servers/`). - First-run migration: On startup, gluetun checks for the old /gluetun/servers.json file; if found and no new manifest exists, it automatically migrates all data to /gluetun/servers/ directory structure - Silent fallback: If legacy file isn't found, uses the new directory path normally - Legacy cleanup: After successful migration, attempts to remove the old fat JSON file (logs warning only if removal fails, e.g., read-only bind mounts)
58 lines
1.6 KiB
Go
58 lines
1.6 KiB
Go
package updater
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/qdm12/gluetun-servers/pkg/models"
|
|
"github.com/qdm12/gluetun-servers/pkg/updaters/common"
|
|
)
|
|
|
|
type Provider interface {
|
|
Name() string
|
|
FetchServers(ctx context.Context, minServers int) (servers []models.Server, err error)
|
|
}
|
|
|
|
func (u *Updater) updateProvider(ctx context.Context, provider Provider,
|
|
minRatio float64,
|
|
) (err error) {
|
|
providerName := provider.Name()
|
|
existingServersCount := u.storage.GetServersCount(providerName)
|
|
minServers := int(minRatio * float64(existingServersCount))
|
|
servers, err := provider.FetchServers(ctx, minServers)
|
|
if err != nil {
|
|
if errors.Is(err, common.ErrNotEnoughServers) {
|
|
u.logger.Warn("note: if running the update manually, you can use the flag " +
|
|
"-minratio to allow the update to succeed with less servers found")
|
|
}
|
|
return fmt.Errorf("getting %s servers: %w", providerName, err)
|
|
}
|
|
|
|
for _, server := range servers {
|
|
err := server.HasMinimumInformation()
|
|
if err != nil {
|
|
serverJSON, jsonErr := json.Marshal(server)
|
|
if jsonErr != nil {
|
|
panic(jsonErr)
|
|
}
|
|
return fmt.Errorf("server %s has not enough information: %w", serverJSON, err)
|
|
}
|
|
}
|
|
|
|
if u.storage.ServersAreEqual(providerName, servers) {
|
|
return nil
|
|
}
|
|
|
|
// Note the servers variable must NOT BE MUTATED after this call,
|
|
// since the implementation does not deep copy the servers.
|
|
// TODO set in storage in provider updater directly, server by server,
|
|
// to avoid accumulating server data in memory.
|
|
err = u.storage.SetServers(providerName, servers)
|
|
if err != nil {
|
|
return fmt.Errorf("setting servers to storage: %w", err)
|
|
}
|
|
return nil
|
|
}
|