Compare commits

...

4 Commits

3 changed files with 19 additions and 12 deletions

View File

@ -14,6 +14,7 @@ builds:
- linux
- windows
- darwin
mod_timestamp: "{{ .CommitTimestamp }}"
archives:
- replacements:
darwin: Darwin
@ -21,6 +22,8 @@ archives:
windows: Windows
386: i386
amd64: x86_64
format: binary
name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
checksum:
name_template: 'checksums.txt'
snapshot:

View File

@ -1,7 +1,7 @@
# 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 mullvad.net server with the lowest latency.
## Installation
@ -30,3 +30,15 @@ The `-c` flag allows to give a country code. Else `ch` will be used.
## Background
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.
## Integration into a script
I use it on my router like this (yes, I know I could have done the whole thing with jq and shell scripting, but wanted to use go for maintainability).
```
#!/bin/sh
set -e
LATEST_RELEASE=$(curl -sSL https://api.github.com/repos/bastiandoetsch/mullvad-best-server/releases/latest | jq -r '.assets[]| .browser_download_url' | grep Linux_arm64)
curl -sSL $LATEST_RELEASE > /root/mullvad-best-server
chmod +x /root/mullvad-best-server
/usr/bin/wg-quick down $(wg show|grep interface | cut -d: -f2) || echo "nothing to shut down"
/usr/bin/wg-quick up "mullvad-$(/root/mullvad-best-server -c de)"
```

14
main.go
View File

@ -24,7 +24,7 @@ func main() {
flag.Parse()
servers := getServers(*typeFlag)
bestIndex := selectBestServerIndex(servers, countryFlag)
bestIndex := selectBestServerIndex(servers, *countryFlag)
best := servers[bestIndex]
log.Debug().Interface("server", best).Msg("Best latency server found.")
hostname := strings.TrimSuffix(best.Hostname, "-wireguard")
@ -39,19 +39,11 @@ func main() {
}
}
func selectBestServerIndex(servers []server, country *string) int {
func selectBestServerIndex(servers []server, country string) int {
best := servers[0].Hostname
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 {
if server.Active && allowedCountries[server.CountryCode] != "" {
if server.Active && server.CountryCode == country {
duration, err := serverLatency(server)
if err == nil {
pings[server.Hostname] = duration