diff options
Diffstat (limited to '.config/nushell/vpn.nu')
| -rw-r--r-- | .config/nushell/vpn.nu | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/.config/nushell/vpn.nu b/.config/nushell/vpn.nu new file mode 100644 index 0000000..63ab2e0 --- /dev/null +++ b/.config/nushell/vpn.nu @@ -0,0 +1,51 @@ +# 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<name: string, ip: string> +# 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)" + } +} |
