use std::env;
use std::fs;
use std::os::unix::fs::PermissionsExt;
use std::path::Path;
use std::process::Command;
fn which(cmd: &str) -> bool {
env::var("PATH")
.unwrap_or_else(|_| "".to_owned())
.split(':')
.map(|d| match fs::metadata(Path::new(d).join(Path::new(cmd))) {
Ok(m) => m.is_file() && (m.permissions().mode() & 0o111) != 0,
Err(_) => false,
}).any(|x| x)
}
fn get_installer() -> Box<Fn(&str) -> bool> {
if which("apt") {
Box::new(|pkg| {
Command::new("apt-get")
.arg("-y")
.arg("--no-install-recommends")
.arg("install")
.arg(&pkg)
.status()
.map(|s| s.success())
.unwrap_or(false)
})
} else if which("yum") {
Box::new(|pkg| {
Command::new("yum")
.arg("-y")
.arg("install")
.arg(&pkg)
.status()
.map(|s| s.success())
.unwrap_or(false)
})
} else {
Box::new(|_| false)
}
}
pub fn install_packages(depends: &[String]) -> Result<(), String> {
let install = get_installer();
for d in depends {
if !install(d) {
return Err(format!("Couldn't install dependency: {}", d));
}
}
Ok(())
}
#[cfg(test)]
mod tests {
#[test]
fn test_which() {
assert_eq!(super::which("ls"), true);
assert_eq!(super::which("lllsss"), false);
}
}