wip
This commit is contained in:
parent
8c7ca74363
commit
7582f98e46
|
@ -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"
|
||||
|
|
|
@ -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"}
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue