Compare commits

...

3 Commits

2 changed files with 18 additions and 8 deletions

View File

@ -1,4 +1,6 @@
# mullvad-best-server # mullvad-best-server
![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 mullvat.net wireguard server with the lowest latency.
## Installation ## Installation
@ -12,6 +14,9 @@ Execute `mullvad-best-server`. It outputs the code, e.g. `de05`. You can then co
### Extended Output ### Extended Output
If you want the full server information, execute `mullvad-best-server -o json`. It returns the full json output of the server information. If you want the full server information, execute `mullvad-best-server -o json`. It returns the full json output of the server information.
### 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/wireguard/` 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.

19
main.go
View File

@ -19,10 +19,11 @@ 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", "short", "Output format. 'json' outputs server json")
var countryFlag = flag.String("c", "ch", "Server country code, e.g. ch for Switzerland")
flag.Parse() flag.Parse()
servers := getServers() servers := getServers()
bestIndex := selectBestServerIndex(servers) bestIndex := selectBestServerIndex(servers, countryFlag)
log.Debug().Interface("server", servers[bestIndex]).Msg("Best latency server found.") log.Debug().Interface("server", servers[bestIndex]).Msg("Best latency server found.")
hostname := strings.Split(servers[bestIndex].Hostname, "-")[0] hostname := strings.Split(servers[bestIndex].Hostname, "-")[0]
if *outputFlag != "json" { if *outputFlag != "json" {
@ -36,19 +37,23 @@ func main() {
} }
} }
func selectBestServerIndex(servers []server) int { func selectBestServerIndex(servers []server, country *string) int {
best := servers[0].Hostname best := servers[0].Hostname
bestIndex := 0 bestIndex := -1
allowedCountries := map[string]string{} allowedCountries := map[string]string{}
allowedCountries["de"] = "1" if *country == "" {
allowedCountries["ch"] = "1" allowedCountries["de"] = "1"
allowedCountries["at"] = "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 && allowedCountries[server.CountryCode] != "" {
duration, err := serverLatency(server) duration, err := serverLatency(server)
if err == nil { if err == nil {
pings[server.Hostname] = duration pings[server.Hostname] = duration
if best == "" || pings[best] > pings[server.Hostname] { if bestIndex == -1 || pings[best] > pings[server.Hostname] {
best = server.Hostname best = server.Hostname
bestIndex = i bestIndex = i
} }