mirror of
https://github.com/qdm12/gluetun.git
synced 2026-07-23 19:06:26 +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)
68 lines
1.3 KiB
Go
68 lines
1.3 KiB
Go
package openvpn
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
)
|
|
|
|
// FetchMultiFiles fetches multiple Openvpn files in parallel and
|
|
// parses them to extract each of their host. A mapping from host to
|
|
// URL is returned.
|
|
func FetchMultiFiles(ctx context.Context, client *http.Client, urls []string,
|
|
failEarly bool,
|
|
) (hostToURL map[string]string, errors []error) {
|
|
ctx, cancel := context.WithCancel(ctx)
|
|
defer cancel()
|
|
|
|
hostToURL = make(map[string]string, len(urls))
|
|
|
|
type Result struct {
|
|
url string
|
|
host string
|
|
}
|
|
|
|
results := make(chan Result)
|
|
defer close(results)
|
|
errorsCh := make(chan error)
|
|
defer close(errorsCh)
|
|
|
|
for _, url := range urls {
|
|
go func(url string) {
|
|
host, err := FetchFile(ctx, client, url)
|
|
if err != nil {
|
|
errorsCh <- err
|
|
return
|
|
}
|
|
results <- Result{
|
|
url: url,
|
|
host: host,
|
|
}
|
|
}(url)
|
|
}
|
|
|
|
for range urls {
|
|
select {
|
|
case result := <-results:
|
|
hostToURL[result.host] = result.url
|
|
case err := <-errorsCh:
|
|
if !failEarly {
|
|
errors = append(errors, err)
|
|
break
|
|
}
|
|
|
|
if len(errors) == 0 {
|
|
errors = []error{err} // keep only the first error
|
|
// stop other operations, this will trigger other errors we ignore
|
|
cancel()
|
|
}
|
|
}
|
|
}
|
|
|
|
if len(errors) > 0 && failEarly {
|
|
// we don't care about the result found
|
|
return nil, errors
|
|
}
|
|
|
|
return hostToURL, errors
|
|
}
|