diff --git a/README.md b/README.md index fa32b70..d30a11c 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,9 @@ navOS Installer ## Create install medium -You can create a bootable install medium with various predefined options: - +You can create a bootable install medium either with or without GUI: ```sh -navinstall create-iso [--without_gui] [--kb_layout ] [--kb_variant ] +navinstall create-iso [--without_gui] ``` ## Install a system @@ -16,12 +15,3 @@ navinstall install config.toml `config.toml` is a system configuration describing how to install the system. Example configurations can be found [here](installs) or at `/usr/share/navinstall/installs/`. - -## Create an unattended installer -You can create an install medium which immidiately upon boot installs a configuration: - -```sh -navinstall create-iso --install config.toml -``` - -> ⚠️ WARNING: This is potentially destructive and will probably wipe all data on the disks if randomly booted from. diff --git a/installs/full.toml b/installs/full.toml index 02e9c43..c138139 100644 --- a/installs/full.toml +++ b/installs/full.toml @@ -55,17 +55,6 @@ name = "u" # User password password = "pass" -# User ID -uid = 1001 - -# The home directory of the user -home_dir = "/home/u" -# You can leave the user without a home dir using: -# home_dir = "" - -# Set the shell of the user -shell = "/bin/bash" - # Allow user to use `doas` as root doas_root= true diff --git a/src/config.rs b/src/config.rs index 4330d54..59531eb 100644 --- a/src/config.rs +++ b/src/config.rs @@ -41,9 +41,6 @@ pub struct SSHKey { pub struct UserConfig { pub name: String, pub password: String, - pub uid: Option, - pub home_dir: Option, - pub shell: Option, pub doas_root: Option, pub docker: Option, pub virtualization: Option, diff --git a/src/install/first_boot.rs b/src/install/first_boot.rs index 6085b23..93dcf4f 100644 --- a/src/install/first_boot.rs +++ b/src/install/first_boot.rs @@ -35,7 +35,6 @@ pub fn first_boot_values(conf: &GeneralConfig) { } std::os::unix::fs::symlink(tz_link, "/mnt/etc/localtime").unwrap(); - arch_chroot(&["hwclock", "--systohc"], None, false); // Keymap print_status("Writing /etc/vconsole.conf"); @@ -50,6 +49,8 @@ pub fn first_boot_values(conf: &GeneralConfig) { uncomment_first_value_of(&conf.locale, "/mnt/etc/locale.gen"); arch_chroot(&["locale-gen"], None, false); + arch_chroot(&["hwclock", "--systohc"], None, false); + if let Some(root_pw) = &conf.root_password { change_passwd("root", root_pw); } diff --git a/src/install/kernel.rs b/src/install/kernel.rs index c71c69b..5e27c7e 100644 --- a/src/install/kernel.rs +++ b/src/install/kernel.rs @@ -26,6 +26,7 @@ pub fn setup_mkinitcpio(conf: &DriveConfig) { std::fs::write("/mnt/etc/kernel/cmdline", format!("root={}", conf.root)).unwrap(); } + // TODO : more configs print_status("Writing /etc/mkinitcpio.conf"); install_file( "/mnt/etc/mkinitcpio.conf", diff --git a/src/install/mod.rs b/src/install/mod.rs index 228483e..1cc1ed5 100644 --- a/src/install/mod.rs +++ b/src/install/mod.rs @@ -76,7 +76,6 @@ pub fn uncomment_tag(tag: &str, file: &str) { std::fs::write(file, new).unwrap(); } -/// Install a config on a new system pub fn install(conf: InstallConfig) { // Drive Setup format_drives(&conf.drive); diff --git a/src/install/user.rs b/src/install/user.rs index 25ed68f..ad0ca32 100644 --- a/src/install/user.rs +++ b/src/install/user.rs @@ -13,35 +13,7 @@ pub fn setup_users(conf: &[UserConfig]) { let mut doas_conf = String::new(); for user in conf { - let mut cmd = vec!["useradd"]; - - if let Some(home_dir) = &user.home_dir { - if home_dir.is_empty() { - cmd.push("-M"); - } else { - cmd.push("-m"); - cmd.push("-d"); - cmd.push(home_dir); - } - } else { - cmd.push("-m"); - } - - let uid = user.uid.map(|x| x.to_string()); - - if let Some(uid) = &uid { - cmd.push("-u"); - cmd.push(uid); - } - - if let Some(shell) = &user.shell { - cmd.push("-s"); - cmd.push(shell); - } - - cmd.push(&user.name); - - arch_chroot(&cmd, None, false); + arch_chroot(&["useradd", "-m", &user.name], None, false); change_passwd(&user.name, &user.password); diff --git a/src/main.rs b/src/main.rs index bdf8902..fae07a6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,7 +50,25 @@ fn main() { } Some(("create-img", install_args)) => { let config_file: &String = install_args.get_one("config").unwrap(); - let conf = read_conf(config_file); + let config_content = std::fs::read_to_string(config_file); + + let conf: InstallConfig = match config_content { + Ok(content) => match toml::from_str(&content) { + Ok(config) => config, + Err(e) => { + eprintln!( + "{} {}", + "Error: Could not deserialize TOML file.".paint(Color::Red), + e.paint(Color::Red) + ); + std::process::exit(1); + } + }, + Err(_) => { + eprintln!("{}", "Error: Could not read config file.".paint(Color::Red)); + std::process::exit(1); + } + }; println!("Installing to a disk image is not yet supported"); unimplemented!() @@ -63,7 +81,25 @@ fn main() { let config_file: &String = install_args.get_one("config").unwrap(); let force = install_args.get_flag("force"); - let conf = read_conf(config_file); + let config_content = std::fs::read_to_string(config_file); + + let conf: InstallConfig = match config_content { + Ok(content) => match toml::from_str(&content) { + Ok(config) => config, + Err(e) => { + eprintln!( + "{} {}", + "Error: Could not deserialize TOML file.".paint(Color::Red), + e.paint(Color::Red) + ); + std::process::exit(1); + } + }, + Err(_) => { + eprintln!("{}", "Error: Could not read config file.".paint(Color::Red)); + std::process::exit(1); + } + }; if !force { print_config(&conf); @@ -92,25 +128,3 @@ pub fn expect_yes() { std::process::exit(0); } } - -pub fn read_conf(config_file: &str) -> InstallConfig { - let config_content = std::fs::read_to_string(config_file); - - match config_content { - Ok(content) => match toml::from_str(&content) { - Ok(config) => config, - Err(e) => { - eprintln!( - "{} {}", - "Error: Could not deserialize TOML file.".paint(Color::Red), - e.paint(Color::Red) - ); - std::process::exit(1); - } - }, - Err(_) => { - eprintln!("{}", "Error: Could not read config file.".paint(Color::Red)); - std::process::exit(1); - } - } -} \ No newline at end of file diff --git a/src/print.rs b/src/print.rs index 24cf4e1..139c5ce 100644 --- a/src/print.rs +++ b/src/print.rs @@ -145,7 +145,7 @@ pub fn print_config(conf: &InstallConfig) { } if let Some(models) = &ai_conf.models { - ai_info.add_str(format!("⬇️ Pull Models: {}", models.join(", "))); + ai_info.add_str(format!("⬇️ Pull Models: {}", models.join(", "))); } root_info.add_tree("🦙 Ollama", ai_info);