From 6b3314d0326b19ded558e46a16ca711a960f32e9 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Sun, 29 Dec 2024 11:43:52 +0100 Subject: [PATCH] add installer kb options --- .woodpecker/build.yml | 1 + src/args.rs | 4 +++- src/create_iso.rs | 24 +++++++++++++++++++++--- src/install/mod.rs | 3 +++ src/main.rs | 10 +++++++++- 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/.woodpecker/build.yml b/.woodpecker/build.yml index f75bea0..c74ba93 100644 --- a/.woodpecker/build.yml +++ b/.woodpecker/build.yml @@ -12,3 +12,4 @@ steps: from_secret: pacco_token KEY: from_secret: navos_key + diff --git a/src/args.rs b/src/args.rs index d61d4c2..52e8c8d 100644 --- a/src/args.rs +++ b/src/args.rs @@ -6,7 +6,9 @@ pub fn get_args() -> clap::ArgMatches { .subcommand( command!("create-iso") .about("Create a new installation medium ISO") - .arg(arg!(--without_gui "Create ISO with just terminal")), + .arg(arg!(--without_gui "Create ISO with just terminal")) + .arg(arg!(--kb_layout "Create ISO with this keyboard layout")) + .arg(arg!(--kb_variant "Create ISO with this keyboard layout variant")), ) .subcommand( command!() diff --git a/src/create_iso.rs b/src/create_iso.rs index 360e239..23f6596 100644 --- a/src/create_iso.rs +++ b/src/create_iso.rs @@ -1,9 +1,19 @@ use crate::{ install::{str_vec, uncomment_tag}, - is_root, run_command, + is_root, print_status, run_command, }; -pub fn create_iso(without_gui: bool) { +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); @@ -17,10 +27,18 @@ pub fn create_iso(without_gui: bool) { if without_gui { std::fs::remove_file("./iso/airootfs/etc/systemd/system/display-manager.service").unwrap(); } else { - println!("Adding GUI packages"); + print_status("Adding GUI packages"); uncomment_tag("#gui: ", "./iso/packages.x86_64"); } + print_status("Setting keyboard layout"); + std::fs::create_dir("./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![ diff --git a/src/install/mod.rs b/src/install/mod.rs index 0ef3436..36af1e5 100644 --- a/src/install/mod.rs +++ b/src/install/mod.rs @@ -101,6 +101,9 @@ pub fn install(conf: InstallConfig) { setup_navos(); install_pkgs(&pkg::DESKTOP_PKG); print_status("Enable SDDM"); + + // TODO : Setup KDE Keyboard Layout + std::os::unix::fs::symlink( "/usr/lib/systemd/system/sddm.service", "/mnt/etc/systemd/system/display-manager.service", diff --git a/src/main.rs b/src/main.rs index 3979ec9..e3e229c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -82,7 +82,10 @@ fn main() { match args.subcommand() { Some(("create-iso", iso_args)) => { let without_gui = iso_args.get_flag("without_gui"); - create_iso(without_gui); + let kb_layout_default = "en".to_string(); + let kb_layout: &String = iso_args.get_one("LAYOUT").unwrap_or(&kb_layout_default); + let kb_variant: Option<&str> = iso_args.get_one("LAYOUT").map(|x: &String| x.as_str()); + create_iso(without_gui, &kb_layout, kb_variant); std::process::exit(0); } Some(("create-tar", _)) => { @@ -115,6 +118,11 @@ fn main() { unimplemented!() } Some(("install", install_args)) => { + if !is_root() { + eprintln!("Error: You need root to install"); + std::process::exit(1); + } + let config_file: &String = install_args.get_one("config").unwrap(); let config_content = std::fs::read_to_string(config_file);