Feature: Filter VyprVPN servers by hostname, and:

- Extract if server supports TCP and UDP (never TCP now)
- Filter servers by protocol (unused for now)
This commit is contained in:
Quentin McGaw
2021-05-10 02:12:13 +00:00
parent 95b0fb81d6
commit 2d95edf8ab
7 changed files with 110 additions and 87 deletions

View File

@@ -67,8 +67,8 @@ func GetAllServers() (allServers models.AllServers) {
Servers: TorguardServers(), Servers: TorguardServers(),
}, },
Vyprvpn: models.VyprvpnServers{ Vyprvpn: models.VyprvpnServers{
Version: 1, Version: 2,
Timestamp: 1620326951, Timestamp: 1620612506,
Servers: VyprvpnServers(), Servers: VyprvpnServers(),
}, },
Windscribe: models.WindscribeServers{ Windscribe: models.WindscribeServers{

View File

@@ -97,7 +97,7 @@ func Test_versions(t *testing.T) {
"Vyprvpn": { "Vyprvpn": {
model: models.VyprvpnServer{}, model: models.VyprvpnServer{},
version: allServers.Vyprvpn.Version, version: allServers.Vyprvpn.Version,
digest: "042bef64", digest: "58de06d8",
}, },
"Windscribe": { "Windscribe": {
model: models.WindscribeServer{}, model: models.WindscribeServer{},
@@ -203,7 +203,7 @@ func Test_timestamps(t *testing.T) {
"Vyprvpn": { "Vyprvpn": {
servers: allServers.Vyprvpn.Servers, servers: allServers.Vyprvpn.Servers,
timestamp: allServers.Vyprvpn.Timestamp, timestamp: allServers.Vyprvpn.Timestamp,
digest: "eccb7f5c", digest: "a62c484b",
}, },
"Windscribe": { "Windscribe": {
servers: allServers.Windscribe.Servers, servers: allServers.Windscribe.Servers,

View File

@@ -20,80 +20,81 @@ func VyprvpnRegionChoices() (choices []string) {
return makeUnique(choices) return makeUnique(choices)
} }
//nolint:lll
func VyprvpnServers() []models.VyprvpnServer { func VyprvpnServers() []models.VyprvpnServer {
return []models.VyprvpnServer{ return []models.VyprvpnServer{
{Region: "Algeria", IPs: []net.IP{{209, 99, 75, 20}}}, {Region: "Algeria", Hostname: "dz1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 75, 20}}},
{Region: "Argentina", IPs: []net.IP{{209, 99, 109, 19}}}, {Region: "Argentina", Hostname: "ar1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 109, 19}}},
{Region: "Australia Melbourne", IPs: []net.IP{{209, 99, 117, 19}}}, {Region: "Australia Melbourne", Hostname: "au2.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 117, 19}}},
{Region: "Australia Perth", IPs: []net.IP{{209, 99, 1, 19}}}, {Region: "Australia Perth", Hostname: "au3.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 1, 19}}},
{Region: "Australia Sydney", IPs: []net.IP{{209, 99, 117, 18}}}, {Region: "Australia Sydney", Hostname: "au1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 117, 18}}},
{Region: "Austria", IPs: []net.IP{{128, 90, 96, 18}}}, {Region: "Austria", Hostname: "at1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 18}}},
{Region: "Bahrain", IPs: []net.IP{{209, 99, 115, 19}}}, {Region: "Bahrain", Hostname: "bh1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 115, 19}}},
{Region: "Belgium", IPs: []net.IP{{128, 90, 96, 20}}}, {Region: "Belgium", Hostname: "be1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 20}}},
{Region: "Brazil", IPs: []net.IP{{209, 99, 109, 20}}}, {Region: "Brazil", Hostname: "br1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 109, 20}}},
{Region: "Bulgaria", IPs: []net.IP{{128, 90, 96, 22}}}, {Region: "Bulgaria", Hostname: "bg1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 22}}},
{Region: "Canada", IPs: []net.IP{{209, 99, 21, 18}}}, {Region: "Canada", Hostname: "ca1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 21, 18}}},
{Region: "Columbia", IPs: []net.IP{{209, 99, 109, 21}}}, {Region: "Columbia", Hostname: "co1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 109, 21}}},
{Region: "Costa Rica", IPs: []net.IP{{209, 99, 109, 22}}}, {Region: "Costa Rica", Hostname: "cr1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 109, 22}}},
{Region: "Czech Republic", IPs: []net.IP{{128, 90, 96, 24}}}, {Region: "Czech Republic", Hostname: "cz1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 24}}},
{Region: "Denmark", IPs: []net.IP{{128, 90, 96, 28}}}, {Region: "Denmark", Hostname: "dk1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 28}}},
{Region: "Dubai", IPs: []net.IP{{128, 90, 45, 104}}}, {Region: "Dubai", Hostname: "ae1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 45, 104}}},
{Region: "Egypt", IPs: []net.IP{{209, 99, 75, 21}}}, {Region: "Egypt", Hostname: "eg1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 75, 21}}},
{Region: "El Salvador", IPs: []net.IP{{209, 99, 61, 20}}}, {Region: "El Salvador", Hostname: "sv1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 61, 20}}},
{Region: "Finland", IPs: []net.IP{{128, 90, 96, 32}}}, {Region: "Finland", Hostname: "fi1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 32}}},
{Region: "France", IPs: []net.IP{{128, 90, 96, 34}}}, {Region: "France", Hostname: "fr1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 34}}},
{Region: "Germany", IPs: []net.IP{{128, 90, 96, 26}}}, {Region: "Germany", Hostname: "de1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 26}}},
{Region: "Greece", IPs: []net.IP{{209, 99, 75, 22}}}, {Region: "Greece", Hostname: "gr1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 75, 22}}},
{Region: "Hong Kong", IPs: []net.IP{{128, 90, 227, 18}}}, {Region: "Hong Kong", Hostname: "hk1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 227, 18}}},
{Region: "Iceland", IPs: []net.IP{{209, 99, 22, 20}}}, {Region: "Iceland", Hostname: "is1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 22, 20}}},
{Region: "India", IPs: []net.IP{{209, 99, 115, 20}}}, {Region: "India", Hostname: "in1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 115, 20}}},
{Region: "Indonesia", IPs: []net.IP{{209, 99, 1, 20}}}, {Region: "Indonesia", Hostname: "id1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 1, 20}}},
{Region: "Ireland", IPs: []net.IP{{209, 99, 22, 19}}}, {Region: "Ireland", Hostname: "ie1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 22, 19}}},
{Region: "Israel", IPs: []net.IP{{209, 99, 75, 18}}}, {Region: "Israel", Hostname: "il1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 75, 18}}},
{Region: "Italy", IPs: []net.IP{{128, 90, 96, 36}}}, {Region: "Italy", Hostname: "it1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 36}}},
{Region: "Japan", IPs: []net.IP{{209, 99, 113, 18}}}, {Region: "Japan", Hostname: "jp1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 113, 18}}},
{Region: "Latvia", IPs: []net.IP{{128, 90, 96, 44}}}, {Region: "Latvia", Hostname: "lv1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 44}}},
{Region: "Liechtenstein", IPs: []net.IP{{128, 90, 96, 38}}}, {Region: "Liechtenstein", Hostname: "li1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 38}}},
{Region: "Lithuania", IPs: []net.IP{{128, 90, 96, 40}}}, {Region: "Lithuania", Hostname: "lt1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 40}}},
{Region: "Luxembourg", IPs: []net.IP{{128, 90, 96, 42}}}, {Region: "Luxembourg", Hostname: "lu1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 42}}},
{Region: "Macao", IPs: []net.IP{{128, 90, 227, 36}}}, {Region: "Macao", Hostname: "mo1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 227, 36}}},
{Region: "Malaysia", IPs: []net.IP{{209, 99, 1, 21}}}, {Region: "Malaysia", Hostname: "my1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 1, 21}}},
{Region: "Maldives", IPs: []net.IP{{209, 99, 1, 26}}}, {Region: "Maldives", Hostname: "mv1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 1, 26}}},
{Region: "Marshall Islands", IPs: []net.IP{{209, 99, 1, 25}}}, {Region: "Marshall Islands", Hostname: "mh1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 1, 25}}},
{Region: "Mexico", IPs: []net.IP{{209, 99, 61, 19}}}, {Region: "Mexico", Hostname: "mx1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 61, 19}}},
{Region: "Netherlands", IPs: []net.IP{{128, 90, 96, 16}}}, {Region: "Netherlands", Hostname: "eu1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 16}}},
{Region: "New Zealand", IPs: []net.IP{{209, 99, 117, 20}}}, {Region: "New Zealand", Hostname: "nz1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 117, 20}}},
{Region: "Norway", IPs: []net.IP{{128, 90, 96, 46}}}, {Region: "Norway", Hostname: "no1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 46}}},
{Region: "Pakistan", IPs: []net.IP{{209, 99, 75, 23}}}, {Region: "Pakistan", Hostname: "pk1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 75, 23}}},
{Region: "Panama", IPs: []net.IP{{209, 99, 109, 23}}}, {Region: "Panama", Hostname: "pa1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 109, 23}}},
{Region: "Philippines", IPs: []net.IP{{209, 99, 1, 22}}}, {Region: "Philippines", Hostname: "ph1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 1, 22}}},
{Region: "Poland", IPs: []net.IP{{128, 90, 96, 48}}}, {Region: "Poland", Hostname: "pl1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 48}}},
{Region: "Portugal", IPs: []net.IP{{128, 90, 96, 50}}}, {Region: "Portugal", Hostname: "pt1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 50}}},
{Region: "Qatar", IPs: []net.IP{{209, 99, 115, 21}}}, {Region: "Qatar", Hostname: "qa1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 115, 21}}},
{Region: "Romania", IPs: []net.IP{{128, 90, 96, 52}}}, {Region: "Romania", Hostname: "ro1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 52}}},
{Region: "Russia", IPs: []net.IP{{128, 90, 96, 54}}}, {Region: "Russia", Hostname: "ru1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 54}}},
{Region: "Saudi Arabia", IPs: []net.IP{{209, 99, 115, 22}}}, {Region: "Saudi Arabia", Hostname: "sa1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 115, 22}}},
{Region: "Singapore", IPs: []net.IP{{209, 99, 1, 18}}}, {Region: "Singapore", Hostname: "sg1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 1, 18}}},
{Region: "Slovakia", IPs: []net.IP{{128, 90, 96, 60}}}, {Region: "Slovakia", Hostname: "sk1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 60}}},
{Region: "Slovenia", IPs: []net.IP{{128, 90, 96, 58}}}, {Region: "Slovenia", Hostname: "si1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 58}}},
{Region: "South Korea", IPs: []net.IP{{209, 99, 113, 19}}}, {Region: "South Korea", Hostname: "kr1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 113, 19}}},
{Region: "Spain", IPs: []net.IP{{128, 90, 96, 30}}}, {Region: "Spain", Hostname: "es1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 30}}},
{Region: "Sweden", IPs: []net.IP{{128, 90, 96, 56}}}, {Region: "Sweden", Hostname: "se1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 56}}},
{Region: "Switzerland", IPs: []net.IP{{209, 99, 60, 18}}}, {Region: "Switzerland", Hostname: "ch1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 60, 18}}},
{Region: "Taiwan", IPs: []net.IP{{128, 90, 227, 27}}}, {Region: "Taiwan", Hostname: "tw1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 227, 27}}},
{Region: "Thailand", IPs: []net.IP{{209, 99, 1, 23}}}, {Region: "Thailand", Hostname: "th1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 1, 23}}},
{Region: "Turkey", IPs: []net.IP{{128, 90, 96, 62}}}, {Region: "Turkey", Hostname: "tr1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 62}}},
{Region: "USA Austin", IPs: []net.IP{{209, 99, 61, 18}}}, {Region: "USA Austin", Hostname: "us3.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 61, 18}}},
{Region: "USA Chicago", IPs: []net.IP{{209, 99, 93, 18}}}, {Region: "USA Chicago", Hostname: "us6.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 93, 18}}},
{Region: "USA Los Angeles", IPs: []net.IP{{209, 99, 67, 18}}}, {Region: "USA Los Angeles", Hostname: "us1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 67, 18}}},
{Region: "USA Miami", IPs: []net.IP{{209, 99, 109, 18}}}, {Region: "USA Miami", Hostname: "us4.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 109, 18}}},
{Region: "USA New York", IPs: []net.IP{{209, 99, 63, 18}}}, {Region: "USA New York", Hostname: "us5.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 63, 18}}},
{Region: "USA San Francisco", IPs: []net.IP{{209, 99, 95, 18}}}, {Region: "USA San Francisco", Hostname: "us7.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 95, 18}}},
{Region: "USA Seattle", IPs: []net.IP{{209, 99, 94, 18}}}, {Region: "USA Seattle", Hostname: "us8.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 94, 18}}},
{Region: "USA Washington", IPs: []net.IP{{209, 99, 62, 18}}}, {Region: "USA Washington", Hostname: "us2.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 62, 18}}},
{Region: "Ukraine", IPs: []net.IP{{128, 90, 96, 64}}}, {Region: "Ukraine", Hostname: "ua1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{128, 90, 96, 64}}},
{Region: "United Kingdom", IPs: []net.IP{{209, 99, 22, 18}}}, {Region: "United Kingdom", Hostname: "uk1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 22, 18}}},
{Region: "Uruguay", IPs: []net.IP{{209, 99, 61, 21}}}, {Region: "Uruguay", Hostname: "uy1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 61, 21}}},
{Region: "Vietnam", IPs: []net.IP{{209, 99, 1, 24}}}, {Region: "Vietnam", Hostname: "vn1.vyprvpn.com", TCP: false, UDP: true, IPs: []net.IP{{209, 99, 1, 24}}},
} }
} }

View File

@@ -175,12 +175,16 @@ func (s *TorguardServer) String() string {
} }
type VyprvpnServer struct { type VyprvpnServer struct {
Region string `json:"region"` Region string `json:"region"`
IPs []net.IP `json:"ips"` Hostname string `json:"hostname"`
TCP bool `json:"tcp"`
UDP bool `json:"udp"` // only support for UDP
IPs []net.IP `json:"ips"`
} }
func (s *VyprvpnServer) String() string { func (s *VyprvpnServer) String() string {
return fmt.Sprintf("{Region: %q, IPs: %s}", s.Region, goStringifyIPs(s.IPs)) return fmt.Sprintf("{Region: %q, Hostname: %q, TCP: %t, UDP: %t, IPs: %s}",
s.Region, s.Hostname, s.TCP, s.UDP, goStringifyIPs(s.IPs))
} }
type WindscribeServer struct { type WindscribeServer struct {

View File

@@ -7,6 +7,7 @@ import (
"net" "net"
"net/http" "net/http"
"strconv" "strconv"
"strings"
"github.com/qdm12/gluetun/internal/configuration" "github.com/qdm12/gluetun/internal/configuration"
"github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/constants"
@@ -28,11 +29,14 @@ func newVyprvpn(servers []models.VyprvpnServer, timeNow timeNowFunc) *vyprvpn {
} }
} }
func (v *vyprvpn) filterServers(regions []string) (servers []models.VyprvpnServer) { func (v *vyprvpn) filterServers(regions, hostnames []string, protocol string) (servers []models.VyprvpnServer) {
for _, server := range v.servers { for _, server := range v.servers {
switch { switch {
case case
filterByPossibilities(server.Region, regions): filterByPossibilities(server.Region, regions),
filterByPossibilities(server.Hostname, hostnames),
strings.EqualFold(protocol, "tcp") && !server.TCP,
strings.EqualFold(protocol, "udp") && !server.UDP:
default: default:
servers = append(servers, server) servers = append(servers, server)
} }
@@ -56,7 +60,7 @@ func (v *vyprvpn) GetOpenVPNConnection(selection configuration.ServerSelection)
return models.OpenVPNConnection{IP: selection.TargetIP, Port: port, Protocol: selection.Protocol}, nil return models.OpenVPNConnection{IP: selection.TargetIP, Port: port, Protocol: selection.Protocol}, nil
} }
servers := v.filterServers(selection.Regions) servers := v.filterServers(selection.Regions, selection.Hostnames, selection.Protocol)
if len(servers) == 0 { if len(servers) == 0 {
return connection, fmt.Errorf("no server found for region %s", commaJoin(selection.Regions)) return connection, fmt.Errorf("no server found for region %s", commaJoin(selection.Regions))
} }

View File

@@ -8,13 +8,19 @@ import (
type hostToServer map[string]models.VyprvpnServer type hostToServer map[string]models.VyprvpnServer
func (hts hostToServer) add(host, region string) { func (hts hostToServer) add(host, region string, tcp, udp bool) {
server, ok := hts[host] server, ok := hts[host]
// TODO set host
if !ok { if !ok {
server.Hostname = host
server.Region = region server.Region = region
hts[host] = server
} }
if tcp {
server.TCP = true
}
if udp {
server.UDP = true
}
hts[host] = server
} }
func (hts hostToServer) toHostsSlice() (hosts []string) { func (hts hostToServer) toHostsSlice() (hosts []string) {

View File

@@ -46,13 +46,21 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper,
continue continue
} }
tcp, udp, err := openvpn.ExtractProto(content)
if err != nil {
// treat error as warning and go to next file
warning := err.Error() + " in " + fileName
warnings = append(warnings, warning)
continue
}
region, err := parseFilename(fileName) region, err := parseFilename(fileName)
if err != nil { if err != nil {
warnings = append(warnings, err.Error()) warnings = append(warnings, err.Error())
continue continue
} }
hts.add(host, region) hts.add(host, region, tcp, udp)
} }
if len(hts) < minServers { if len(hts) < minServers {