# Connect to one of the Mullvad VPN Servers via Wireguard and optionally filter by name export def connect [ --filter: string # Filter by VPN server config name, e.g. 'de' to filter German servers ] { try { let current_status = (status) if ($current_status | is-not-empty) { let connected_server_name = ($current_status | get name | get 0) print $"You are already connected to ($connected_server_name)." return } let servers = (sudo ls /etc/wireguard/ | lines | str replace '.conf' '') | where { |name| $name =~ ($filter | default '') } sudo wg-quick up ($servers | select (random int 0..($servers | length)) | get 0) } catch { |err| print $"Failed to connect to VPN...\n\nError: ($err.msg)" } } # Check if you are connected to a Mullvad VPN server. # Return: # If connected: table # If not: nothing export def status [] { try { let response = (http get https://am.i.mullvad.net/connected --max-time 5sec) let result = ($response | parse "You are connected to Mullvad (server {name}). Your IP address is {ip}") if ($result | is-not-empty) { return $result } } catch { |err| print $"Failed to get response from status...\n\nError: ($err.msg)" } } # Disconnect the active VPN server connection export def disconnect [] { try { let current_status = (status) if ($current_status | is-empty) { print "You are not connected to any Mullvad VPN server." return } let current_server_name = ($current_status | get name | get 0) sudo wg-quick down $current_server_name } catch { |err| print $"Failed to disconnect active VPN connection...\n\n Error: ($err.msg)" } }