use post-vpn-connect.nu use pre-vpn-disconnect.nu # 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 active_interface = (active-interface) if ($active_interface | is-not-empty) { print $"You are already connected to ($active_interface)." 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) - 1)) | get 0) print "Executing Post-VPN Connect Tasks..." post-vpn-connect print "Finished Post-VPN Connect Tasks..." } catch { |err| print $"Failed to connect to VPN...\n\nError: ($err.msg)" } } # Check if you are connected to a Mullvad VPN server. export def test-connection [] { try { let response = (http get https://am.i.mullvad.net/connected --max-time 5sec) return $response } catch { |err| print $"Failed to get response from status...\n\nError: ($err.msg)" } } # Check if a Wireguard interface is up and running. # If yes: string (name of interface) # If not: nothing export def active-interface [] { try { let wg_show_output = (sudo wg show | lines) if ($wg_show_output | is-not-empty) { $wg_show_output | get 0 | parse "interface: {interface}" | get 0 | return $in.interface } } catch { |err| print $"Failed to check active Wireguard interface...\n\nError: ($err.msg)" } } # Disconnect the active VPN server connection. export def disconnect [] { try { let active_interface = (active-interface) if ($active_interface | is-empty) { print "You are not connected to any Mullvad VPN server." return } print "Executing Pre-VPN Disconnect Tasks..." pre-vpn-disconnect print "Finished Pre-VPN Disconnect Tasks..." sudo wg-quick down $active_interface } catch { |err| print $"Failed to disconnect active VPN connection...\n\n Error: ($err.msg)" } }