diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-01-23 14:15:29 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-04-30 16:22:46 +0200 |
| commit | a1da9e64b657f95dc2690a1ac4c4e5293b83d1e5 (patch) | |
| tree | b3c7145bf11570832dcddaaf438cb20237f3eaae /mullvad-cli | |
| parent | b871bdf78c66848011925d8fd0d4291537e6e18e (diff) | |
| download | mullvadvpn-a1da9e64b657f95dc2690a1ac4c4e5293b83d1e5.tar.xz mullvadvpn-a1da9e64b657f95dc2690a1ac4c4e5293b83d1e5.zip | |
Add initial split tunneling implementation for macOS
Diffstat (limited to 'mullvad-cli')
| -rw-r--r-- | mullvad-cli/src/cmds/split_tunnel/macos.rs | 86 | ||||
| -rw-r--r-- | mullvad-cli/src/cmds/split_tunnel/mod.rs | 5 | ||||
| -rw-r--r-- | mullvad-cli/src/main.rs | 2 |
3 files changed, 90 insertions, 3 deletions
diff --git a/mullvad-cli/src/cmds/split_tunnel/macos.rs b/mullvad-cli/src/cmds/split_tunnel/macos.rs new file mode 100644 index 0000000000..534b4fd86a --- /dev/null +++ b/mullvad-cli/src/cmds/split_tunnel/macos.rs @@ -0,0 +1,86 @@ +use anyhow::Result; +use std::path::PathBuf; + +use clap::Subcommand; +use mullvad_management_interface::MullvadProxyClient; + +use super::super::BooleanOption; + +/// Set options for applications to exclude from the tunnel. +#[derive(Subcommand, Debug)] +pub enum SplitTunnel { + /// Display the split tunnel status and apps + Get, + + /// Enable or disable split tunnel + Set { policy: BooleanOption }, + + /// Manage applications to exclude from the tunnel + #[clap(subcommand)] + App(App), +} + +#[derive(Subcommand, Debug)] +pub enum App { + Add { path: PathBuf }, + Remove { path: PathBuf }, + Clear, +} + +impl SplitTunnel { + pub async fn handle(self) -> Result<()> { + match self { + SplitTunnel::Get => { + let mut rpc = MullvadProxyClient::new().await?; + let settings = rpc.get_settings().await?.split_tunnel; + + let enable_exclusions = BooleanOption::from(settings.enable_exclusions); + + println!("Split tunneling state: {enable_exclusions}"); + + println!("Excluded applications:"); + for path in &settings.apps { + println!("{}", path.display()); + } + + Ok(()) + } + SplitTunnel::Set { policy } => { + let mut rpc = MullvadProxyClient::new().await?; + rpc.set_split_tunnel_state(*policy).await?; + println!("Split tunnel policy: {policy}"); + Ok(()) + } + SplitTunnel::App(subcmd) => Self::app(subcmd).await, + } + } + + async fn app(subcmd: App) -> Result<()> { + match subcmd { + App::Add { path } => { + MullvadProxyClient::new() + .await? + .add_split_tunnel_app(path) + .await?; + println!("Added path to excluded apps list"); + Ok(()) + } + App::Remove { path } => { + MullvadProxyClient::new() + .await? + .remove_split_tunnel_app(path) + .await?; + println!("Stopped excluding app from tunnel"); + Ok(()) + } + App::Clear => { + MullvadProxyClient::new() + .await? + .clear_split_tunnel_apps() + .await?; + println!("Stopped excluding all apps"); + Ok(()) + } + } + } +} diff --git a/mullvad-cli/src/cmds/split_tunnel/mod.rs b/mullvad-cli/src/cmds/split_tunnel/mod.rs index c9e87f5d7c..37ed33b64b 100644 --- a/mullvad-cli/src/cmds/split_tunnel/mod.rs +++ b/mullvad-cli/src/cmds/split_tunnel/mod.rs @@ -6,5 +6,8 @@ mod imp; #[path = "windows.rs"] mod imp; -#[cfg(any(target_os = "linux", windows))] +#[cfg(target_os = "macos")] +#[path = "macos.rs"] +mod imp; + pub use imp::*; diff --git a/mullvad-cli/src/main.rs b/mullvad-cli/src/main.rs index 0dd5d26dbe..67990bd888 100644 --- a/mullvad-cli/src/main.rs +++ b/mullvad-cli/src/main.rs @@ -96,7 +96,6 @@ enum Cli { #[clap(subcommand)] Obfuscation(obfuscation::Obfuscation), - #[cfg(any(target_os = "windows", target_os = "linux"))] #[clap(subcommand)] SplitTunnel(split_tunnel::SplitTunnel), @@ -171,7 +170,6 @@ async fn main() -> Result<()> { Cli::FactoryReset => reset::handle().await, Cli::Relay(cmd) => cmd.handle().await, Cli::Tunnel(cmd) => cmd.handle().await, - #[cfg(any(target_os = "windows", target_os = "linux"))] Cli::SplitTunnel(cmd) => cmd.handle().await, Cli::Status { cmd, args } => status::handle(cmd, args).await, Cli::CustomList(cmd) => cmd.handle().await, |
