Maint: hardcoded data in JSON embedded file

- Server information, versions and timestamps together in internal/constants/servers.json
- breaking change: updater cli uses -enduser instead of -file
- breaking change: updater cli uses -maintainer instead of -stdout
- Fix: replace special last a character with 'a' from Bogota for PrivateVPN
- Feat: do not write out servers and timestamp if no change was detected
This commit is contained in:
Quentin McGaw (desktop)
2021-07-20 03:01:26 +00:00
parent 394abbbe35
commit da4d528463
49 changed files with 109965 additions and 12159 deletions

View File

@@ -3,6 +3,7 @@ package updater
import (
"context"
"fmt"
"reflect"
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/updater/providers/cyberghost"
@@ -30,9 +31,11 @@ func (u *updater) updateCyberghost(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(cyberghost.Stringify(servers))
if reflect.DeepEqual(u.servers.Cyberghost.Servers, servers) {
return nil
}
u.servers.Cyberghost.Timestamp = u.timeNow().Unix()
u.servers.Cyberghost.Servers = servers
return nil
@@ -50,9 +53,11 @@ func (u *updater) updateFastestvpn(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(fastestvpn.Stringify(servers))
if reflect.DeepEqual(u.servers.Fastestvpn.Servers, servers) {
return nil
}
u.servers.Fastestvpn.Timestamp = u.timeNow().Unix()
u.servers.Fastestvpn.Servers = servers
return nil
@@ -70,9 +75,11 @@ func (u *updater) updateHideMyAss(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(hidemyass.Stringify(servers))
if reflect.DeepEqual(u.servers.HideMyAss.Servers, servers) {
return nil
}
u.servers.HideMyAss.Timestamp = u.timeNow().Unix()
u.servers.HideMyAss.Servers = servers
return nil
@@ -90,9 +97,11 @@ func (u *updater) updateIpvanish(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(ipvanish.Stringify(servers))
if reflect.DeepEqual(u.servers.Ipvanish.Servers, servers) {
return nil
}
u.servers.Ipvanish.Timestamp = u.timeNow().Unix()
u.servers.Ipvanish.Servers = servers
return nil
@@ -110,9 +119,11 @@ func (u *updater) updateIvpn(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(ivpn.Stringify(servers))
if reflect.DeepEqual(u.servers.Ivpn.Servers, servers) {
return nil
}
u.servers.Ivpn.Timestamp = u.timeNow().Unix()
u.servers.Ivpn.Servers = servers
return nil
@@ -124,9 +135,11 @@ func (u *updater) updateMullvad(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(mullvad.Stringify(servers))
if reflect.DeepEqual(u.servers.Mullvad.Servers, servers) {
return nil
}
u.servers.Mullvad.Timestamp = u.timeNow().Unix()
u.servers.Mullvad.Servers = servers
return nil
@@ -143,9 +156,11 @@ func (u *updater) updateNordvpn(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(nordvpn.Stringify(servers))
if reflect.DeepEqual(u.servers.Nordvpn.Servers, servers) {
return nil
}
u.servers.Nordvpn.Timestamp = u.timeNow().Unix()
u.servers.Nordvpn.Servers = servers
return nil
@@ -157,9 +172,11 @@ func (u *updater) updatePIA(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(pia.Stringify(servers))
if reflect.DeepEqual(u.servers.Pia.Servers, servers) {
return nil
}
u.servers.Pia.Timestamp = u.timeNow().Unix()
u.servers.Pia.Servers = servers
return nil
@@ -177,9 +194,11 @@ func (u *updater) updatePrivado(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(privado.Stringify(servers))
if reflect.DeepEqual(u.servers.Privado.Servers, servers) {
return nil
}
u.servers.Privado.Timestamp = u.timeNow().Unix()
u.servers.Privado.Servers = servers
return nil
@@ -197,9 +216,11 @@ func (u *updater) updatePrivatevpn(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(privatevpn.Stringify(servers))
if reflect.DeepEqual(u.servers.Privatevpn.Servers, servers) {
return nil
}
u.servers.Privatevpn.Timestamp = u.timeNow().Unix()
u.servers.Privatevpn.Servers = servers
return nil
@@ -216,9 +237,11 @@ func (u *updater) updateProtonvpn(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(protonvpn.Stringify(servers))
if reflect.DeepEqual(u.servers.Protonvpn.Servers, servers) {
return nil
}
u.servers.Protonvpn.Timestamp = u.timeNow().Unix()
u.servers.Protonvpn.Servers = servers
return nil
@@ -236,9 +259,11 @@ func (u *updater) updatePurevpn(ctx context.Context) (err error) {
if err != nil {
return fmt.Errorf("cannot update Purevpn servers: %w", err)
}
if u.options.Stdout {
u.println(purevpn.Stringify(servers))
if reflect.DeepEqual(u.servers.Purevpn.Servers, servers) {
return nil
}
u.servers.Purevpn.Timestamp = u.timeNow().Unix()
u.servers.Purevpn.Servers = servers
return nil
@@ -256,9 +281,11 @@ func (u *updater) updateSurfshark(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(surfshark.Stringify(servers))
if reflect.DeepEqual(u.servers.Surfshark.Servers, servers) {
return nil
}
u.servers.Surfshark.Timestamp = u.timeNow().Unix()
u.servers.Surfshark.Servers = servers
return nil
@@ -276,9 +303,11 @@ func (u *updater) updateTorguard(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(torguard.Stringify(servers))
if reflect.DeepEqual(u.servers.Torguard.Servers, servers) {
return nil
}
u.servers.Torguard.Timestamp = u.timeNow().Unix()
u.servers.Torguard.Servers = servers
return nil
@@ -296,9 +325,11 @@ func (u *updater) updateVPNUnlimited(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(vpnunlimited.Stringify(servers))
if reflect.DeepEqual(u.servers.VPNUnlimited.Servers, servers) {
return nil
}
u.servers.VPNUnlimited.Timestamp = u.timeNow().Unix()
u.servers.VPNUnlimited.Servers = servers
return nil
@@ -316,9 +347,11 @@ func (u *updater) updateVyprvpn(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(vyprvpn.Stringify(servers))
if reflect.DeepEqual(u.servers.Vyprvpn.Servers, servers) {
return nil
}
u.servers.Vyprvpn.Timestamp = u.timeNow().Unix()
u.servers.Vyprvpn.Servers = servers
return nil
@@ -330,9 +363,11 @@ func (u *updater) updateWindscribe(ctx context.Context) (err error) {
if err != nil {
return err
}
if u.options.Stdout {
u.println(windscribe.Stringify(servers))
if reflect.DeepEqual(u.servers.Windscribe.Servers, servers) {
return nil
}
u.servers.Windscribe.Timestamp = u.timeNow().Unix()
u.servers.Windscribe.Servers = servers
return nil

View File

@@ -1,15 +0,0 @@
package cyberghost
import "github.com/qdm12/gluetun/internal/models"
// Stringify converts servers to code string format.
func Stringify(servers []models.CyberghostServer) (s string) {
s = "func CyberghostServers() []models.CyberghostServer {\n"
s += " return []models.CyberghostServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package fastestvpn
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.FastestvpnServer) (s string) {
s = "func FastestvpnServers() []models.FastestvpnServer {\n"
s += " return []models.FastestvpnServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package hidemyass
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.HideMyAssServer) (s string) {
s = "func HideMyAssServers() []models.HideMyAssServer {\n"
s += " return []models.HideMyAssServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package ipvanish
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.IpvanishServer) (s string) {
s = "func IpvanishServers() []models.IpvanishServer {\n"
s += " return []models.IpvanishServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,43 +0,0 @@
package ipvanish
import (
"testing"
"github.com/qdm12/gluetun/internal/models"
"github.com/stretchr/testify/assert"
)
func Test_Stringify(t *testing.T) {
t.Parallel()
testCases := map[string]struct {
servers []models.IpvanishServer
s string
}{
"no server": {
s: `func IpvanishServers() []models.IpvanishServer {
return []models.IpvanishServer{
}
}`,
},
"multiple servers": {
servers: []models.IpvanishServer{
{Country: "A"},
{Country: "B"},
},
s: `func IpvanishServers() []models.IpvanishServer {
return []models.IpvanishServer{
{Country: "A", City: "", Hostname: "", TCP: false, UDP: false, IPs: []net.IP{}},
{Country: "B", City: "", Hostname: "", TCP: false, UDP: false, IPs: []net.IP{}},
}
}`,
},
}
for name, testCase := range testCases {
testCase := testCase
t.Run(name, func(t *testing.T) {
t.Parallel()
s := Stringify(testCase.servers)
assert.Equal(t, testCase.s, s)
})
}
}

View File

@@ -1,14 +0,0 @@
package ivpn
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.IvpnServer) (s string) {
s = "func IvpnServers() []models.IvpnServer {\n"
s += " return []models.IvpnServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,43 +0,0 @@
package ivpn
import (
"testing"
"github.com/qdm12/gluetun/internal/models"
"github.com/stretchr/testify/assert"
)
func Test_Stringify(t *testing.T) {
t.Parallel()
testCases := map[string]struct {
servers []models.IvpnServer
s string
}{
"no server": {
s: `func IvpnServers() []models.IvpnServer {
return []models.IvpnServer{
}
}`,
},
"multiple servers": {
servers: []models.IvpnServer{
{Country: "A"},
{Country: "B"},
},
s: `func IvpnServers() []models.IvpnServer {
return []models.IvpnServer{
{Country: "A", City: "", Hostname: "", TCP: false, UDP: false, IPs: []net.IP{}},
{Country: "B", City: "", Hostname: "", TCP: false, UDP: false, IPs: []net.IP{}},
}
}`,
},
}
for name, testCase := range testCases {
testCase := testCase
t.Run(name, func(t *testing.T) {
t.Parallel()
s := Stringify(testCase.servers)
assert.Equal(t, testCase.s, s)
})
}
}

View File

@@ -1,14 +0,0 @@
package mullvad
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.MullvadServer) (s string) {
s = "func MullvadServers() []models.MullvadServer {\n"
s += " return []models.MullvadServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,33 +0,0 @@
package mullvad
import (
"net"
"strings"
"testing"
"github.com/qdm12/gluetun/internal/models"
"github.com/stretchr/testify/assert"
)
func Test_Stringify(t *testing.T) {
servers := []models.MullvadServer{{
Country: "webland",
City: "webcity",
Hostname: "hostname",
ISP: "not nsa",
Owned: true,
IPs: []net.IP{{1, 1, 1, 1}},
IPsV6: []net.IP{{1, 1, 1, 1}},
}}
//nolint:lll
expected := `
func MullvadServers() []models.MullvadServer {
return []models.MullvadServer{
{Country: "webland", City: "webcity", Hostname: "hostname", ISP: "not nsa", Owned: true, IPs: []net.IP{{1, 1, 1, 1}}, IPsV6: []net.IP{{1, 1, 1, 1}}},
}
}
`
expected = strings.TrimPrefix(strings.TrimSuffix(expected, "\n"), "\n")
s := Stringify(servers)
assert.Equal(t, expected, s)
}

View File

@@ -1,14 +0,0 @@
package nordvpn
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.NordvpnServer) (s string) {
s = "func NordvpnServers() []models.NordvpnServer {\n"
s += " return []models.NordvpnServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package pia
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.PIAServer) (s string) {
s = "func PIAServers() []models.PIAServer {\n"
s += " return []models.PIAServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package privado
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.PrivadoServer) (s string) {
s = "func PrivadoServers() []models.PrivadoServer {\n"
s += " return []models.PrivadoServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -48,7 +48,11 @@ func parseFilename(fileName string) (
errNotEnoughParts, fileName)
}
countryCode, city = parts[0], parts[1]
countryCode = strings.ToLower(countryCode)
if countryCode == "co" && strings.HasPrefix(city, "Bogot") {
city = "Bogota"
}
return countryCode, city, nil
}

View File

@@ -1,14 +0,0 @@
package privatevpn
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.PrivatevpnServer) (s string) {
s = "func PrivatevpnServers() []models.PrivatevpnServer {\n"
s += " return []models.PrivatevpnServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package protonvpn
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.ProtonvpnServer) (s string) {
s = "func ProtonvpnServers() []models.ProtonvpnServer {\n"
s += " return []models.ProtonvpnServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package purevpn
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.PurevpnServer) (s string) {
s = "func PurevpnServers() []models.PurevpnServer {\n"
s += " return []models.PurevpnServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package surfshark
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.SurfsharkServer) (s string) {
s = "func SurfsharkServers() []models.SurfsharkServer {\n"
s += " return []models.SurfsharkServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package torguard
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.TorguardServer) (s string) {
s = "func TorguardServers() []models.TorguardServer {\n"
s += " return []models.TorguardServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package vpnunlimited
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.VPNUnlimitedServer) (s string) {
s = "func VPNUnlimitedServers() []models.VPNUnlimitedServer {\n"
s += " return []models.VPNUnlimitedServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package vyprvpn
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.VyprvpnServer) (s string) {
s = "func VyprvpnServers() []models.VyprvpnServer {\n"
s += " return []models.VyprvpnServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -1,14 +0,0 @@
package windscribe
import "github.com/qdm12/gluetun/internal/models"
func Stringify(servers []models.WindscribeServer) (s string) {
s = "func WindscribeServers() []models.WindscribeServer {\n"
s += " return []models.WindscribeServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -3,7 +3,6 @@ package updater
import (
"context"
"fmt"
"net/http"
"time"
@@ -29,7 +28,6 @@ type updater struct {
// Functions for tests
logger logging.Logger
timeNow func() time.Time
println func(s string)
presolver resolver.Parallel
client *http.Client
unzipper unzip.Unzipper
@@ -44,7 +42,6 @@ func New(settings configuration.Updater, httpClient *http.Client,
return &updater{
logger: logger,
timeNow: time.Now,
println: func(s string) { fmt.Println(s) },
presolver: resolver.NewParallelResolver(settings.DNSAddress),
client: httpClient,
unzipper: unzipper,