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(),
},
Vyprvpn: models.VyprvpnServers{
Version: 1,
Timestamp: 1620326951,
Version: 2,
Timestamp: 1620612506,
Servers: VyprvpnServers(),
},
Windscribe: models.WindscribeServers{

View File

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

View File

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

View File

@@ -176,11 +176,15 @@ func (s *TorguardServer) String() string {
type VyprvpnServer struct {
Region string `json:"region"`
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 {
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 {

View File

@@ -7,6 +7,7 @@ import (
"net"
"net/http"
"strconv"
"strings"
"github.com/qdm12/gluetun/internal/configuration"
"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 {
switch {
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:
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
}
servers := v.filterServers(selection.Regions)
servers := v.filterServers(selection.Regions, selection.Hostnames, selection.Protocol)
if len(servers) == 0 {
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
func (hts hostToServer) add(host, region string) {
func (hts hostToServer) add(host, region string, tcp, udp bool) {
server, ok := hts[host]
// TODO set host
if !ok {
server.Hostname = host
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) {

View File

@@ -46,13 +46,21 @@ func GetServers(ctx context.Context, unzipper unzip.Unzipper,
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)
if err != nil {
warnings = append(warnings, err.Error())
continue
}
hts.add(host, region)
hts.add(host, region, tcp, udp)
}
if len(hts) < minServers {