From e130e9e4c7e0a992d32df14902d338de1c773142 Mon Sep 17 00:00:00 2001 From: kitty <914384274@qq.com> Date: Sun, 23 Aug 2026 10:42:36 +0800 Subject: [PATCH] fix(gui): set HOME for macOS launchd service (#2509) Co-authored-by: hezz --- easytier-gui/src-tauri/src/lib.rs | 27 +++++++++++++++++++++++++++ easytier/src/easytier-cli.rs | 1 + easytier/src/service_manager/mod.rs | 3 ++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/easytier-gui/src-tauri/src/lib.rs b/easytier-gui/src-tauri/src/lib.rs index b0053ebc..39a0b848 100644 --- a/easytier-gui/src-tauri/src/lib.rs +++ b/easytier-gui/src-tauri/src/lib.rs @@ -1356,12 +1356,24 @@ mod service { } } + #[cfg(target_os = "macos")] + fn service_environment() -> Option> { + // System LaunchDaemons run as root but launchd does not provide HOME. + Some(vec![("HOME".to_string(), "/var/root".to_string())]) + } + + #[cfg(not(target_os = "macos"))] + fn service_environment() -> Option> { + None + } + pub fn install(opts: ServiceOptions) -> anyhow::Result<()> { let service = easytier::service_manager::Service::new(env!("CARGO_PKG_NAME").to_string())?; let options = easytier::service_manager::ServiceInstallOptions { program: super::get_exe_path().into(), args: opts.to_args_vec(), work_directory: std::env::current_dir()?, + environment: service_environment(), disable_autostart: false, description: Some("EasyTier Gui Service".to_string()), display_name: Some("EasyTier Gui Service".to_string()), @@ -1397,6 +1409,21 @@ mod service { let service = easytier::service_manager::Service::new(env!("CARGO_PKG_NAME").to_string())?; service.status() } + + #[cfg(test)] + mod tests { + #[test] + fn service_environment_matches_platform() { + #[cfg(target_os = "macos")] + assert_eq!( + super::service_environment(), + Some(vec![("HOME".to_string(), "/var/root".to_string())]) + ); + + #[cfg(not(target_os = "macos"))] + assert_eq!(super::service_environment(), None); + } + } } #[cfg_attr(mobile, tauri::mobile_entry_point)] diff --git a/easytier/src/easytier-cli.rs b/easytier/src/easytier-cli.rs index 569006d3..f841b27a 100644 --- a/easytier/src/easytier-cli.rs +++ b/easytier/src/easytier-cli.rs @@ -3227,6 +3227,7 @@ async fn main() -> Result<(), Error> { program: bin_path, args: bin_args, work_directory: work_dir, + environment: None, disable_autostart: install_args.disable_autostart.unwrap_or(false), description: Some(install_args.description), display_name: install_args.display_name, diff --git a/easytier/src/service_manager/mod.rs b/easytier/src/service_manager/mod.rs index 9587c38c..91dbd6c0 100644 --- a/easytier/src/service_manager/mod.rs +++ b/easytier/src/service_manager/mod.rs @@ -11,6 +11,7 @@ pub struct ServiceInstallOptions { pub program: PathBuf, pub args: Vec, pub work_directory: PathBuf, + pub environment: Option>, pub disable_autostart: bool, pub description: Option, pub display_name: Option, @@ -92,7 +93,7 @@ impl Service { autostart: !options.disable_autostart, username: None, working_directory: Some(options.work_directory.clone()), - environment: None, + environment: options.environment.clone(), disable_restart_on_failure: options.disable_restart_on_failure, };