use std::path::{Path, PathBuf};
use std::process::Output;
use tokio::process::Command;
pub async fn install_package(package_name: &str, debug: bool) -> Result<(), String> {
match package_name.to_lowercase().as_str() {
"grafana" => execute_install_script("grafana", debug).await,
"scylladb" => execute_install_script("scylladb", debug).await,
"nginx_full" => execute_install_script("nginx_full", debug).await,
"opencv-rust" => execute_install_script("opencv-rust", debug).await,
"elixir_erlang" => execute_install_script("elixir_erlang", debug).await,
"docker" => execute_install_script("docker", debug).await,
"triggerdotdev" => execute_install_script("triggerdotdev", debug).await,
"iotop" => execute_install_script("iotop", debug).await,
_ => Err(format!(
"Package '{}' is not supported. Available packages: grafana, scylladb, nginx_full, opencv-rust, docker, elixir_erlang, triggerdotdev, iotop",
package_name
)),
}
}
async fn execute_install_script(package_name: &str, debug: bool) -> Result<(), String> {
let script_path: String = format!("./package_install_scripts/{}.sh", package_name);
let script_pathbuf: PathBuf = PathBuf::from(&script_path);
if debug {
println!("[DEBUG] Looking for install script at: {}", script_path);
}
if !script_pathbuf.exists() {
return Err(format!("Install script not found: {}", script_path));
}
if debug {
println!("[DEBUG] Making script executable: {}", script_path);
}
let chmod_output: Output = Command::new("chmod")
.arg("+x")
.arg(&script_path)
.output()
.await
.map_err(|e| format!("Failed to execute chmod command: {}", e))?;
if !chmod_output.status.success() {
return Err(format!(
"Failed to make script executable: {}",
String::from_utf8_lossy(&chmod_output.stderr)
));
}
if debug {
println!("[DEBUG] Executing install script: {}", script_path);
}
let script_output: Output = Command::new("bash")
.arg(&script_path)
.output()
.await
.map_err(|e| format!("Failed to execute install script: {}", e))?;
if debug {
println!("[DEBUG] Script output: {:?}", script_output);
}
if !script_output.status.success() {
return Err(format!(
"Install script failed: {}",
String::from_utf8_lossy(&script_output.stderr)
));
}
let stdout = String::from_utf8_lossy(&script_output.stdout);
if !stdout.trim().is_empty() {
println!("{}", stdout);
}
println!(
"\x1b[92m{} installation completed successfully!\x1b[0m",
package_name
);
Ok(())
}