summaryrefslogtreecommitdiff
path: root/.config/nushell/vpn.nu
diff options
context:
space:
mode:
Diffstat (limited to '.config/nushell/vpn.nu')
-rw-r--r--.config/nushell/vpn.nu51
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)"
+ }
+}