chore(models): streamline all server models IPs (#942)

- Use `IPs []net.IP` for all server models
- Use `ips` JSON field for all server models
- Merge IPv4 and IPv6 addresses together for Mullvad
This commit is contained in:
Quentin McGaw
2022-04-16 21:58:42 +02:00
parent 54b7e23974
commit aa729515b9
18 changed files with 26277 additions and 12234 deletions

View File

@@ -50,7 +50,7 @@ func (hts hostToServer) add(data serverData) (err error) {
if ipv4 == nil || ipv4.To4() == nil {
return fmt.Errorf("%w: %s", ErrParseIPv4, data.IPv4)
}
server.IPs = []net.IP{ipv4}
server.IPs = append(server.IPs, ipv4)
}
if data.IPv6 != "" {
@@ -58,7 +58,7 @@ func (hts hostToServer) add(data serverData) (err error) {
if ipv6 == nil || ipv6.To4() != nil {
return fmt.Errorf("%w: %s", ErrParseIPv6, data.IPv6)
}
server.IPsV6 = []net.IP{ipv6}
server.IPs = append(server.IPs, ipv6)
}
server.Country = data.Country
@@ -77,7 +77,6 @@ func (hts hostToServer) toServersSlice() (servers []models.MullvadServer) {
servers = make([]models.MullvadServer, 0, len(hts))
for _, server := range hts {
server.IPs = uniqueSortedIPs(server.IPs)
server.IPsV6 = uniqueSortedIPs(server.IPsV6)
servers = append(servers, server)
}
return servers

View File

@@ -6,6 +6,7 @@ import (
"context"
"errors"
"fmt"
"net"
"net/http"
"github.com/qdm12/gluetun/internal/models"
@@ -47,7 +48,7 @@ func GetServers(ctx context.Context, client *http.Client, minServers int) (
Region: jsonServer.Country,
Hostname: jsonServer.Domain,
Number: number,
IP: ip,
IPs: []net.IP{ip},
TCP: jsonServer.Features.TCP,
UDP: jsonServer.Features.UDP,
}

View File

@@ -25,23 +25,17 @@ func (hts hostToServer) toHostsSlice() (hosts []string) {
return hosts
}
func (hts hostToServer) adaptWithIPs(hostToIPs map[string][]net.IP) (
warnings []string) {
func (hts hostToServer) adaptWithIPs(hostToIPs map[string][]net.IP) {
for host, IPs := range hostToIPs {
if len(IPs) > 1 {
warning := "more than one IP address found for host " + host
warnings = append(warnings, warning)
}
server := hts[host]
server.IP = IPs[0]
server.IPs = IPs
hts[host] = server
}
for host, server := range hts {
if server.IP == nil {
if len(server.IPs) == 0 {
delete(hts, host)
}
}
return warnings
}
func (hts hostToServer) toServersSlice() (servers []models.PrivadoServer) {

View File

@@ -11,9 +11,9 @@ import (
func setLocationInfo(ctx context.Context, client *http.Client, servers []models.PrivadoServer) (err error) {
// Get public IP address information
ipsToGetInfo := make([]net.IP, len(servers))
for i := range servers {
ipsToGetInfo[i] = servers[i].IP
ipsToGetInfo := make([]net.IP, 0, len(servers))
for _, server := range servers {
ipsToGetInfo = append(ipsToGetInfo, server.IPs...)
}
ipsInfo, err := publicip.MultiInfo(ctx, client, ipsToGetInfo)
if err != nil {

View File

@@ -62,8 +62,7 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper,
return nil, warnings, err
}
newWarnings = hts.adaptWithIPs(hostToIPs)
warnings = append(warnings, newWarnings...)
hts.adaptWithIPs(hostToIPs)
servers = hts.toServersSlice()

View File

@@ -6,7 +6,6 @@ import (
"context"
"errors"
"fmt"
"net"
"strings"
"github.com/qdm12/gluetun/internal/constants"
@@ -60,7 +59,7 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper,
continue
}
ip, warning, extractIPErr := openvpn.ExtractIP(content)
ips, extractIPErr := openvpn.ExtractIPs(content)
if warning != "" {
warnings = append(warnings, warning)
}
@@ -73,7 +72,7 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper,
server := models.PrivatevpnServer{
Country: country,
City: city,
IPs: []net.IP{ip},
IPs: ips,
}
noHostnameServers = append(noHostnameServers, server)
}

View File

@@ -19,7 +19,9 @@ func (its ipToServer) add(country, region, city, name, hostname string,
server.City = city
server.Name = name
server.Hostname = hostname
server.EntryIP = entryIP
server.IPs = []net.IP{entryIP}
} else {
server.IPs = append(server.IPs, entryIP)
}
its[key] = server

View File

@@ -8,14 +8,18 @@ import (
type hostToServer map[string]models.TorguardServer
func (hts hostToServer) add(host, country, city string, tcp, udp bool, ip net.IP) {
func (hts hostToServer) add(host, country, city string,
tcp, udp bool, ips []net.IP) {
server, ok := hts[host]
if !ok {
server.Hostname = host
server.Country = country
server.City = city
server.IPs = append(server.IPs, ip) // used if DNS resolution fails downstream
server.IPs = ips // used if DNS resolution fails downstream
} else {
server.IPs = append(server.IPs, ips...)
}
if tcp {
server.TCP = tcp
}

View File

@@ -90,10 +90,7 @@ func addServerFromOvpn(fileName string, content []byte,
return warnings
}
ip, warning, err := openvpn.ExtractIP(content)
if warning != "" {
warnings = append(warnings, warning)
}
ips, err := openvpn.ExtractIPs(content)
if err != nil {
// treat error as warning and go to next file
warning := err.Error() + " in " + fileName
@@ -101,6 +98,6 @@ func addServerFromOvpn(fileName string, content []byte,
return warnings
}
hts.add(host, country, city, tcp, udp, ip)
hts.add(host, country, city, tcp, udp, ips)
return warnings
}