This commit is contained in:
everyone 2023-11-11 13:37:47 -08:00
parent 8c7ca74363
commit 7582f98e46
Signed by: everyone
SSH Key Fingerprint: SHA256:FKcGHdUnp2OocVUUAEJV25QetYQXwbmKPSsblofJOrM
3 changed files with 122 additions and 132 deletions

View File

@ -2,10 +2,23 @@
# It is not intended for manual editing.
version = 3
[[package]]
name = "bitflags"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cli"
version = "0.1.0"
dependencies = [
"nix",
"quote",
"strum",
]
@ -16,6 +29,23 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "libc"
version = "0.2.150"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
[[package]]
name = "nix"
version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
dependencies = [
"bitflags",
"cfg-if",
"libc",
]
[[package]]
name = "proc-macro2"
version = "1.0.69"

View File

@ -8,4 +8,5 @@ edition = "2021"
[dependencies]
strum = { version = "0.25.0", features = ["derive"] }
quote = "*"
nix = { version = "0.27.1", features = ["user"] }
# cmd = {path = "../cmd"}

View File

@ -46,18 +46,11 @@ macro_rules! cmd {
stringify!($token).replace(" - ", "-")
};
(@args $($token:tt)+) => {{
// dbg!([$(stringify!($token)),+]);
let tokens = [$(stringify!($token)),+];
let args_replacement_split_idx = tokens.partition_point(|i| *i == ",");
let (args, replace) = tokens.split_at(args_replacement_split_idx - if args_replacement_split_idx == 0 {0}else{1});
let mut replace = Vec::from(replace);
if replace.remove(0) == "," {
cmd!(@replacement args; replace);
}
let args = [$(stringify!($token)),+];
let mut prv_val: &'static str = "";
args.iter()
.map(|token| {
.map(|token| {
let mut results: Option<String> = None;
if (prv_val != "-" || prv_val != "--") && *token != "-" {
results = Some(format!("{}", token.replace('"', "")));
@ -81,66 +74,22 @@ macro_rules! cmd {
.filter(|item| !item.is_empty())
.collect::<Vec<String>>()
}};
// let mut vec = Vec::from();
// let args_replacement_split_idx = vec.partition_point(|i| *i == ",") - 1;
// let (args, replace) = vec.split_at_mut(args_replacement_split_idx);
// let mut replace = Vec::from(replace);
// replace.reverse();
// let args: Vec<_> = args
// .iter()
// .map(|arg| {
// let mut tmp = arg.to_string();
// while tmp.contains("{}") {
// match replace.pop() {
// Some(val) => tmp = tmp.replacen("{}", val, 1),
// None => panic!("Too many positional arguments in string"),
// }
// }
// tmp
// })
// .collect();
(@replacement $args:expr; $replace:ident) => {{
// dbg!($args, $replace);
let replace = $replace;
dbg!(replace);
let _: Vec<_> = $args
.iter()
.map(|arg| {
let mut tmp = arg.to_string();
// while tmp.contains("{}") {
// match replace.pop() {
// Some(val) => tmp = tmp.replacen("{}", val, 1),
// None => panic!("Too many positional arguments in string"),
// }
// }
tmp
})
.collect();
// let mut tmp = Vec::new();
// $($args.iter_mut().for_each(|item| tmp.push(item.replacen("{}", stringify!($token), 1))))*;
// tmp
}};
($command:expr) => {{
let command = cmd!(@command $command);
std::process::Command::new(command)
}};
// (@test , $($tests:tt),+)=>{
// $(dbg!(stringify!($tests)))+;
// };
($command:expr => $($args:tt)+) => {{
let command = cmd!(@command $command);
#[allow(unused_mut,)]
let mut args = cmd!(@args $($args) *);
dbg!(&args);
std::process::Command::new(command).args(args)
}};
}
fn is_online() -> bool {
let ping = TcpStream::connect("95.217.163.246:80");
let archlinux_org = "95.217.163.246:80";
let ping = TcpStream::connect(archlinux_org);
match ping {
Ok(val) => {
let _ = val.shutdown(Shutdown::Both);
@ -220,8 +169,9 @@ fn mkfs_fat(dev: &String, part_num: i32, size: i32, label: &'static str) {
.args(["-F", &size.to_string()])
.arg(format!("{}{}", dev, part_num))
.spawn()
.expect("Command failed to spawn")
.wait();
.unwrap()
.wait()
.expect("Command failed to spawn");
}
fn mkfs_btrfs(dev: &String, part_num: i32, label: &'static str) {
@ -230,8 +180,9 @@ fn mkfs_btrfs(dev: &String, part_num: i32, label: &'static str) {
.arg("-f")
.arg(format!("{}{}", dev, part_num))
.spawn()
.expect("Command failed to spawn")
.wait();
.unwrap()
.wait()
.expect("Command failed to spawn");
}
fn mount(dev: &String, part_num: i32, path: &'static str, options: Option<Vec<&'static str>>) {
@ -244,91 +195,99 @@ fn mount(dev: &String, part_num: i32, path: &'static str, options: Option<Vec<&'
.arg(format!("{dev}{part_num}"))
.arg(path)
.spawn()
.expect("Command failed to spawn")
.wait();
.unwrap()
.wait()
.expect("Command failed to spawn");
}
fn main() {
if !nix::unistd::getuid().is_root() {
panic!("Script must be ran as root")
}
is_online();
let _is_uefi = is_uefi();
let disks = get_disks();
// Get info from user.
print_disks(&disks);
let root = read!(usize, "Which device do you want to be root drive?");
let mut fmt_home = false;
let home = if read!(
bool,
"Do you want to store home on another drive? (true|false)"
) {
let home = read!(usize, "Which device do you want to be home drive");
fmt_home = read!(bool, "Do you want to format home? (true|false)");
home
} else {
root
};
let swap = read!(bool, "Do you want a swap space? (true|false)");
let swap_size = if swap {
read!(
String,
"Swap size. Default is 2g. (accepting k/m/g/e/p suffix)"
)
} else {
String::from("2g")
};
// Act on user info.
// -- format disks and mkfs
{
// if !nix::unistd::getuid().is_root() {
// panic!("Script must be ran as root")
// }
// is_online();
// let _is_uefi = is_uefi();
// let disks = get_disks();
let boot = ",+1G,C12A7328-F81F-11D2-BA4B-00A0C93EC93B";
let part_root = ",";
// // Get info from user.
// print_disks(&disks);
// let root = read!(usize, "Which device do you want to be root drive?");
fdisk(&disks[root][0], DiskLabel::GPT, vec![boot, part_root]);
// let mut fmt_home = false;
// let home = if read!(
// bool,
// "Do you want to store home on another drive? (true|false)"
// ) {
// let home = read!(usize, "Which device do you want to be home drive");
// fmt_home = read!(bool, "Do you want to format home? (true|false)");
// home
// } else {
// root
// };
// let swap = read!(bool, "Do you want a swap space? (true|false)");
// let swap_size = if swap {
// read!(
// String,
// "Swap size. Default is 2g. (accepting k/m/g/e/p suffix)"
// )
// } else {
// String::from("2g")
// };
mkfs_fat(&disks[root][0], 1, 32, "boot");
mkfs_btrfs(&disks[root][0], 2, "root");
};
// // Act on user info.
// //-- format disks and mkfs
// {
// let boot = ",+1G,C12A7328-F81F-11D2-BA4B-00A0C93EC93B";
// let part_root = ",";
if fmt_home {
fdisk(&disks[home][0], DiskLabel::GPT, vec![","]);
// fdisk(&disks[root][0], DiskLabel::GPT, vec![boot, part_root]);
mkfs_btrfs(&disks[home][0], 1, "home");
}
// mkfs_fat(&disks[root][0], 1, 32, "boot");
// mkfs_btrfs(&disks[root][0], 2, "root");
// };
// if fmt_home {
// fdisk(&disks[home][0], DiskLabel::GPT, vec![","]);
// mkfs_btrfs(&disks[home][0], 1, "home");
// }
// //-- mount partitions
// mount(&disks[root][0], 2, "/mnt", None);
// mount(&disks[root][0], 1, "/mnt/boot", None);
// if swap {
// _ = cmd! {btrfs subvolume create "/mnt/swap"};
// _ = cmd! {btrfs filesystem mkswapfile --size {} --uuid clear "/mnt/swap/file", swap_size};
// _ = cmd! {swapon "/mnt/swap/file"};
// }
// -- mount partitions
mount(&disks[root][0], 2, "/mnt", None);
mount(&disks[root][0], 1, "/mnt/boot", None);
if swap {
_ = cmd! {btrfs => subvolume create "/mnt/swap"}
.spawn()
.unwrap()
.wait();
_ = cmd! {btrfs => filesystem mkswapfile --uuid clear "/mnt/swap/file"}
.args(["--size", &swap_size])
.spawn()
.unwrap()
.wait();
_ = cmd! {swapon => "/mnt/swap/file"}.spawn().unwrap().wait();
}
// Installation
//-- Sort mirrors
// _ = cmd! {reflector --save "/etc/pacman.d/mirrorlist" --sort rate --threads 24};
//-- Install essential packages
// _ = cmd! {pacstrap -K "/mnt" base linux-zen linux-firmware micro};
// -- Sort mirrors
_ = cmd! {reflector => --save "/etc/pacman.d/mirrorlist" --sort rate --threads 24}
.spawn()
.unwrap()
.wait();
// -- Install essential packages
_ = cmd! {pacstrap => -K "/mnt" base "linux-zen" "linux-firmware" micro}
.spawn()
.unwrap()
.wait();
// Configure the system
//-- Fstab
// let fstab = cmd! {genfstab -U "/mnt"};
// let _ = std::fs::write("/mnt/etc/fstab", fstab.stdout);
//-- Chroot
let chroot = "#!/bin/env bash\nln -sf /usr/share/zoneinfo/America/Los_Angeles /etc/localtime\n\nhwclock --systohc\n\nsed -i 's/#en_US\\./en_US./' /etc/locale.gen\n\nlocale-gen\n\necho \"LANG=en_US.UTF-8\" >>/etc/locale.conf\n\necho \"zesktop\" >>/etc/hostname\n\nsed -i 's/#COMPRESSION=\"zstd\"/COMPRESSION=\"zstd\"/' /etc/mkinitcpio.conf\n\nprintf \"[Match]\\n\" >>/etc/systemd/network/20-ethernet.network\nprintf \"Name=en*\\n\" >>/etc/systemd/network/20-ethernet.network\nprintf \"Name=eth*\\n\" >>/etc/systemd/network/20-ethernet.network\nprintf \"\\n\" >>/etc/systemd/network/20-ethernet.network\nprintf \"[Network]\\n\" >>/etc/systemd/network/20-ethernet.network\nprintf \"DHCP=yes\\n\" >>/etc/systemd/network/20-ethernet.network\n\necho \"password\" | passwd\n";
// _ = std::fs::write("/mnt/tmp/chroot.bash", chroot);
// let test = cmd! {arch-chroot "/mnt" bash -c "'echo bitch'"}.spawn();
// cmd! {arch-chroot "/mnt" bash -c "echo bitch"};
// dbg!(cmd::cmd! {ch-root -a --b});
// dbg!(cmd::cmd! {"ls" > "-l" "--all"});
// dbg!(cmd::cmd! {"echo" > "quoted string"});
let toml = "Cargo.toml";
let _ = dbg!(cmd! {arch-linux => -h {} --all});
// -- Fstab
let fstab = cmd! {genfstab => -U "/mnt"}.output().unwrap();
let _ = std::fs::write("/mnt/etc/fstab", fstab.stdout);
// -- Chroot
let chroot = "#!/bin/env bash\nln -sf /usr/share/zoneinfo/America/Los_Angeles /etc/localtime\n\nhwclock --systohc\n\nsed -i 's/#en_US\\./en_US./' /etc/locale.gen\n\nlocale-gen\n\necho \"LANG=en_US.UTF-8\" >>/etc/locale.conf\n\necho \"zesktop\" >>/etc/hostname\n\nsed -i 's/#COMPRESSION=\"zstd\"/COMPRESSION=\"zstd\"/' /etc/mkinitcpio.conf\n\nprintf \"[Match]\\n\" >>/etc/systemd/network/20-ethernet.network\nprintf \"Name=en*\\n\" >>/etc/systemd/network/20-ethernet.network\nprintf \"Name=eth*\\n\" >>/etc/systemd/network/20-ethernet.network\nprintf \"\\n\" >>/etc/systemd/network/20-ethernet.network\nprintf \"[Network]\\n\" >>/etc/systemd/network/20-ethernet.network\nprintf \"DHCP=yes\\n\" >>/etc/systemd/network/20-ethernet.network\n\necho \"password\npassword\" | passwd\n";
_ = std::fs::write("/mnt/chroot.bash", chroot);
let _ = cmd! {arch-chroot => "/mnt" bash -c "chmod +x /chroot.bash; /chroot.bash"}
.spawn()
.unwrap()
.wait();
}