use anyhow::bail;
use rust_embed::RustEmbed;
use std::env;
use std::fs;
#[cfg(unix)]
use std::os::unix::fs::PermissionsExt;
use std::path::PathBuf;
#[derive(Debug, RustEmbed)]
#[folder = "scripts/"]
struct Scripts;
pub struct Init {}
impl Init {
pub fn create(dir: &PathBuf) -> anyhow::Result<()> {
let initdir = if dir.is_absolute() {
dir.to_path_buf()
} else {
env::current_dir()?.join(dir)
};
if initdir.exists() {
if !initdir.is_dir() {
bail!("{} exists and is not a directory", initdir.display());
}
if fs::read_dir(&initdir)?.next().is_some() {
bail!("{} exists and is not empty", initdir.display());
}
}
let Some(initdir_str) = initdir.to_str() else {
bail!("Sorry, configuration directory must be valid UTF-8");
};
println!("Initialising new configuration directory {}:", initdir_str);
let (current_os, confstr) = match env::consts::OS {
"illumos" => ("illumos", include_str!("../config/illumos.lua")),
"linux" => ("linux", include_str!("../config/linux.lua")),
"macos" => ("macos", include_str!("../config/macos.lua")),
"netbsd" => ("netbsd", include_str!("../config/netbsd.lua")),
"solaris" => ("illumos", include_str!("../config/illumos.lua")),
os => {
eprintln!(
"WARNING: OS '{}' not explicitly supported, using generic config",
os
);
(os, include_str!("../config/generic.lua"))
}
};
let confstr = confstr.replace("@INITDIR@", initdir_str);
let conffile = initdir.join("config.lua");
fs::create_dir_all(conffile.parent().unwrap())?;
fs::write(&conffile, confstr)?;
println!("\t{}", conffile.display());
for script in Scripts::iter() {
let script_path = PathBuf::from(&*script);
let components: Vec<_> = script_path.components().collect();
let dest = if components.len() > 1 {
if components[0].as_os_str().to_str() != Some(current_os) {
continue;
}
components[1..].iter().collect()
} else {
script_path
};
if let Some(content) = Scripts::get(&script) {
let fp = initdir.join("scripts").join(&dest);
fs::create_dir_all(fp.parent().unwrap())?;
fs::write(&fp, content.data)?;
#[cfg(unix)]
{
let mut perms = fs::metadata(&fp)?.permissions();
perms.set_mode(0o755);
fs::set_permissions(&fp, perms)?;
}
println!("\t{}", fp.display());
}
}
Ok(())
}
}