Maintenance: deduplicate PIA servers by protocols
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -22,8 +22,8 @@ func GetAllServers() (allServers models.AllServers) {
|
|||||||
Servers: NordvpnServers(),
|
Servers: NordvpnServers(),
|
||||||
},
|
},
|
||||||
Pia: models.PiaServers{
|
Pia: models.PiaServers{
|
||||||
Version: 3,
|
Version: 4,
|
||||||
Timestamp: 1613479739,
|
Timestamp: 1613480675,
|
||||||
Servers: PIAServers(),
|
Servers: PIAServers(),
|
||||||
},
|
},
|
||||||
Purevpn: models.PurevpnServers{
|
Purevpn: models.PurevpnServers{
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ func Test_versions(t *testing.T) {
|
|||||||
"Private Internet Access": {
|
"Private Internet Access": {
|
||||||
model: models.PIAServer{},
|
model: models.PIAServer{},
|
||||||
version: allServers.Pia.Version,
|
version: allServers.Pia.Version,
|
||||||
digest: "b90147aa",
|
digest: "3e6066ec",
|
||||||
},
|
},
|
||||||
"Privado": {
|
"Privado": {
|
||||||
model: models.PrivadoServer{},
|
model: models.PrivadoServer{},
|
||||||
@@ -133,7 +133,7 @@ func Test_timestamps(t *testing.T) {
|
|||||||
"Private Internet Access": {
|
"Private Internet Access": {
|
||||||
servers: allServers.Pia.Servers,
|
servers: allServers.Pia.Servers,
|
||||||
timestamp: allServers.Pia.Timestamp,
|
timestamp: allServers.Pia.Timestamp,
|
||||||
digest: "921daf32",
|
digest: "e0f95a01",
|
||||||
},
|
},
|
||||||
"Purevpn": {
|
"Purevpn": {
|
||||||
servers: allServers.Purevpn.Servers,
|
servers: allServers.Purevpn.Servers,
|
||||||
|
|||||||
@@ -10,14 +10,15 @@ import (
|
|||||||
type PIAServer struct {
|
type PIAServer struct {
|
||||||
Region string `json:"region"`
|
Region string `json:"region"`
|
||||||
ServerName string `json:"server_name"`
|
ServerName string `json:"server_name"`
|
||||||
Protocol string `json:"protocol"`
|
TCP bool `json:"tcp"`
|
||||||
|
UDP bool `json:"udp"`
|
||||||
PortForward bool `json:"port_forward"`
|
PortForward bool `json:"port_forward"`
|
||||||
IP net.IP `json:"ip"`
|
IP net.IP `json:"ip"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PIAServer) String() string {
|
func (p *PIAServer) String() string {
|
||||||
return fmt.Sprintf("{Region: %q, ServerName: %q, Protocol: %q, PortForward: %t, IP: %s}",
|
return fmt.Sprintf("{Region: %q, ServerName: %q, TCP: %t, UDP: %t, PortForward: %t, IP: %s}",
|
||||||
p.Region, p.ServerName, p.Protocol, p.PortForward, goStringifyIP(p.IP))
|
p.Region, p.ServerName, p.TCP, p.UDP, p.PortForward, goStringifyIP(p.IP))
|
||||||
}
|
}
|
||||||
|
|
||||||
type MullvadServer struct {
|
type MullvadServer struct {
|
||||||
|
|||||||
@@ -341,8 +341,9 @@ func filterPIAServers(servers []models.PIAServer, regions []string, protocol str
|
|||||||
filtered []models.PIAServer) {
|
filtered []models.PIAServer) {
|
||||||
for _, server := range servers {
|
for _, server := range servers {
|
||||||
switch {
|
switch {
|
||||||
case filterByPossibilities(server.Region, regions):
|
case filterByPossibilities(server.Region, regions),
|
||||||
case server.Protocol != protocol:
|
protocol == constants.TCP && !server.TCP,
|
||||||
|
protocol == constants.UDP && !server.UDP:
|
||||||
default:
|
default:
|
||||||
filtered = append(filtered, server)
|
filtered = append(filtered, server)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -48,34 +47,62 @@ func (u *updater) updatePIA(ctx context.Context) (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
servers := make([]models.PIAServer, 0, len(data.Regions))
|
// Deduplicate servers with the same IP address
|
||||||
|
type NetProtocols struct {
|
||||||
|
tcp, udp bool
|
||||||
|
}
|
||||||
|
ipToProtocols := make(map[string]NetProtocols)
|
||||||
|
|
||||||
for _, region := range data.Regions {
|
for _, region := range data.Regions {
|
||||||
for _, udpServer := range region.Servers.UDP {
|
for _, udpServer := range region.Servers.UDP {
|
||||||
|
protocols := ipToProtocols[udpServer.IP.String()]
|
||||||
|
protocols.udp = true
|
||||||
|
ipToProtocols[udpServer.IP.String()] = protocols
|
||||||
|
}
|
||||||
|
for _, tcpServer := range region.Servers.TCP {
|
||||||
|
protocols := ipToProtocols[tcpServer.IP.String()]
|
||||||
|
protocols.tcp = true
|
||||||
|
ipToProtocols[tcpServer.IP.String()] = protocols
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
servers := make([]models.PIAServer, 0, len(ipToProtocols)) // set the capacity, not the length of the slice
|
||||||
|
for _, region := range data.Regions {
|
||||||
|
for _, udpServer := range region.Servers.UDP {
|
||||||
|
protocols, ok := ipToProtocols[udpServer.IP.String()]
|
||||||
|
if !ok { // already added that IP for a server
|
||||||
|
continue
|
||||||
|
}
|
||||||
server := models.PIAServer{
|
server := models.PIAServer{
|
||||||
Region: region.Name,
|
Region: region.Name,
|
||||||
ServerName: udpServer.CN,
|
ServerName: udpServer.CN,
|
||||||
Protocol: constants.UDP,
|
TCP: protocols.tcp,
|
||||||
|
UDP: protocols.udp,
|
||||||
PortForward: region.PortForward,
|
PortForward: region.PortForward,
|
||||||
IP: udpServer.IP,
|
IP: udpServer.IP,
|
||||||
}
|
}
|
||||||
|
delete(ipToProtocols, udpServer.IP.String())
|
||||||
servers = append(servers, server)
|
servers = append(servers, server)
|
||||||
}
|
}
|
||||||
for _, tcpServer := range region.Servers.TCP {
|
for _, tcpServer := range region.Servers.TCP {
|
||||||
|
protocols, ok := ipToProtocols[tcpServer.IP.String()]
|
||||||
|
if !ok { // already added that IP for a server
|
||||||
|
continue
|
||||||
|
}
|
||||||
server := models.PIAServer{
|
server := models.PIAServer{
|
||||||
Region: region.Name,
|
Region: region.Name,
|
||||||
ServerName: tcpServer.CN,
|
ServerName: tcpServer.CN,
|
||||||
Protocol: constants.TCP,
|
TCP: protocols.tcp,
|
||||||
|
UDP: protocols.udp,
|
||||||
PortForward: region.PortForward,
|
PortForward: region.PortForward,
|
||||||
IP: tcpServer.IP,
|
IP: tcpServer.IP,
|
||||||
}
|
}
|
||||||
|
delete(ipToProtocols, tcpServer.IP.String())
|
||||||
servers = append(servers, server)
|
servers = append(servers, server)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sort.Slice(servers, func(i, j int) bool {
|
sort.Slice(servers, func(i, j int) bool {
|
||||||
if servers[i].Region == servers[j].Region {
|
if servers[i].Region == servers[j].Region {
|
||||||
if servers[i].ServerName == servers[j].ServerName {
|
|
||||||
return servers[i].Protocol < servers[j].Protocol
|
|
||||||
}
|
|
||||||
return servers[i].ServerName < servers[j].ServerName
|
return servers[i].ServerName < servers[j].ServerName
|
||||||
}
|
}
|
||||||
return servers[i].Region < servers[j].Region
|
return servers[i].Region < servers[j].Region
|
||||||
|
|||||||
Reference in New Issue
Block a user