summaryrefslogtreecommitdiffhomepage
path: root/mullvad-cli/src/cmds
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2024-01-23 14:15:29 +0100
committerDavid Lönnhager <david.l@mullvad.net>2024-04-30 16:22:46 +0200
commita1da9e64b657f95dc2690a1ac4c4e5293b83d1e5 (patch)
treeb3c7145bf11570832dcddaaf438cb20237f3eaae /mullvad-cli/src/cmds
parentb871bdf78c66848011925d8fd0d4291537e6e18e (diff)
downloadmullvadvpn-a1da9e64b657f95dc2690a1ac4c4e5293b83d1e5.tar.xz
mullvadvpn-a1da9e64b657f95dc2690a1ac4c4e5293b83d1e5.zip
Add initial split tunneling implementation for macOS
Diffstat (limited to 'mullvad-cli/src/cmds')
-rw-r--r--mullvad-cli/src/cmds/split_tunnel/macos.rs86
-rw-r--r--mullvad-cli/src/cmds/split_tunnel/mod.rs5
2 files changed, 90 insertions, 1 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::*;