diff --git a/server_manager/src/core/hardware.rs b/server_manager/src/core/hardware.rs index f74ba34..a96c1a2 100644 --- a/server_manager/src/core/hardware.rs +++ b/server_manager/src/core/hardware.rs @@ -1,7 +1,7 @@ use sysinfo::{System, SystemExt, DiskExt}; use std::process::Command; use std::path::Path; -use log::{info}; +use log::{info, warn}; #[derive(Debug, Clone, Copy, PartialEq)] pub enum HardwareProfile { @@ -19,10 +19,13 @@ pub struct HardwareInfo { pub has_intel_quicksync: bool, pub disk_gb: u64, pub swap_gb: u64, + pub user_id: String, + pub group_id: String, } impl HardwareInfo { pub fn detect() -> Self { + let (user_id, group_id) = Self::detect_user(); let mut sys = System::new_all(); sys.refresh_memory(); sys.refresh_cpu(); @@ -49,6 +52,7 @@ impl HardwareInfo { info!("Hardware Detected: RAM={}GB, Swap={}GB, Disk={}GB, Cores={}, Profile={:?}", ram_gb, swap_gb, disk_gb, cpu_cores, profile); if has_nvidia { info!("Nvidia GPU Detected"); } if has_intel_quicksync { info!("Intel QuickSync Detected"); } + info!("User Context: UID={}, GID={}", user_id, group_id); Self { profile, @@ -58,6 +62,23 @@ impl HardwareInfo { has_intel_quicksync, disk_gb, swap_gb, + user_id, + group_id, + } + } + + fn detect_user() -> (String, String) { + if let Ok(user) = std::env::var("SUDO_USER") { + let uid = Command::new("id").arg("-u").arg(&user).output() + .map(|o| String::from_utf8_lossy(&o.stdout).trim().to_string()) + .unwrap_or_else(|_| "1000".to_string()); + let gid = Command::new("id").arg("-g").arg(&user).output() + .map(|o| String::from_utf8_lossy(&o.stdout).trim().to_string()) + .unwrap_or_else(|_| "1000".to_string()); + (uid, gid) + } else { + warn!("SUDO_USER not found. Defaulting to UID/GID 1000."); + ("1000".to_string(), "1000".to_string()) } } diff --git a/server_manager/src/services/apps.rs b/server_manager/src/services/apps.rs index 434e0c4..f2a158f 100644 --- a/server_manager/src/services/apps.rs +++ b/server_manager/src/services/apps.rs @@ -140,10 +140,10 @@ $AUTOCONFIG = array( Ok(()) } - fn env_vars(&self, _hw: &HardwareInfo, secrets: &Secrets) -> HashMap { + fn env_vars(&self, hw: &HardwareInfo, secrets: &Secrets) -> HashMap { let mut vars = HashMap::new(); - vars.insert("PUID".to_string(), "1000".to_string()); - vars.insert("PGID".to_string(), "1000".to_string()); + vars.insert("PUID".to_string(), hw.user_id.clone()); + vars.insert("PGID".to_string(), hw.group_id.clone()); vars.insert("MYSQL_HOST".to_string(), "mariadb".to_string()); vars.insert("MYSQL_DATABASE".to_string(), "nextcloud".to_string()); vars.insert("MYSQL_USER".to_string(), "nextcloud".to_string()); diff --git a/server_manager/src/services/arr.rs b/server_manager/src/services/arr.rs index 030ba39..cfddc57 100644 --- a/server_manager/src/services/arr.rs +++ b/server_manager/src/services/arr.rs @@ -18,8 +18,8 @@ macro_rules! define_arr_service { } fn env_vars(&self, hw: &HardwareInfo, _secrets: &Secrets) -> HashMap { let mut vars = HashMap::new(); - vars.insert("PUID".to_string(), "1000".to_string()); - vars.insert("PGID".to_string(), "1000".to_string()); + vars.insert("PUID".to_string(), hw.user_id.clone()); + vars.insert("PGID".to_string(), hw.group_id.clone()); vars.insert("COMPlus_EnableDiagnostics".to_string(), "0".to_string()); if let HardwareProfile::Low = hw.profile { diff --git a/server_manager/src/services/download.rs b/server_manager/src/services/download.rs index 1b1ee6e..17530dc 100644 --- a/server_manager/src/services/download.rs +++ b/server_manager/src/services/download.rs @@ -13,10 +13,10 @@ impl Service for QBittorrentService { vec!["8080:8080".to_string(), "6881:6881".to_string(), "6881:6881/udp".to_string()] } - fn env_vars(&self, _hw: &HardwareInfo, _secrets: &Secrets) -> HashMap { + fn env_vars(&self, hw: &HardwareInfo, _secrets: &Secrets) -> HashMap { let mut vars = HashMap::new(); - vars.insert("PUID".to_string(), "1000".to_string()); - vars.insert("PGID".to_string(), "1000".to_string()); + vars.insert("PUID".to_string(), hw.user_id.clone()); + vars.insert("PGID".to_string(), hw.group_id.clone()); vars.insert("WEBUI_PORT".to_string(), "8080".to_string()); vars } diff --git a/server_manager/src/services/infra.rs b/server_manager/src/services/infra.rs index c90a49d..038e117 100644 --- a/server_manager/src/services/infra.rs +++ b/server_manager/src/services/infra.rs @@ -49,10 +49,10 @@ impl Service for MariaDBService { Ok(()) } - fn env_vars(&self, _hw: &HardwareInfo, secrets: &Secrets) -> HashMap { + fn env_vars(&self, hw: &HardwareInfo, secrets: &Secrets) -> HashMap { let mut vars = HashMap::new(); - vars.insert("PUID".to_string(), "1000".to_string()); - vars.insert("PGID".to_string(), "1000".to_string()); + vars.insert("PUID".to_string(), hw.user_id.clone()); + vars.insert("PGID".to_string(), hw.group_id.clone()); vars.insert("MYSQL_ROOT_PASSWORD".to_string(), secrets.mysql_root_password.clone().unwrap_or_default()); vars.insert("MYSQL_DATABASE".to_string(), "server_manager".to_string()); vars.insert("MYSQL_USER".to_string(), "server_manager".to_string()); diff --git a/server_manager/src/services/media.rs b/server_manager/src/services/media.rs index 16e7342..c85fff6 100644 --- a/server_manager/src/services/media.rs +++ b/server_manager/src/services/media.rs @@ -15,8 +15,8 @@ impl Service for PlexService { fn env_vars(&self, hw: &HardwareInfo, _secrets: &Secrets) -> HashMap { let mut vars = HashMap::new(); - vars.insert("PUID".to_string(), "1000".to_string()); - vars.insert("PGID".to_string(), "1000".to_string()); + vars.insert("PUID".to_string(), hw.user_id.clone()); + vars.insert("PGID".to_string(), hw.group_id.clone()); vars.insert("VERSION".to_string(), "docker".to_string()); // Legacy requirement diff --git a/server_manager/tests/integration_tests.rs b/server_manager/tests/integration_tests.rs index d3e4578..28021f9 100644 --- a/server_manager/tests/integration_tests.rs +++ b/server_manager/tests/integration_tests.rs @@ -13,6 +13,8 @@ fn test_generate_compose_structure() { has_intel_quicksync: false, disk_gb: 512, swap_gb: 2, + user_id: "1000".to_string(), + group_id: "1000".to_string(), }; let secrets = Secrets { mysql_root_password: Some("rootpass".to_string()), @@ -65,6 +67,8 @@ fn test_profile_logic_low() { has_intel_quicksync: false, disk_gb: 100, swap_gb: 0, + user_id: "1000".to_string(), + group_id: "1000".to_string(), }; let secrets = Secrets::default(); @@ -90,6 +94,8 @@ fn test_profile_logic_standard() { has_intel_quicksync: false, disk_gb: 512, swap_gb: 4, + user_id: "1000".to_string(), + group_id: "1000".to_string(), }; let secrets = Secrets::default();