Compare commits

..

4 Commits

Author SHA1 Message Date
31859569fc fix typo in README 2022-03-06 19:25:06 +01:00
d31571fc50 cleanup (country default now comes from flag) 2022-03-06 19:20:21 +01:00
5eefe15b3b Update README.md 2022-03-06 19:10:33 +01:00
dbb84f0c0c add support to select server type 2022-03-06 19:06:59 +01:00
2 changed files with 28 additions and 24 deletions

View File

@ -1,7 +1,7 @@
# mullvad-best-server # mullvad-best-server
![Build](https://github.com/bastiandoetsch/mullvad-best-server/actions/workflows/go.yml/badge.svg) ![Build](https://github.com/bastiandoetsch/mullvad-best-server/actions/workflows/go.yml/badge.svg)
Determines the mullvat.net wireguard server with the lowest latency. Determines the mullvad.net server with the lowest latency.
## Installation ## Installation
@ -11,12 +11,22 @@ Download binary from releases for your platform and unpack.
### Default usage ### Default usage
Execute `mullvad-best-server`. It outputs the code, e.g. `de05`. You can then connect to it with e.g. wireguard using the normal shell scripts. Execute `mullvad-best-server`. It outputs the code, e.g. `de05`. You can then connect to it with e.g. wireguard using the normal shell scripts.
### Extended Output ### Command line parameters
If you want the full server information, execute `mullvad-best-server -o json`. It returns the full json output of the server information.
```angular2html
Usage of dist/mullvad-best-server_darwin_amd64/mullvad-best-server:
-c string
Server country code, e.g. ch for Switzerland (default "ch")
-o string
Output format. 'json' outputs server json
-t string
Server type, e.g. wireguard (default "wireguard")
```
If you want the full server information, execute `mullvad-best-server -o json`. It returns the full json output of the server information.
The `-c` flag allows to give a country code. Else `ch` will be used.
### Specify Country
The -c flag allows to give a country code. Else de/at/ch will be used.
## Background ## Background
The program uses `https://api.mullvad.net/www/relays/wireguard/` to get the current server list, pings the ones with the right country The program uses `https://api.mullvad.net/www/relays/<SERVER_TYPE/` to get the current server list, pings the ones with the right country
and outputs the server with the lowest ping. and outputs the server with the lowest ping.

30
main.go
View File

@ -18,18 +18,20 @@ var pings = make(map[string]time.Duration)
func main() { func main() {
zerolog.SetGlobalLevel(zerolog.InfoLevel) zerolog.SetGlobalLevel(zerolog.InfoLevel)
var outputFlag = flag.String("o", "short", "Output format. 'json' outputs server json") var outputFlag = flag.String("o", "", "Output format. 'json' outputs server json")
var countryFlag = flag.String("c", "ch", "Server country code, e.g. ch for Switzerland") var countryFlag = flag.String("c", "ch", "Server country code, e.g. ch for Switzerland")
var typeFlag = flag.String("t", "wireguard", "Server type, e.g. wireguard")
flag.Parse() flag.Parse()
servers := getServers() servers := getServers(*typeFlag)
bestIndex := selectBestServerIndex(servers, countryFlag) bestIndex := selectBestServerIndex(servers, *countryFlag)
log.Debug().Interface("server", servers[bestIndex]).Msg("Best latency server found.") best := servers[bestIndex]
hostname := strings.Split(servers[bestIndex].Hostname, "-")[0] log.Debug().Interface("server", best).Msg("Best latency server found.")
hostname := strings.TrimSuffix(best.Hostname, "-wireguard")
if *outputFlag != "json" { if *outputFlag != "json" {
fmt.Println(hostname) fmt.Println(hostname)
} else { } else {
serverJson, err := json.Marshal(servers[bestIndex]) serverJson, err := json.Marshal(best)
if err != nil { if err != nil {
log.Fatal().Err(err) log.Fatal().Err(err)
} }
@ -37,19 +39,11 @@ func main() {
} }
} }
func selectBestServerIndex(servers []server, country *string) int { func selectBestServerIndex(servers []server, country string) int {
best := servers[0].Hostname best := servers[0].Hostname
bestIndex := -1 bestIndex := -1
allowedCountries := map[string]string{}
if *country == "" {
allowedCountries["de"] = "1"
allowedCountries["ch"] = "1"
allowedCountries["at"] = "1"
} else {
allowedCountries[*country] = "1"
}
for i, server := range servers { for i, server := range servers {
if server.Active && allowedCountries[server.CountryCode] != "" { if server.Active && server.CountryCode == country {
duration, err := serverLatency(server) duration, err := serverLatency(server)
if err == nil { if err == nil {
pings[server.Hostname] = duration pings[server.Hostname] = duration
@ -63,8 +57,8 @@ func selectBestServerIndex(servers []server, country *string) int {
return bestIndex return bestIndex
} }
func getServers() []server { func getServers(serverType string) []server {
resp, err := http.Get("https://api.mullvad.net/www/relays/wireguard/") resp, err := http.Get("https://api.mullvad.net/www/relays/" + serverType + "/")
if err != nil { if err != nil {
log.Fatal().Err(err) log.Fatal().Err(err)
} }