From c47f47789c2db03ad1ada45c0f5b2aafe304381b Mon Sep 17 00:00:00 2001 From: axtlos Date: Sun, 8 May 2022 11:47:22 +0200 Subject: [PATCH] start working on unakite --- Cargo.lock | 60 ++++++++-------- src/args.rs | 4 ++ src/functions/base.rs | 5 +- src/functions/mod.rs | 1 + src/functions/partition.rs | 6 +- src/functions/unakite.rs | 142 +++++++++++++++++++++++++++++++++++++ src/internal/config.rs | 2 +- src/main.rs | 3 + 8 files changed, 187 insertions(+), 36 deletions(-) create mode 100644 src/functions/unakite.rs diff --git a/Cargo.lock b/Cargo.lock index c3343d9..cee9649 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -87,9 +87,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "3.1.10" +version = "3.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3124f3f75ce09e22d1410043e1e24f2ecc44fad3afe4f08408f1f7663d68da2b" +checksum = "47582c09be7c8b32c0ab3a6181825ababb713fde6fff20fc573a3870dd45c6a0" dependencies = [ "atty", "bitflags", @@ -117,9 +117,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" dependencies = [ "os_str_bytes", ] @@ -237,24 +237,24 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.124" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" +checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" [[package]] name = "log" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "miniz_oxide" @@ -267,9 +267,9 @@ dependencies = [ [[package]] name = "num_threads" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ "libc", ] @@ -324,18 +324,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "9027b48e9d4c9175fa2218adf3557f91c1137021739951d4932f5f8268ac48aa" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] @@ -377,18 +377,18 @@ checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" [[package]] name = "serde" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ "proc-macro2", "quote", @@ -397,9 +397,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.78" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ "itoa", "ryu", @@ -414,9 +414,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" dependencies = [ "proc-macro2", "quote", @@ -440,18 +440,18 @@ checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", @@ -487,9 +487,9 @@ dependencies = [ [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "uuid" diff --git a/src/args.rs b/src/args.rs index 9575d5b..2bced1f 100644 --- a/src/args.rs +++ b/src/args.rs @@ -60,6 +60,10 @@ pub enum Command { #[clap(name = "flatpak")] Flatpak, + /// Setup unakite + #[clap(name = "unakite")] + Unakite, + /// Read jade installation config #[clap(name = "config")] Config { diff --git a/src/functions/base.rs b/src/functions/base.rs index f46edd8..04990c6 100755 --- a/src/functions/base.rs +++ b/src/functions/base.rs @@ -39,7 +39,7 @@ pub fn genfstab() { } pub fn install_bootloader_efi(efidir: PathBuf) { - install::install(vec!["grub", "efibootmgr", "grub-btrfs", "crystal-grub-theme"]); + install::install(vec!["grub", "efibootmgr", "grub-btrfs", "crystal-grub-theme", "os-prober"]); let efidir = std::path::Path::new("/mnt").join(efidir); let efi_str = efidir.to_str().unwrap(); if !std::path::Path::new(&format!("/mnt{efi_str}")).exists() { @@ -82,7 +82,7 @@ pub fn install_bootloader_efi(efidir: PathBuf) { } pub fn install_bootloader_legacy(device: PathBuf) { - install::install(vec!["grub", "grub-btrfs", "crystal-grub-theme"]); + install::install(vec!["grub", "grub-btrfs", "crystal-grub-theme", "os-prober"]); if !device.exists() { crash(format!("The device {device:?} does not exist"), 1); } @@ -123,5 +123,6 @@ pub fn install_flatpak() { install(vec!["flatpak"]); exec_eval( exec_chroot("flatpak", vec![String::from("remote-add"), String::from("--if-not-exists"), String::from("flathub"), String::from("https://flathub.org/repo/flathub.flatpakrepo")]), + "add flathub remote", ) } diff --git a/src/functions/mod.rs b/src/functions/mod.rs index a15e19f..178cb10 100755 --- a/src/functions/mod.rs +++ b/src/functions/mod.rs @@ -4,3 +4,4 @@ pub mod locale; pub mod network; pub mod partition; pub mod users; +pub mod unakite; \ No newline at end of file diff --git a/src/functions/partition.rs b/src/functions/partition.rs index f657aa4..361bd11 100755 --- a/src/functions/partition.rs +++ b/src/functions/partition.rs @@ -7,8 +7,8 @@ use std::path::{Path, PathBuf}; /*mkfs.bfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat */ -pub fn fmt_mount(mountpoint: &String, filesystem: &String, blockdevice: &String) { - match filesystem.as_str() { +pub fn fmt_mount(mountpoint: &str, filesystem: &str, blockdevice: &str) { + match filesystem { "vfat" => { exec_eval( exec( @@ -155,7 +155,7 @@ pub fn fmt_mount(mountpoint: &String, filesystem: &String, blockdevice: &String) ), format!("Creating mountpoint {mountpoint} for {blockdevice}").as_str(), ); - mount(&blockdevice, &mountpoint, ""); + mount(blockdevice, mountpoint, ""); } pub fn partition(device: PathBuf, mode: PartitionMode, efi: bool, partitions: &mut Vec) { diff --git a/src/functions/unakite.rs b/src/functions/unakite.rs new file mode 100644 index 0000000..893cd9d --- /dev/null +++ b/src/functions/unakite.rs @@ -0,0 +1,142 @@ +use crate::internal::exec::*; +use crate::internal::*; + +pub fn install_bootloader_efi(efidir: PathBuf) { + install::install(vec!["grub", "efibootmgr", "grub-btrfs", "crystal-grub-theme"]); + let efidir = std::path::Path::new("/mnt").join(efidir); + let efi_str = efidir.to_str().unwrap(); + if !std::path::Path::new(&format!("/mnt{efi_str}")).exists() { + crash(format!("The efidir {efidir:?} doesn't exist"), 1); + } + exec_eval( + exec_chroot( + "grub-install", + vec![ + String::from("--target=x86_64-efi"), + format!("--efi-directory={}" , efi_str), + String::from("--bootloader-id=unakite"), + String::from("--removable"), + ], + ), + "install unakite grub as efi with --removable", + ); + exec_eval( + exec_chroot( + "grub-install", + vec![ + String::from("--target=x86_64-efi"), + format!("--efi-directory={}", efi_str), + String::from("--bootloader-id=unakite"), + ], + ), + "install unakite grub as efi without --removable", + ); + files_eval( + append_file("/mnt/etc/default/grub", "GRUB_THEME=\"/usr/share/grub/themes/crystal/theme.txt\""), + "enable crystal grub theme" + ); + exec_eval( + exec_chroot( + "grub-mkconfig", + vec![String::from("-o"), String::from("/boot/grub/grub.cfg")], + ), + "create grub.cfg", + ); +} + +pub fn remount(root: &str, oldroot: &stre, efi: bool, efidir: &str, bootdev: &str, firstrun: bool) { + if efi && firstrun { + exec_eval( + exec( + "umount", + vec![String::from(bootdev)], + ), + format!("Unmount {}", bootdev), + ) + exec_eval( + exec( + "umount", + vec![String::from("/")], + ), + format!("Unmount old root"), + ); + mount(root, "/"); + mount(bootdev, efidir); + } else if efi && !firstrun { + exec_eval( + exec( + "umount", + vec![String::from(bootdev)], + ), + format!("Unmount {}", bootdev), + ) + exec_eval( + exec( + "umount", + vec![String::from("/")], + ), + format!("Unmount unakite root"), + ); + mount(root, "/"); + mount(bootdev, efidir); + } else if !efi && firstrun { + exec_eval( + exec( + "umount", + vec![String::from(bootdev)], + ), + format!("Unmount {}", bootdev), + ) + exec_eval( + exec( + "umount", + vec![String::from("/")], + ), + format!("Unmount old root"), + ); + mount(root, "/"); + mount(bootdev, "/boot"); + } else if !efi && !firstrun { + exec_eval( + exec( + "umount", + vec![String::from(bootdev)], + ), + format!("Unmount {}", bootdev), + ); + exec_eval( + exec( + "umount", + vec![String::from("/")], + ), + format!("Unmount unakite root"), + ); + mount(oldroot, "/"); + mount(bootdev, "/boot"); + } else { + panic!("Unknown state"); + } +} + +pub fn setup_unakite(root: &str, oldroot: &stre, efi: bool, efidir: &str, bootdev: &str) { + log::debug!("Setting up Unakite"); + remount_efi(root, oldroot, efi, efidir, bootdev, true); + base::install_base_packages(); + base::genfstab(); + if efi { + install_bootloader_efi(PathBuf::from(efidir)); + } + locale::set_locale(""); + locale::set_timezone("Europe/Berlin"); // TODO: get the proper timezone + network::set_hostname("unakite"); + network::create_hosts(""); + users::new_user( + "unakite", + true, + "Cp7oN04ZY0PsA", // unakite + ) + users::root_pass("Cp7oN04ZY0PsA"); // unakite + desktops::install_desktop_desktup_setup(DesktopSetup::Xfce); + install(vec!["gparted", "firefox"]); + remount(root, oldroot, efi, efidir, bootdev, false); +} \ No newline at end of file diff --git a/src/internal/config.rs b/src/internal/config.rs index 611aa91..a0f1256 100755 --- a/src/internal/config.rs +++ b/src/internal/config.rs @@ -148,7 +148,7 @@ pub fn read_config(configpath: PathBuf) { println!(); log::info!("Enabling flatpak : {}", config.flatpak); if config.flatpak { - base::setup_flatpak(); + base::install_flatpak(); } log::info!("Extra packages : {:?}", config.extra_packages); let mut extra_packages: Vec<&str> = Vec::new(); diff --git a/src/main.rs b/src/main.rs index 31afe01..13d9952 100755 --- a/src/main.rs +++ b/src/main.rs @@ -59,6 +59,9 @@ fn main() { Command::Flatpak => { base::install_flatpak(); } + Command::Unakite => { + unakite::setup_unakite(); + }, Command::Config { config } => { crate::internal::config::read_config(config); }