diff --git a/.gitignore b/.gitignore index ea8c4bf..69dd811 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ /target +flake.nix +configuration.nix +home.nix +garrus.nix diff --git a/Cargo.toml b/Cargo.toml index 05bc2ba..69aee11 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,6 @@ edition = "2021" [dependencies] curl = "0.4.47" -nix = "0.29.0" +nix = { version = "0.29.0", features = ["mount"] } rsfdisk = "0.1.0" sys_metrics = "0.2.7" diff --git a/src/main.rs b/src/main.rs index ae63a5b..fe3ba6f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,16 @@ use std::io; use std::io::Write; +use std::fs; use std::fs::File; use std::process::Command; +use std::path::Path; use sys_metrics::disks; use rsfdisk::fdisk::Fdisk; use rsfdisk::core::partition_table::PartitionTableKind; use rsfdisk::core::partition::{Guid, Partition, PartitionKind}; +use nix::mount::{mount, MsFlags}; +use std::os::unix::ffi::OsStrExt; use curl::easy::Easy; fn format_drive(drive_name: &str) -> rsfdisk::Result<()> { @@ -34,9 +38,11 @@ fn format_drive(drive_name: &str) -> rsfdisk::Result<()> { let root = Partition::builder() .partition_type(partition_type) .name("Root") - .size_in_sectors(121_634_816) - // 500GB - //.size_in_sectors(499_033_071_61) + // Flash drive testing + // .size_in_sectors(121_634_816) + // Internal drive testing + .size_in_sectors(499_033_071_61) + // replace static int with a variable .build()?; let _ = disk.partition_add(root)?; @@ -46,11 +52,80 @@ fn format_drive(drive_name: &str) -> rsfdisk::Result<()> { Ok(()) } -// fn mount_parts() {} +fn format_partitions() { + let _efi_partition = Command::new("mkfs.fat") + .arg("-F32") + .arg("-n") + .arg("EFI") + // replace static path with a variable + .arg("/dev/nvme1n1p1") + .output() + .expect("Failed to partition boot partition as FAT32"); + + let _root_partition = Command::new("mkfs.ext4") + // replace static path with a variable + .arg("/dev/nvme1n1p2") + .output() + .expect("Failed to partition root partition as ext4"); +} + +fn mount_root() { + // replace static path with a variable + let root_source = Some(Path::new("/dev/nvme1n1p2")); + let root_target = Path::new("/mnt"); + + // unmounts root before hand to fix bugs + let _umount_root = Command::new("umount") + // replace static path with a variable + .arg("/dev/nvme1n1p2") + .output() + .expect("Failed to unmount root"); + + mount( + root_source, + root_target, + Some("ext4"), + MsFlags::empty(), + None::<&[u8]>, + ) + .expect("Failed to mount root partition"); + + // Deletes the boot directory + // Shouldn't be needed with a blank drive + // So just for testing + let _delete_boot_directory = Command::new("rm") + .arg("-r") + .arg("/mnt/boot") + .output() + .expect("Failed to delete boot directory"); + + // Creates the boot directory in /mnt/boot + let _create_boot_directory = Command::new("mkdir") + .arg("/mnt/boot") + .output() + .expect("Failed to create boot directory"); +} + +fn mount_boot() { + // replace static path with a variable + let boot_source = Some(Path::new("/dev/nvme1n1p1")); + let boot_target = Path::new("/mnt/boot"); + + mount( + boot_source, + boot_target, + Some("vfat"), + MsFlags::empty(), + None::<&[u8]>, + ) + .expect("Failed to mount boot partition"); + + println!(""); +} fn grab_flake() { let mut easy = Easy::new(); - easy.url("https://gitlab.com/ahoneybun/nix-configs/-/raw/main/flake.nix").unwrap(); + easy.url("https://gitlab.com/ahoneybun/nix-configs/-/raw/rust-rewrite/flake.nix").unwrap(); let mut file = File::create("flake.nix").unwrap(); @@ -66,7 +141,7 @@ fn grab_flake() { fn grab_config() { let mut easy = Easy::new(); - easy.url("https://gitlab.com/ahoneybun/nix-configs/-/raw/main/configuration.nix").unwrap(); + easy.url("https://gitlab.com/ahoneybun/nix-configs/-/raw/rust-rewrite/configuration.nix").unwrap(); let mut file = File::create("configuration.nix").unwrap(); @@ -82,7 +157,7 @@ fn grab_config() { fn grab_home() { let mut easy = Easy::new(); - easy.url("https://gitlab.com/ahoneybun/nix-configs/-/raw/main/home.nix").unwrap(); + easy.url("https://gitlab.com/ahoneybun/nix-configs/-/raw/rust-rewrite/home.nix").unwrap(); let mut file = File::create("home.nix").unwrap(); @@ -119,6 +194,8 @@ fn main() { println!(""); println!("Use the full drive path such as /dev/nvme0n1 or /dev/sda"); + println!("If you're on the Lemur nvme1n1 is the test drive"); + println!(""); println!("Which drive do we want to use for this installation?: {}", drive_name); io::stdin() @@ -131,18 +208,12 @@ fn main() { let _ = format_drive(drive_name); // Formatting the partitions - let _efi_partition = Command::new("mkfs.fat") - .arg("-F32") - .arg("-n") - .arg("EFI") - .arg("/dev/sda1") - .output() - .expect("Failed to partition boot partition as FAT32"); + format_partitions(); - let _root_partition = Command::new("mkfs.ext4") - .arg("/dev/sda2") - .output() - .expect("Failed to partition root partition as ext4"); + // Mounting the partitions + mount_root(); + + // mount_boot(); // Download nix files grab_flake(); @@ -156,10 +227,19 @@ fn main() { .output() .expect("Failed to execute command"); + println!(""); + println!("-------------------------"); + println!("Water packed!"); + println!("Treats packed!"); + println!("We're ready for our walk!"); + println!("-------------------------"); + // Host selection loop { println!(""); - println!("Host selection"); + println!("Host selection:"); + println!("---------------"); + println!(""); println!("1. Lemur Pro 13 (Garrus)"); println!("2. Device 2"); println!("3. Quit"); @@ -175,7 +255,7 @@ fn main() { let mut garrus_config = Easy::new(); garrus_config.url("https://gitlab.com/ahoneybun/nix-configs/-/raw/main/hosts/x86_64/garrus/configuration.nix").unwrap(); - let mut config_file = File::create("configuration.nix").unwrap(); + let mut config_file = File::create("garrus.nix").unwrap(); { let mut transfer = garrus_config.transfer(); @@ -185,14 +265,17 @@ fn main() { }).unwrap(); transfer.perform().unwrap(); } - break - } - "2" => { + let _nixos_install = Command::new("nixos-install") .arg("--flake") .arg("/mnt/etc/nixos#garrus") .output() - .expect("Fiale to execute command"); + .expect("Failed to execute command"); + + break + } + "2" => { + println!("Nix the world!"); }, "3" => { println!("Goodbye!"); @@ -201,4 +284,4 @@ fn main() { _ => println!("Invalid choice, try again."), } } -} \ No newline at end of file +}