# Get a Mullvad api access token from an account number def "m token" [ account: string # Mullvad account number ] { (http post https://api.mullvad.net/auth/v1/token -t application/json {account_number: $account} ).access_token } # Add a device to a mullvad account def "m add device" [ account: string # Mullvad account number ] { let token = (m-token $account) let bearer = ("Bearer " + $token) (http post https://api.mullvad.net/accounts/v1/devices -t application/json -H [Authorization $bearer] { pubkey: (wg genkey | wg pubkey), hijack_dns: false, kind: "App", }) } # Get mullvad-daemon system path def "m daemon path" []: nothing -> string { match (uname).kernel-name { Linux => "/usr/bin/mullvad-daemon", Darwin => "/Applications/Mullvad VPN.app/Contents/Resources/mullvad-daemon", _ => (panic "Unknown Kernel"), } } # Return true if mullvad-daemon is running def "m daemon is-running" [ # Only return true if mullvad-daemon is running as a launch daemon --system (-s), ] { let procs = (^ps aux | lines) if $system { $procs | any { |line| $line =~ (m daemon path) } } else { $procs | any { |line| $line =~ "mullvad-daemon" } } } def dns [ --server (-s): string, name: string, ] { # HACK: turn the optional argument into a list. not sure how to pass it to nslookup otherwise. let server = ([$server] | compact) let ipv4 = (dig $name A | lines | skip until {|l| $l =~ "ANSWER SECTION" } | skip 1 | take until { |l| $l == "" } | split column "\t" -c | rename host ttl _ type addr) | reject _ let ipv6 = (dig $name AAAA | lines | skip until {|l| $l =~ "ANSWER SECTION" } | skip 1 | take until { |l| $l == "" } | split column "\t" -c | rename host ttl _ type addr) | reject _ $ipv4 | append $ipv6 } # Build and run mullvad-daemon def "m daemon" [ --release (-r) --boringtun --stagemole ] { mut cargo_flags = [] mut envs = [ MULLVAD_RESOURCE_DIR=./dist-assets/ ] if $release { $cargo_flags ++= [--release] } if $stagemole { $cargo_flags ++= [--features api-override] $envs ++= [ MULLVAD_API_HOST=api.stagemole.eu MULLVAD_API_ADDR=(dns api.stagemole.eu | where type == A | get 0.addr):443 ] } if $boringtun { $cargo_flags ++= [--features boringtun] } if (m daemon is-running --system) { print "daemon is loaded, stopping..." match (uname).kernel-name { Linux => { sudo systemctl stop mullvad-daemon }, Darwin => { sudo launchctl unload -w /Library/LaunchDaemons/net.mullvad.daemon.plist }, _ => (panic "Unknown Kernel"), } } else if (m daemon is-running) { print "mulvad-daemon is running in another terminal" return } let daemon_path = if $release { $"($env.CARGO_TARGET_DIR)/release/mullvad-daemon" } else { $"($env.CARGO_TARGET_DIR)/debug/mullvad-daemon" } cargo b ...$cargo_flags sudo ...$envs $daemon_path -vv } def "m e2e list" [ ...args ] { print "Building test utils" cargo b --target aarch64-apple-darwin let test_manager = $"($env.CARGO_TARGET_DIR)/aarch64-apple-darwin/debug/test-manager" print "Listing tests" ^$test_manager list-tests ...$args | from tsv | into int priority | sort-by priority name } def "m e2e run" [ account: string --skip: list ...tests ] { let commit = (git rev-parse HEAD | take 6 | decode) print $"Current commit: ($commit)" let dist = "../dist" print $"Looking in ($dist)" let pkgs = (ls $dist | where name =~ ".*\\.pkg") let pkgs = ($pkgs | where name =~ $commit) if ($pkgs | is-empty) { print "No .pkg for current commit found." print "Run ./build.sh" return } if ($pkgs | length) > 1 { print "Multiple .pkg:s for current commit found." print "Make sure there's only one" print ...$pkgs return } let pkg = ($pkgs | get 0.name) print $"Using ($pkg)" print "Building test utils" cargo b --target aarch64-apple-darwin let test_manager = $"($env.CARGO_TARGET_DIR)/aarch64-apple-darwin/debug/test-manager" mut args = [ --vm macos15 --account $account --app-package $pkg ] for s in $skip { $args ++= ["--skip" $s] } let args = $args print "Running tests" RUST_LOG=debug ^$test_manager run-tests -v ...$args ...$tests }