diff --git a/README.md b/README.md index 72ddd7f..c2a1eff 100755 --- a/README.md +++ b/README.md @@ -67,17 +67,17 @@ jade networking getcryst.al --ipv6 ### configure users ```sh -# make a new user called nonRootHaver, without sudo and easytohack as the password -jade users newUser nonRootHaver easytohack +# make a new user called nonRootHaver, without sudo, easytohack as the password and bash as the default shell +jade users new-user nonRootHaver easytohack bash -# make a user called rootHaver, with sudo and omgsosuperhardtohack as the password -jade users newUser rootHaver omgsuperhardtohack --sudoer +# make a user called rootHaver, with sudo, omgsosuperhardtohack as the password and fish as the default shell +jade users new-user rootHaver omgsuperhardtohack fish --hasroot ``` ### set root password ```sh # set the root password to 'muchSecurity,veryHardToHack' -jade users rootPass muchSecurity,veryHardToHack +jade users root-password muchSecurity,veryHardToHack ``` ### install a desktop environment diff --git a/src/args.rs b/src/args.rs index 7e6d01c..0f42b06 100644 --- a/src/args.rs +++ b/src/args.rs @@ -228,13 +228,16 @@ pub struct NewUserArgs { /// When not providing a password openssl jumps into an interactive masked input mode allowing you to hide your password /// from the terminal history. pub password: String, + + /// The shell to use for the user. The current options are bash, csh, fish, tcsh, and zsh. + /// If a shell is not specified or unknown, it defaults to fish. + pub shell: String, } #[derive(Debug, ArgEnum, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Serialize, Deserialize)] pub enum DesktopSetup { - #[clap(name = "onyx")] - Onyx, - + //#[clap(name = "onyx")] + //Onyx, #[clap(name = "gnome")] Gnome, @@ -256,6 +259,24 @@ pub enum DesktopSetup { #[clap(name = "enlightenment")] Enlightenment, + #[clap(name = "lxqt")] + Lxqt, + + #[clap(name = "sway")] + Sway, + + #[clap(name = "i3gaps")] + I3gaps, + + #[clap(name = "herbstluftwm")] + Herbstluftwm, + + #[clap(name = "awesome")] + Awesome, + + #[clap(name = "bspwm")] + Bspwm, + #[clap(name = "None/DIY")] None, } diff --git a/src/functions/desktops.rs b/src/functions/desktops.rs index 3039da8..cdeb4ed 100755 --- a/src/functions/desktops.rs +++ b/src/functions/desktops.rs @@ -5,7 +5,7 @@ use crate::internal::*; pub fn install_desktop_setup(desktop_setup: DesktopSetup) { log::debug!("Installing {:?}", desktop_setup); match desktop_setup { - DesktopSetup::Onyx => install_onyx(), + // DesktopSetup::Onyx => install_onyx(), DesktopSetup::Gnome => install_gnome(), DesktopSetup::Kde => install_kde(), DesktopSetup::Budgie => install_budgie(), @@ -13,6 +13,12 @@ pub fn install_desktop_setup(desktop_setup: DesktopSetup) { DesktopSetup::Mate => install_mate(), DesktopSetup::Xfce => install_xfce(), DesktopSetup::Enlightenment => install_enlightenment(), + DesktopSetup::Lxqt => install_lxqt(), + DesktopSetup::Sway => install_sway(), + DesktopSetup::I3gaps => install_i3gaps(), + DesktopSetup::Herbstluftwm => install_herbstluftwm(), + DesktopSetup::Awesome => install_awesome(), + DesktopSetup::Bspwm => install_bspwm(), DesktopSetup::None => log::debug!("No desktop setup selected"), } install_networkmanager(); @@ -29,6 +35,126 @@ fn install_networkmanager() { ); } +fn install_bspwm() { + install(vec![ + "xorg", + "bspwm", + "sxhkd", + "xdo", + "lightdm", + "lightdm-gtk-greeter", + "lightdm-gtk-greeter-settings", + ]); + files_eval( + files::append_file( + "/mnt/etc/lightdm/lightdm.conf", + "[SeatDefaults]\ngreeter-session=lightdm-gtk-greeter\n", + ), + "Add lightdm greeter", + ); + enable_dm("lightdm"); +} + +fn install_awesome() { + install(vec![ + "xorg", + "awesome", + "dex", + "rlwrap", + "vicious", + "lightdm", + "lightdm-gtk-greeter", + "lightdm-gtk-greeter-settings", + ]); + files_eval( + files::append_file( + "/mnt/etc/lightdm/lightdm.conf", + "[SeatDefaults]\ngreeter-session=lightdm-gtk-greeter\n", + ), + "Add lightdm greeter", + ); + enable_dm("lightdm"); +} + +fn install_herbstluftwm() { + install(vec![ + "xorg", + "herbstluftwm", + "dmenu", + "dzen2", + "xorg-xsetroot", + "xterm", + "lightdm", + "lightdm-gtk-greeter", + "lightdm-gtk-greeter-settings", + ]); + files_eval( + files::append_file( + "/mnt/etc/lightdm/lightdm.conf", + "[SeatDefaults]\ngreeter-session=lightdm-gtk-greeter\n", + ), + "Add lightdm greeter", + ); + enable_dm("lightdm"); +} + +fn install_i3gaps() { + install(vec![ + "xorg", + "i3-gaps", + "dmenu", + "i3lock", + "i3status", + "rxvt-unicode", + "lightdm", + "lightdm-gtk-greeter", + "lightdm-gtk-greeter-settings", + ]); + files_eval( + files::append_file( + "/mnt/etc/lightdm/lightdm.conf", + "[SeatDefaults]\ngreeter-session=lightdm-gtk-greeter\n", + ), + "Add lightdm greeter", + ); + enable_dm("lightdm"); +} + +fn install_sway() { + install(vec![ + "xorg-xwayland", + "sway", + "bemenu", + "foot", + "mako", + "polkit", + "swaybg", + "lightdm", + "lightdm-gtk-greeter", + "lightdm-gtk-greeter-settings", + ]); + files_eval( + files::append_file( + "/mnt/etc/lightdm/lightdm.conf", + "[SeatDefaults]\ngreeter-session=lightdm-gtk-greeter\n", + ), + "Add lightdm greeter", + ); + enable_dm("lightdm"); +} + +fn install_lxqt() { + install(vec![ + "xorg", + "lxqt", + "breeze-icons", + "nm-tray", + "xscreensaver", + "sddm", + ]); + enable_dm("sddm"); +} + fn install_enlightenment() { install(vec![ "xorg", @@ -155,6 +281,8 @@ fn install_gnome() { "gdm", "xorg", "gnome-tweaks", + "gnome-backgrounds", + "sushi", ]); enable_dm("gdm"); } @@ -166,6 +294,7 @@ fn install_onyx() { "lightdm", "lightdm-gtk-greeter", "lightdm-gtk-greeter-settings", + "sushi", ]); files_eval( files::append_file( diff --git a/src/functions/unakite.rs b/src/functions/unakite.rs index c4028f4..06e1a6d 100644 --- a/src/functions/unakite.rs +++ b/src/functions/unakite.rs @@ -127,6 +127,7 @@ pub fn setup_unakite(root: &str, oldroot: &str, efi: bool, efidir: &str, bootdev true, "Cp7oN04ZY0PsA", // unakite false, + "/bin/bash", ); exec_eval( exec( diff --git a/src/functions/users.rs b/src/functions/users.rs index d63d445..81502df 100755 --- a/src/functions/users.rs +++ b/src/functions/users.rs @@ -2,7 +2,8 @@ use crate::internal::exec::*; use crate::internal::*; use std::process::Command; -pub fn new_user(username: &str, hasroot: bool, password: &str, do_hash_pass: bool) { +pub fn new_user(username: &str, hasroot: bool, password: &str, do_hash_pass: bool, shell: &str) { + let shell: &str = shell; if do_hash_pass { let hashed_pass = &*hash_pass(password).stdout; let _password = match std::str::from_utf8(hashed_pass) { @@ -10,13 +11,40 @@ pub fn new_user(username: &str, hasroot: bool, password: &str, do_hash_pass: boo Err(e) => panic!("Failed to hash password, invalid UTF-8 sequence {}", e), }; } + let shell_to_install = match shell { + "bash" => "bash", + "csh" => "tcsh", + "fish" => "fish", + "tcsh" => "tcsh", + "zsh" => "zsh", + &_ => "bash", + }; + exec_eval( + exec_chroot( + "bash", + vec![ + String::from("pacman -S "), + String::from(shell_to_install), + String::from("--noconfirm"), + ], + ), + format!("installed {shell:?}").as_str(), + ); + let shell_path = match shell { + "bash" => "/bin/bash", + "csh" => "/usr/bin/csh", + "fish" => "/usr/bin/fish", + "tcsh" => "/usr/bin/tcsh", + "zsh" => "/usr/bin/zsh", + &_ => "/usr/bin/fish", + }; exec_eval( exec_chroot( "useradd", vec![ String::from("-m"), String::from("-s"), - String::from("/bin/bash"), + String::from(shell_path), String::from("-p"), String::from(password).replace('\n', ""), String::from(username), diff --git a/src/internal/config.rs b/src/internal/config.rs index 928014f..e413133 100755 --- a/src/internal/config.rs +++ b/src/internal/config.rs @@ -53,6 +53,7 @@ struct Users { name: String, password: String, hasroot: bool, + shell: String, } #[derive(Serialize, Deserialize)] @@ -138,11 +139,13 @@ pub fn read_config(configpath: PathBuf) { log::info!("Creating user : {}", config.users[i].name); log::info!("Setting use password : {}", config.users[i].password); log::info!("Enabling root for user : {}", config.users[i].hasroot); + log::info!("Setting user shell : {}", config.users[i].shell); users::new_user( config.users[i].name.as_str(), config.users[i].hasroot, config.users[i].password.as_str(), false, + config.users[i].shell.as_str(), ); println!("---------"); } @@ -155,7 +158,7 @@ pub fn read_config(configpath: PathBuf) { desktops::install_desktop_setup(*desktop); }*/ match config.desktop.as_str() { - "onyx" => desktops::install_desktop_setup(DesktopSetup::Onyx), + // "onyx" => desktops::install_desktop_setup(DesktopSetup::Onyx), "plasma" => desktops::install_desktop_setup(DesktopSetup::Kde), "mate" => desktops::install_desktop_setup(DesktopSetup::Mate), "gnome" => desktops::install_desktop_setup(DesktopSetup::Gnome), @@ -163,6 +166,12 @@ pub fn read_config(configpath: PathBuf) { "xfce" => desktops::install_desktop_setup(DesktopSetup::Xfce), "budgie" => desktops::install_desktop_setup(DesktopSetup::Budgie), "enlightenment" => desktops::install_desktop_setup(DesktopSetup::Enlightenment), + "lxqt" => desktops::install_desktop_setup(DesktopSetup::Lxqt), + "sway" => desktops::install_desktop_setup(DesktopSetup::Sway), + "i3-gaps" => desktops::install_desktop_setup(DesktopSetup::I3gaps), + "herbstluftwm" => desktops::install_desktop_setup(DesktopSetup::Herbstluftwm), + "awesome" => desktops::install_desktop_setup(DesktopSetup::Awesome), + "bspwm" => desktops::install_desktop_setup(DesktopSetup::Bspwm), "None/DIY" => desktops::install_desktop_setup(DesktopSetup::None), _ => log::info!("No desktop setup selected!"), } diff --git a/src/internal/install.rs b/src/internal/install.rs index 7d94d43..a136fac 100755 --- a/src/internal/install.rs +++ b/src/internal/install.rs @@ -1,6 +1,5 @@ -use crate::internal::*; -use crate::functions::partition::mount; use crate::functions::partition::umount; +use crate::internal::*; use std::process::Command; pub fn install(pkgs: Vec<&str>) { diff --git a/src/main.rs b/src/main.rs index 95c13fe..3925e73 100755 --- a/src/main.rs +++ b/src/main.rs @@ -53,7 +53,13 @@ fn main() { } Command::Users { subcommand } => match subcommand { UsersSubcommand::NewUser(args) => { - users::new_user(&args.username, args.hasroot, &args.password, true); + users::new_user( + &args.username, + args.hasroot, + &args.password, + true, + &args.shell, + ); } UsersSubcommand::RootPass { password } => { users::root_pass(&password);