navinstall/src/create_iso.rs
2024-12-29 12:03:10 +01:00

67 lines
1.9 KiB
Rust

use crate::{
install::{str_vec, uncomment_tag},
is_root, print_status, run_command,
};
pub fn build_kxkbrc(layout: &str, variant: Option<&str>) -> String {
let mut res = String::from("[Layout]\nUse=true\n");
res.push_str(&format!("LayoutList={layout}\n"));
if let Some(variant) = variant {
res.push_str(&format!("VariantList={variant}\n"));
}
res
}
pub fn create_iso(without_gui: bool, kb_layout: &str, kb_variant: Option<&str>) {
if !is_root() {
eprintln!("Error: You need root to create an ISO");
std::process::exit(1);
}
if !std::fs::exists("./iso").unwrap() {
let cmd = str_vec(vec!["git", "clone", "https://git.hydrar.de/navos/iso"]);
run_command(&cmd, None, false);
}
if without_gui {
std::fs::remove_file("./iso/airootfs/etc/systemd/system/display-manager.service").unwrap();
} else {
print_status("Adding GUI packages");
uncomment_tag("#gui: ", "./iso/packages.x86_64");
}
print_status("Setting keyboard layout");
std::fs::create_dir_all("./iso/airootfs/etc/skel/.config").unwrap();
std::fs::write(
"./iso/airootfs/etc/skel/.config/kxkbrc",
build_kxkbrc(kb_layout, kb_variant),
)
.unwrap();
std::fs::create_dir_all("./work").unwrap();
let mount_cmd = str_vec(vec![
"mount", "-t", "tmpfs", "-o", "size=10G", "tmpfs", "./work",
]);
run_command(&mount_cmd, None, false);
let mkarchiso_cmd = vec![
"mkarchiso".to_string(),
"-v".to_string(),
"-w".to_string(),
"./work".to_string(),
"-o".to_string(),
"./".to_string(),
"./iso".to_string(),
];
run_command(&mkarchiso_cmd, None, true);
let umount_cmd = str_vec(vec!["umount", "-r", "./work"]);
run_command(&umount_cmd, None, false);
std::fs::remove_dir_all("./work").unwrap();
}