From 26cd7c264cb0ba769fc61be540eb0fc6d5b9f6e8 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Wed, 8 Jan 2025 09:02:04 +0100 Subject: [PATCH 1/3] added new user options --- installs/full.toml | 11 +++++++++++ src/config.rs | 3 +++ src/install/user.rs | 30 +++++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/installs/full.toml b/installs/full.toml index c138139..02e9c43 100644 --- a/installs/full.toml +++ b/installs/full.toml @@ -55,6 +55,17 @@ 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 59531eb..4330d54 100644 --- a/src/config.rs +++ b/src/config.rs @@ -41,6 +41,9 @@ 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/user.rs b/src/install/user.rs index ad0ca32..25ed68f 100644 --- a/src/install/user.rs +++ b/src/install/user.rs @@ -13,7 +13,35 @@ pub fn setup_users(conf: &[UserConfig]) { let mut doas_conf = String::new(); for user in conf { - arch_chroot(&["useradd", "-m", &user.name], None, false); + 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); change_passwd(&user.name, &user.password); From 59203d90855bc61ecf11f594cdbd8198e3bf1ab2 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Wed, 8 Jan 2025 21:07:07 +0100 Subject: [PATCH 2/3] update readme --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d30a11c..fa32b70 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,10 @@ navOS Installer ## Create install medium -You can create a bootable install medium either with or without GUI: +You can create a bootable install medium with various predefined options: + ```sh -navinstall create-iso [--without_gui] +navinstall create-iso [--without_gui] [--kb_layout ] [--kb_variant ] ``` ## Install a system @@ -15,3 +16,12 @@ 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. From 753f53d4daf745cfcab252facbaf339b613d02f3 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Thu, 9 Jan 2025 18:17:55 +0100 Subject: [PATCH 3/3] refactor --- src/install/first_boot.rs | 3 +- src/install/kernel.rs | 1 - src/install/mod.rs | 1 + src/main.rs | 62 +++++++++++++++------------------------ src/print.rs | 2 +- 5 files changed, 27 insertions(+), 42 deletions(-) diff --git a/src/install/first_boot.rs b/src/install/first_boot.rs index 93dcf4f..6085b23 100644 --- a/src/install/first_boot.rs +++ b/src/install/first_boot.rs @@ -35,6 +35,7 @@ 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"); @@ -49,8 +50,6 @@ 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 5e27c7e..c71c69b 100644 --- a/src/install/kernel.rs +++ b/src/install/kernel.rs @@ -26,7 +26,6 @@ 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 1cc1ed5..228483e 100644 --- a/src/install/mod.rs +++ b/src/install/mod.rs @@ -76,6 +76,7 @@ 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/main.rs b/src/main.rs index fae07a6..bdf8902 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,25 +50,7 @@ fn main() { } Some(("create-img", install_args)) => { let config_file: &String = install_args.get_one("config").unwrap(); - 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); - } - }; + let conf = read_conf(config_file); println!("Installing to a disk image is not yet supported"); unimplemented!() @@ -81,25 +63,7 @@ fn main() { let config_file: &String = install_args.get_one("config").unwrap(); let force = install_args.get_flag("force"); - 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); - } - }; + let conf = read_conf(config_file); if !force { print_config(&conf); @@ -128,3 +92,25 @@ 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 139c5ce..24cf4e1 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);