mirror of
https://github.com/qdm12/gluetun.git
synced 2026-07-22 10:26:26 +02:00
56 lines
1.6 KiB
Go
56 lines
1.6 KiB
Go
package updater
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/qdm12/gluetun-servers/pkg/models"
|
|
)
|
|
|
|
func (u *Updater) updateProvider(ctx context.Context, providerName string,
|
|
manifest manifest, minRatio float64,
|
|
) (err error) {
|
|
providerFilepath := manifest.providerToFilepath[providerName]
|
|
providerFileURL := buildProviderFileURL(providerName, providerFilepath)
|
|
|
|
var data models.Servers
|
|
err = u.fetchJSON(ctx, providerFileURL, &data)
|
|
if err != nil {
|
|
return fmt.Errorf("downloading provider file %s: %w", providerFileURL, err)
|
|
}
|
|
|
|
existingServersCount := u.storage.GetServersCount(providerName)
|
|
minServers := int(minRatio * float64(existingServersCount))
|
|
servers := data.Servers
|
|
if len(servers) < minServers {
|
|
return fmt.Errorf("provider %s has not enough servers from downloaded file: got %d and expected at least %d",
|
|
providerName, len(servers), minServers)
|
|
}
|
|
|
|
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
|
|
}
|