From 2cac61f5204f8421dbf8095c08973852ade811d9 Mon Sep 17 00:00:00 2001 From: James McMurray Date: Sun, 15 Nov 2020 14:05:12 +0100 Subject: [PATCH 1/2] Check pactl to set PULSE_SERVER for PulseAudio support --- src/main.rs | 11 +++++++++-- src/netns.rs | 4 ++-- src/pulseaudio.rs | 23 +++++++++++++++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 src/pulseaudio.rs diff --git a/src/main.rs b/src/main.rs index 759f0e4..fc62c02 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ mod network_interface; mod openconnect; mod openvpn; mod providers; +mod pulseaudio; mod shadowsocks; mod sync; mod sysctl; @@ -21,13 +22,14 @@ mod wireguard; use list::output_list; use list_configs::print_configs; -use log::LevelFilter; +use log::{debug, LevelFilter}; use netns::NetworkNamespace; use structopt::StructOpt; use sync::{sync_menu, synch}; use util::clean_dead_locks; use util::clean_dead_namespaces; use util::elevate_privileges; +use which::which; // TODO: // - Allow for not saving OpenVPN creds to config @@ -49,7 +51,12 @@ fn main() -> anyhow::Result<()> { match app.cmd { args::Command::Exec(cmd) => { clean_dead_locks()?; - + if which("pactl").is_ok() { + let pa = pulseaudio::get_pulseaudio_server()?; + std::env::set_var("PULSE_SERVER", pa); + } else { + debug!("pactl not found, will not set PULSE_SERVER"); + } elevate_privileges()?; clean_dead_namespaces()?; exec::exec(cmd)? diff --git a/src/netns.rs b/src/netns.rs index 284e1b6..b2f500d 100644 --- a/src/netns.rs +++ b/src/netns.rs @@ -100,8 +100,8 @@ impl NetworkNamespace { handle.current_dir(cdir); } let sudo_string = if user.is_some() { - handle.args(&["sudo", "-u", user.as_ref().unwrap()]); - Some(format!(" sudo -u {}", user.as_ref().unwrap())) + handle.args(&["sudo", "-Eu", user.as_ref().unwrap()]); + Some(format!(" sudo -Eu {}", user.as_ref().unwrap())) } else { None }; diff --git a/src/pulseaudio.rs b/src/pulseaudio.rs new file mode 100644 index 0000000..1621e7c --- /dev/null +++ b/src/pulseaudio.rs @@ -0,0 +1,23 @@ +use anyhow::anyhow; +use log::debug; +use regex::Regex; +use std::process::Command; + +pub fn get_pulseaudio_server() -> anyhow::Result { + let output = Command::new("pactl").args(&["info"]).output()?.stdout; + let re = Regex::new(r"Server String: ([^\n]+)").unwrap(); + let output = std::str::from_utf8(&output)?; + + let caps = re.captures(output); + if caps.is_none() { + return Err(anyhow!("Could not parse pactl output!")); + } + let caps = caps.unwrap().get(1); + if caps.is_none() { + return Err(anyhow!("Could not parse pactl output!")); + } + + let out = caps.unwrap().as_str().to_string(); + debug!("Setting PULSE_SERVER to {}", out); + Ok(out) +} From 95dbeaf69a19eefab0bcd415f939909cb1663a81 Mon Sep 17 00:00:00 2001 From: James McMurray Date: Sun, 15 Nov 2020 14:08:07 +0100 Subject: [PATCH 2/2] Update version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index c9ea20f..6eca795 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "vopono" description = "Launch applications via VPN tunnels using temporary network namespaces" -version = "0.5.3" +version = "0.6.0" authors = ["James McMurray "] edition = "2018" license = "GPL-3.0-or-later"