Files
gluetun/internal/updater/providers/ivpn/servers.go

73 lines
1.7 KiB
Go
Raw Normal View History

2021-05-31 00:11:16 +00:00
// Package ivpn contains code to obtain the server information
// for the Surshark provider.
package ivpn
import (
"context"
"errors"
"fmt"
"net/http"
2021-05-31 00:11:16 +00:00
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/updater/resolver"
)
var (
ErrFetchAPI = errors.New("failed fetching API")
ErrNotEnoughServers = errors.New("not enough servers found")
)
2021-05-31 00:11:16 +00:00
func GetServers(ctx context.Context, client *http.Client,
2021-05-31 00:11:16 +00:00
presolver resolver.Parallel, minServers int) (
servers []models.IvpnServer, warnings []string, err error) {
data, err := fetchAPI(ctx, client)
2021-05-31 00:11:16 +00:00
if err != nil {
return nil, nil, fmt.Errorf("%w: %s", ErrFetchAPI, err)
2021-05-31 00:11:16 +00:00
}
hosts := make([]string, 0, len(data.Servers))
2021-05-31 00:11:16 +00:00
for _, serverData := range data.Servers {
host := serverData.Hostnames.OpenVPN
2021-05-31 00:11:16 +00:00
if host == "" {
continue // Wireguard
2021-05-31 00:11:16 +00:00
}
hosts = append(hosts, host)
2021-05-31 00:11:16 +00:00
}
if len(hosts) < minServers {
return nil, nil, fmt.Errorf("%w: %d and expected at least %d",
ErrNotEnoughServers, len(hosts), minServers)
2021-05-31 00:11:16 +00:00
}
hostToIPs, warnings, err := resolveHosts(ctx, presolver, hosts, minServers)
2021-05-31 00:11:16 +00:00
if err != nil {
return nil, warnings, err
}
servers = make([]models.IvpnServer, 0, len(hosts))
for _, serverData := range data.Servers {
host := serverData.Hostnames.OpenVPN
if serverData.Hostnames.OpenVPN == "" {
continue // Wireguard
}
2021-05-31 00:11:16 +00:00
server := models.IvpnServer{
Country: serverData.Country,
City: serverData.City,
ISP: serverData.ISP,
Hostname: serverData.Hostnames.OpenVPN,
TCP: true,
UDP: true,
IPs: hostToIPs[host],
}
servers = append(servers, server)
2021-05-31 00:11:16 +00:00
}
sortServers(servers)
return servers, warnings, nil
}