mirror of
https://github.com/Grasscutters/Cultivation.git
synced 2025-12-13 23:54:48 +01:00
Add an option that allows binding port 443
Kinda everts some changes of "Implement MongoDB autostart and GC watching". This commit makes launching MongoDB async
This commit is contained in:
@@ -214,6 +214,7 @@ fn main() -> Result<(), ArgsError> {
|
||||
system_helpers::service_status,
|
||||
system_helpers::stop_service,
|
||||
system_helpers::run_jar,
|
||||
system_helpers::run_jar_root,
|
||||
system_helpers::open_in_browser,
|
||||
system_helpers::install_location,
|
||||
system_helpers::is_elevated,
|
||||
@@ -222,6 +223,8 @@ fn main() -> Result<(), ArgsError> {
|
||||
system_helpers::wipe_registry,
|
||||
system_helpers::get_platform,
|
||||
system_helpers::run_un_elevated,
|
||||
system_helpers::jvm_add_cap,
|
||||
system_helpers::jvm_remove_cap,
|
||||
patch::patch_game,
|
||||
patch::unpatch_game,
|
||||
proxy::set_proxy_addr,
|
||||
|
||||
@@ -30,6 +30,56 @@ fn guess_user_terminal() -> String {
|
||||
"xterm".to_string()
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
fn rawstrcmd(cmd: &Command) -> String {
|
||||
format!("{:?}", cmd)
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
fn strcmd(cmd: &Command) -> String {
|
||||
format!("bash -c {:?}", rawstrcmd(cmd))
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
pub trait AsRoot {
|
||||
fn as_root(&self) -> Self;
|
||||
fn as_root_gui(&self) -> Self;
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
impl AsRoot for Command {
|
||||
fn as_root(&self) -> Self {
|
||||
let mut cmd = Command::new("sudo");
|
||||
cmd.arg("--").arg("bash").arg("-c").arg(rawstrcmd(self));
|
||||
cmd
|
||||
}
|
||||
fn as_root_gui(&self) -> Self {
|
||||
let mut cmd = Command::new("pkexec");
|
||||
cmd.arg("bash").arg("-c").arg(rawstrcmd(self));
|
||||
cmd
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
trait InTerminalEmulator {
|
||||
fn in_terminal(&self) -> Self;
|
||||
fn in_terminal_noclose(&self) -> Self;
|
||||
}
|
||||
#[cfg(target_os = "linux")]
|
||||
impl InTerminalEmulator for Command {
|
||||
fn in_terminal(&self) -> Self {
|
||||
let mut cmd = Command::new(guess_user_terminal());
|
||||
cmd.arg("-e").arg(strcmd(self));
|
||||
cmd
|
||||
}
|
||||
fn in_terminal_noclose(&self) -> Self {
|
||||
let mut cmd = Command::new(guess_user_terminal());
|
||||
cmd.arg("--noclose");
|
||||
cmd.arg("-e").arg(strcmd(self));
|
||||
cmd
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
pub trait SpawnItsFineReally {
|
||||
fn spawn_its_fine_really(&mut self, msg: &str) -> anyhow::Result<()>;
|
||||
@@ -159,6 +209,38 @@ pub fn run_jar(path: String, execute_in: String, java_path: String) {
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
#[tauri::command]
|
||||
pub fn run_jar_root(path: String, execute_in: String, java_path: String) {
|
||||
panic!("Not implemented");
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
#[tauri::command]
|
||||
pub fn run_jar_root(path: String, execute_in: String, java_path: String) {
|
||||
let mut command = if java_path.is_empty() {
|
||||
Command::new("java")
|
||||
} else {
|
||||
Command::new(java_path)
|
||||
};
|
||||
command.arg("-jar").arg(&path).current_dir(&execute_in);
|
||||
|
||||
println!("Launching .jar with command: {}", strcmd(&command));
|
||||
|
||||
// Open the program from the specified path.
|
||||
thread::spawn(move || {
|
||||
match command.as_root_gui().in_terminal().spawn() {
|
||||
Ok(mut handler) => {
|
||||
// Prevent creation of zombie processes
|
||||
handler
|
||||
.wait()
|
||||
.expect("Grasscutter exited with non-zero exit code");
|
||||
}
|
||||
Err(e) => println!("Failed to open jar ({} from {}): {}", &path, &execute_in, e),
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
#[tauri::command]
|
||||
pub fn run_un_elevated(path: String, args: Option<String>) {
|
||||
@@ -476,3 +558,55 @@ pub fn is_elevated() -> bool {
|
||||
pub fn get_platform() -> &'static str {
|
||||
std::env::consts::OS
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
#[tauri::command]
|
||||
pub async fn jvm_add_cap(_java_path: String) -> bool {
|
||||
panic!("Not implemented");
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
#[tauri::command]
|
||||
pub async fn jvm_remove_cap(_java_path: String) -> bool {
|
||||
panic!("Not implemented");
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
#[tauri::command]
|
||||
pub async fn jvm_add_cap(java_path: String) -> bool {
|
||||
let mut java_bin = if java_path.is_empty() {
|
||||
which::which("java").expect("Java is not installed")
|
||||
} else {
|
||||
PathBuf::from(&java_path)
|
||||
};
|
||||
while java_bin.is_symlink() {
|
||||
java_bin = java_bin.read_link().unwrap()
|
||||
}
|
||||
println!("Removing cap on {:?}", &java_bin);
|
||||
Command::new("setcap")
|
||||
.arg("CAP_NET_BIND_SERVICE=+eip")
|
||||
.arg(java_bin)
|
||||
.as_root_gui()
|
||||
.spawn_its_fine_really(&format!("Failed to add cap to {}", java_path))
|
||||
.is_ok()
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
#[tauri::command]
|
||||
pub async fn jvm_remove_cap(java_path: String) -> bool {
|
||||
let mut java_bin = if java_path.is_empty() {
|
||||
which::which("java").expect("Java is not installed")
|
||||
} else {
|
||||
PathBuf::from(&java_path)
|
||||
};
|
||||
while java_bin.is_symlink() {
|
||||
java_bin = java_bin.read_link().unwrap()
|
||||
}
|
||||
println!("Setting cap on {:?}", &java_bin);
|
||||
Command::new("setcap")
|
||||
.arg("-r")
|
||||
.arg(java_bin)
|
||||
.as_root_gui()
|
||||
.spawn_its_fine_really(&format!("Failed to remove cap from {}", java_path))
|
||||
.is_ok()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user