From e1a30d944b4442088fdff5377cba27f12fcf9995 Mon Sep 17 00:00:00 2001 From: JEEVITHA KANNAN K S Date: Sat, 17 Aug 2024 15:01:05 +0530 Subject: [PATCH 01/49] Add numlock toggle --- src/commands/utils/numlock.sh | 60 +++++++++++++++++++++++++++++++++++ src/tabs.rs | 6 +++- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100755 src/commands/utils/numlock.sh diff --git a/src/commands/utils/numlock.sh b/src/commands/utils/numlock.sh new file mode 100755 index 00000000..b1ac782a --- /dev/null +++ b/src/commands/utils/numlock.sh @@ -0,0 +1,60 @@ +#!/bin/sh -e + +# setleds can be used in all distros +# This method works by calling a script using systemd service + +# Create a script to toggle numlock +create_file() { + echo "Creating script..." + sudo tee "/usr/local/bin/numlock" >/dev/null <<'EOF' +#!/bin/bash + +for tty in /dev/tty{1..6} +do + /usr/bin/setleds -D +num < "$tty"; +done +EOF + + sudo chmod +x /usr/local/bin/numlock +} + +# Create a systemd service to run the script on boot +create_service() { + echo "Creating service..." + sudo tee "/etc/systemd/system/numlock.service" >/dev/null <<'EOF' +[Unit] +Description=numlock + +[Service] +ExecStart=/usr/local/bin/numlock +StandardInput=tty +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +EOF +} + +main() { + # Check if the script and service files exists + if [ ! -f "/usr/local/bin/numlock" ]; then + create_file + fi + + if [ ! -f "/etc/systemd/system/numlock.service" ]; then + create_service + fi + + printf "Do you want to enable Numlock on boot? (y/n): " + read -r confirm + if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then + sudo systemctl enable numlock.service --quiet + echo "Numlock will be enabled on boot" + else + sudo systemctl disable numlock.service --quiet + echo "Numlock will not be enabled on boot" + + fi +} + +main diff --git a/src/tabs.rs b/src/tabs.rs index fa4ce3dd..fc650d16 100644 --- a/src/tabs.rs +++ b/src/tabs.rs @@ -54,7 +54,7 @@ pub static TABS: LazyLock> = LazyLock::new(|| { }, ListNode { name: "Remove Snaps", - command: Command::LocalFile("system-setup/4-remove-snaps.sh"), + command: Command::LocalFile("system-setup/5-remove-snaps.sh"), } }), }, @@ -120,6 +120,10 @@ pub static TABS: LazyLock> = LazyLock::new(|| { name: "Bluetooth Manager", command: Command::LocalFile("utils/bluetooth-control.sh"), }, + ListNode { + name: "Toggle Numlock On Startup", + command: Command::LocalFile("utils/numlock.sh"), + }, ListNode { name: "MonitorControl(xorg)", command: Command::None, From 5c207f310a2bc9f13fa437a0d7cc016a15e2af54 Mon Sep 17 00:00:00 2001 From: afonsofrancof Date: Sat, 17 Aug 2024 13:24:22 +0100 Subject: [PATCH 02/49] Added changes proposed by og-mrk Co-authored-by: og-mrk --- CONTRIBUTING.md | 38 ++++++++++++++++++++++---------------- README.md | 3 ++- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9990317a..5a76af0c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,54 +2,60 @@ Thank you for considering contributing to Linutil! We appreciate your effort in helping improve this project. To ensure that your contributions align with the goals and quality standards of Linutil, please follow these guidelines: -## 1. Setting Up Your Development Environment +## 1. **Install Rust**: -1. **Clone the repo**: Start by cloning the Linutil repository to your local machine. - ```bash - git clone https://github.com/christitustech/linutil.git - cd linutil +Make sure you have Rust installed on your machine. You can install it by following the instructions at [rust-lang.org](https://www.rust-lang.org/tools/install). + +## 2. **Fork and Clone the repo** + +1. Make a fork of the repo in GitHub +2. Clone the fork +```bash +git clone https://github.com/YOUR_USERNAME_HERE/linutil.git +cd linutil ``` -2. **Install Rust**: Make sure you have Rust installed on your machine. If you don't, you can install it by following the instructions at [rust-lang.org](https://www.rust-lang.org/tools/install). -3. **Edit the files you want to change**: Make your changes to the relevant files. -4. **Test your changes**: Run `cargo run` to test your modifications in a local environment and ensure everything works as expected. -## 2. Make Meaningful Changes +## 3. Make your changes +- **Edit the files you want to change**: Make your changes to the relevant files. +- **Test your changes**: Run `cargo run` to test your modifications in a local environment and ensure everything works as expected. + +## 4. Understand the existing code - **Have a clear reason**: Don’t change the way things are done without a valid reason. If you propose an alteration, be prepared to explain why it’s necessary and how it improves the project. - **Respect existing conventions**: Changes should align with the existing code style, design patterns, and overall project philosophy. If you want to introduce a new way of doing things, justify it clearly. -## 3. Learn from Past Pull Requests (PRs) +## 5. Learn from Past Pull Requests (PRs) - **Check merged PRs**: Reviewing merged pull requests can give you an idea of what kind of contributions are accepted and how they are implemented. - **Study rejected PRs**: This is especially important as it helps you avoid making similar mistakes or proposing changes that have already been considered and declined. -## 4. Write Clean, Descriptive Commit Messages +## 6. Write Clean, Descriptive Commit Messages - **Be descriptive**: Your commit messages should clearly describe what the change does and why it was made. - **Use the imperative mood**: For example, "Add feature X" or "Fix bug in Y", rather than "Added feature X" or "Fixed bug in Y". - **Keep commits clean**: Avoid committing a change and then immediately following it with a fix for that change. Instead, amend your commit or squash it if needed. -## 5. Keep Your Pull Requests (PRs) Small and Focused +## 7. Keep Your Pull Requests (PRs) Small and Focused - **Make small, targeted PRs**: Focus on one feature or fix per pull request. This makes it easier to review and increases the likelihood of acceptance. - **Avoid combining unrelated changes**: PRs that tackle multiple unrelated issues are harder to review and might be rejected because of a single problem. -## 6. Code Review and Feedback +## 8. Code Review and Feedback - **Expect feedback**: PRs will undergo code review. Be open to feedback and willing to make adjustments as needed. - **Participate in reviews**: If you feel comfortable, review other contributors' PRs as well. Peer review is a great way to learn and ensure high-quality contributions. -## 7. Contributing Is More Than Just Code +## 9. Contributing Is More Than Just Code - **Test the tool**: Running tests and providing feedback on how the tool works in different environments is a valuable contribution. - **Write well-formed issues**: Clearly describe bugs or problems you encounter, providing as much detail as possible, including steps to reproduce the issue. - **Propose reasonable feature requests**: When suggesting new features, ensure they fit within the scope, style, and design of the project. Provide clear reasoning and use cases. -## 8. Documentation +## 10. Documentation - **Update the documentation**: If your change affects the functionality, please update the relevant documentation files to reflect this. -## 9. License +## 11. License - **Agree to the license**: By contributing to Linutil, you agree that your contributions will be licensed under the project's MIT license. diff --git a/README.md b/README.md index a2978c3c..cf494362 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ **Linutil** is a distro-agnostic toolbox designed to simplify everyday Linux tasks. It helps you set up applications and optimize your system for specific use cases. The utility is actively developed in Rust πŸ¦€, providing performance and reliability. -*Note:* Since the project is still in active development, you may encounter some issues. Please consider [submitting feedback](https://github.com/ChrisTitusTech/linutil/issues) if you do. +> [!NOTE] +> Since the project is still in active development, you may encounter some issues. Please consider [submitting feedback](https://github.com/ChrisTitusTech/linutil/issues) if you do. ## πŸ’‘ Usage From 0a9d76b3429716c0e95c374803ab16b64beb2f3b Mon Sep 17 00:00:00 2001 From: gunther6000 Date: Sat, 17 Aug 2024 14:04:19 -0400 Subject: [PATCH 03/49] Adding Steam And Lutris And Goverlay Install For Archlinux --- src/commands/system-setup/2-gaming-setup.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/commands/system-setup/2-gaming-setup.sh b/src/commands/system-setup/2-gaming-setup.sh index 631a6ad3..e64f3ba6 100755 --- a/src/commands/system-setup/2-gaming-setup.sh +++ b/src/commands/system-setup/2-gaming-setup.sh @@ -90,7 +90,17 @@ install_additional_dependencies() { ;; *pacman) + echo "Installing Steam for Arch Linux..." + sudo pacman -S --noconfirm steam + echo "Steam installation complete." + echo "Installing Lutris for Arch Linux..." + sudo pacman -S --noconfirm lutris + echo "Lutris installation complete." + + echo "Installing GOverlay for Arch Linux..." + sudo pacman -S --noconfirm goverlay + echo "GOverlay installation complete." ;; *) From 0d5b2cea26124508eb1b17c6da0a6fcc1d0b33c5 Mon Sep 17 00:00:00 2001 From: Nightmare1984 Date: Mon, 19 Aug 2024 06:35:49 -0400 Subject: [PATCH 04/49] Just Fixing Steam Install So That You Can pick version --- src/commands/system-setup/2-gaming-setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/system-setup/2-gaming-setup.sh b/src/commands/system-setup/2-gaming-setup.sh index e64f3ba6..55044516 100755 --- a/src/commands/system-setup/2-gaming-setup.sh +++ b/src/commands/system-setup/2-gaming-setup.sh @@ -91,7 +91,7 @@ install_additional_dependencies() { ;; *pacman) echo "Installing Steam for Arch Linux..." - sudo pacman -S --noconfirm steam + sudo pacman -S steam echo "Steam installation complete." echo "Installing Lutris for Arch Linux..." From 9bcac0f7af43102fe7bf47365a2f7ba862d56cea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2024 19:28:52 +0000 Subject: [PATCH 05/49] Bump clap from 4.5.13 to 4.5.16 Bumps [clap](https://github.com/clap-rs/clap) from 4.5.13 to 4.5.16. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.13...clap_complete-v4.5.16) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 12 ++++++------ Cargo.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36fae34a..7b87f5bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,9 +52,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" @@ -163,9 +163,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.13" +version = "4.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" +checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" dependencies = [ "clap_builder", "clap_derive", @@ -173,9 +173,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.13" +version = "4.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" +checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" dependencies = [ "anstream", "anstyle", diff --git a/Cargo.toml b/Cargo.toml index cacbdcb3..cc1b1726 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [dependencies] chrono = "0.4.33" -clap = { version = "4.5.13", features = ["derive"] } +clap = { version = "4.5.16", features = ["derive"] } crossterm = "0.27.0" ego-tree = "0.6.2" oneshot = "0.1.8" From f54294cbe0cf4c9eb3b03f6d65bf3f99983d9603 Mon Sep 17 00:00:00 2001 From: JEEVITHA KANNAN K S Date: Wed, 21 Aug 2024 11:56:59 +0530 Subject: [PATCH 06/49] Added numlock to tab_data --- src/commands/utils/tab_data.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/commands/utils/tab_data.toml b/src/commands/utils/tab_data.toml index 41490334..2e5e1283 100644 --- a/src/commands/utils/tab_data.toml +++ b/src/commands/utils/tab_data.toml @@ -8,6 +8,10 @@ script = "wifi-control.sh" name = "Bluetooth Manager" script = "bluetooth-control.sh" +[[data]] +name = "Numlock on Startup" +script = "numlock.sh" + [[data]] name = "Monitor Control" From 020cac40a3c9811f697b913d9fe665855a750cd4 Mon Sep 17 00:00:00 2001 From: Chris Titus Date: Thu, 22 Aug 2024 17:19:52 -0500 Subject: [PATCH 07/49] archtitus publish --- .../system-setup/arch/server-setup.sh | 760 ++++++++++++++++++ src/commands/system-setup/tab_data.toml | 8 +- 2 files changed, 766 insertions(+), 2 deletions(-) create mode 100644 src/commands/system-setup/arch/server-setup.sh diff --git a/src/commands/system-setup/arch/server-setup.sh b/src/commands/system-setup/arch/server-setup.sh new file mode 100644 index 00000000..f0c31a35 --- /dev/null +++ b/src/commands/system-setup/arch/server-setup.sh @@ -0,0 +1,760 @@ +#!/bin/bash + +echo -ne " +------------------------------------------------------------------------- + β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— + β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•‘β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β• + β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— + β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ•β•β•β•β–ˆβ–ˆβ•‘ + β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ + β•šβ•β• β•šβ•β•β•šβ•β• β•šβ•β• β•šβ•β•β•β•β•β•β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β• +------------------------------------------------------------------------- + Automated Arch Linux Installer +------------------------------------------------------------------------- + +Verifying Arch Linux ISO is Booted + +" +if [ ! -f /usr/bin/pacstrap ]; then + echo "This script must be run from an Arch Linux ISO environment." + exit 1 +fi + +set_password() { + read -rs -p "Please enter password: " PASSWORD1 + echo -ne "\n" + read -rs -p "Please re-enter password: " PASSWORD2 + echo -ne "\n" + if [[ "$PASSWORD1" == "$PASSWORD2" ]]; then + set_option "$1" "$PASSWORD1" + else + echo -ne "ERROR! Passwords do not match. \n" + set_password + fi +} + +root_check() { + if [[ "$(id -u)" != "0" ]]; then + echo -ne "ERROR! This script must be run under the 'root' user!\n" + exit 0 + fi +} + +docker_check() { + if awk -F/ '$2 == "docker"' /proc/self/cgroup | read -r; then + echo -ne "ERROR! Docker container is not supported (at the moment)\n" + exit 0 + elif [[ -f /.dockerenv ]]; then + echo -ne "ERROR! Docker container is not supported (at the moment)\n" + exit 0 + fi +} + +arch_check() { + if [[ ! -e /etc/arch-release ]]; then + echo -ne "ERROR! This script must be run in Arch Linux!\n" + exit 0 + fi +} + +pacman_check() { + if [[ -f /var/lib/pacman/db.lck ]]; then + echo "ERROR! Pacman is blocked." + echo -ne "If not running remove /var/lib/pacman/db.lck.\n" + exit 0 + fi +} + +background_checks() { + root_check + arch_check + pacman_check + docker_check +} + +# Renders a text based list of options that can be selected by the +# user using up, down and enter keys and returns the chosen option. +# +# Arguments : list of options, maximum of 256 +# "opt1" "opt2" ... +# Return value: selected index (0 for opt1, 1 for opt2 ...) +select_option() { + + # little helpers for terminal print control and key input + ESC=$( printf "\033") + cursor_blink_on() { printf "$ESC[?25h"; } + cursor_blink_off() { printf "$ESC[?25l"; } + cursor_to() { printf "$ESC[$1;${2:-1}H"; } + print_option() { printf "$2 $1 "; } + print_selected() { printf "$2 $ESC[7m $1 $ESC[27m"; } + get_cursor_row() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; } + get_cursor_col() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${COL#*[}; } + key_input() { + local key + IFS= read -rsn1 key 2>/dev/null >&2 + if [[ $key = "" ]]; then echo enter; fi; + if [[ $key = $'\x20' ]]; then echo space; fi; + if [[ $key = "k" ]]; then echo up; fi; + if [[ $key = "j" ]]; then echo down; fi; + if [[ $key = "h" ]]; then echo left; fi; + if [[ $key = "l" ]]; then echo right; fi; + if [[ $key = "a" ]]; then echo all; fi; + if [[ $key = "n" ]]; then echo none; fi; + if [[ $key = $'\x1b' ]]; then + read -rsn2 key + if [[ $key = [A || $key = k ]]; then echo up; fi; + if [[ $key = [B || $key = j ]]; then echo down; fi; + if [[ $key = [C || $key = l ]]; then echo right; fi; + if [[ $key = [D || $key = h ]]; then echo left; fi; + fi + } + print_options_multicol() { + # print options by overwriting the last lines + local curr_col=$1 + local curr_row=$2 + local curr_idx=0 + + local idx=0 + local row=0 + local col=0 + + curr_idx=$(( $curr_col + $curr_row * $colmax )) + + for option in "${options[@]}"; do + + row=$(( $idx/$colmax )) + col=$(( $idx - $row * $colmax )) + + cursor_to $(( $startrow + $row + 1)) $(( $offset * $col + 1)) + if [ $idx -eq $curr_idx ]; then + print_selected "$option" + else + print_option "$option" + fi + ((idx++)) + done + } + + # initially print empty new lines (scroll down if at bottom of screen) + for opt; do printf "\n"; done + + # determine current screen position for overwriting the options + local return_value=$1 + local lastrow=`get_cursor_row` + local lastcol=`get_cursor_col` + local startrow=$(($lastrow - $#)) + local startcol=1 + local lines=$( tput lines ) + local cols=$( tput cols ) + local colmax=$2 + local offset=$(( $cols / $colmax )) + + local size=$4 + shift 4 + + # ensure cursor and input echoing back on upon a ctrl+c during read -s + trap "cursor_blink_on; stty echo; printf '\n'; exit" 2 + cursor_blink_off + + local active_row=0 + local active_col=0 + while true; do + print_options_multicol $active_col $active_row + # user key control + case `key_input` in + enter) break;; + up) ((active_row--)); + if [ $active_row -lt 0 ]; then active_row=0; fi;; + down) ((active_row++)); + if [ $active_row -ge $(( ${#options[@]} / $colmax )) ]; then active_row=$(( ${#options[@]} / $colmax )); fi;; + left) ((active_col=$active_col - 1)); + if [ $active_col -lt 0 ]; then active_col=0; fi;; + right) ((active_col=$active_col + 1)); + if [ $active_col -ge $colmax ]; then active_col=$(( $colmax - 1 )) ; fi;; + esac + done + + # cursor position back to normal + cursor_to $lastrow + printf "\n" + cursor_blink_on + + return $(( $active_col + $active_row * $colmax )) +} +# @description Displays ArchTitus logo +# @noargs +logo () { +# This will be shown on every set as user is progressing +echo -ne " +------------------------------------------------------------------------- + β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— +β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•‘β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β• +β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— +β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ•β•β•β•β–ˆβ–ˆβ•‘ +β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ +β•šβ•β• β•šβ•β•β•šβ•β• β•šβ•β• β•šβ•β•β•β•β•β•β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β• +------------------------------------------------------------------------ + Please select presetup settings for your system +------------------------------------------------------------------------ +" +} +# @description This function will handle file systems. At this movement we are handling only +# btrfs and ext4. Others will be added in future. +filesystem () { +echo -ne " +Please Select your file system for both boot and root +" +options=("btrfs" "ext4" "luks" "exit") +select_option $? 1 "${options[@]}" + +case $? in +0) set_option FS btrfs;; +1) set_option FS ext4;; +2) + set_password "LUKS_PASSWORD" + set_option FS luks + ;; +3) exit ;; +*) echo "Wrong option please select again"; filesystem;; +esac +} +# @description Detects and sets timezone. +timezone () { +# Added this from arch wiki https://wiki.archlinux.org/title/System_time +time_zone="$(curl --fail https://ipapi.co/timezone)" +echo -ne " +System detected your timezone to be '$time_zone' \n" +echo -ne "Is this correct? +" +options=("Yes" "No") +select_option $? 1 "${options[@]}" + +case ${options[$?]} in + y|Y|yes|Yes|YES) + echo "${time_zone} set as timezone" + set_option TIMEZONE $time_zone;; + n|N|no|NO|No) + echo "Please enter your desired timezone e.g. Europe/London :" + read new_timezone + echo "${new_timezone} set as timezone" + set_option TIMEZONE $new_timezone;; + *) echo "Wrong option. Try again";timezone;; +esac +} +# @description Set user's keyboard mapping. +keymap () { +echo -ne " +Please select key board layout from this list" +# These are default key maps as presented in official arch repo archinstall +options=(us by ca cf cz de dk es et fa fi fr gr hu il it lt lv mk nl no pl ro ru sg ua uk) + +select_option $? 4 "${options[@]}" +keymap=${options[$?]} + +echo -ne "Your key boards layout: ${keymap} \n" +set_option KEYMAP $keymap +} + +# @description Choose whether drive is SSD or not. +drivessd () { +echo -ne " +Is this an ssd? yes/no: +" + +options=("Yes" "No") +select_option $? 1 "${options[@]}" + +case ${options[$?]} in + y|Y|yes|Yes|YES) + set_option MOUNT_OPTIONS "noatime,compress=zstd,ssd,commit=120";; + n|N|no|NO|No) + set_option MOUNT_OPTIONS "noatime,compress=zstd,commit=120";; + *) echo "Wrong option. Try again";drivessd;; +esac +} + +# @description Disk selection for drive to be used with installation. +diskpart () { +echo -ne " +------------------------------------------------------------------------ + THIS WILL FORMAT AND DELETE ALL DATA ON THE DISK + Please make sure you know what you are doing because + after formating your disk there is no way to get data back + *****BACKUP YOUR DATA BEFORE CONTINUING***** + ***I AM NOT RESPONSIBLE FOR ANY DATA LOSS*** +------------------------------------------------------------------------ + +" + +PS3=' +Select the disk to install on: ' +options=($(lsblk -n --output TYPE,KNAME,SIZE | awk '$1=="disk"{print "/dev/"$2"|"$3}')) + +select_option $? 1 "${options[@]}" +disk=${options[$?]%|*} + +echo -e "\n${disk%|*} selected \n" + set_option DISK ${disk%|*} + +drivessd +} + +# @description Gather username and password to be used for installation. +userinfo () { +read -p "Please enter your username: " username +set_option USERNAME ${username,,} # convert to lower case as in issue #109 +set_password "PASSWORD" +read -rep "Please enter your hostname: " nameofmachine +set_option NAME_OF_MACHINE $nameofmachine +} + +# Starting functions +background_checks +clear +logo +userinfo +clear +logo +diskpart +clear +logo +filesystem +clear +logo +timezone +clear +logo +keymap + +echo "Setting up mirrors for optimal download" +iso=$(curl -4 ifconfig.co/country-iso) +timedatectl set-ntp true +pacman -S --noconfirm archlinux-keyring #update keyrings to latest to prevent packages failing to install +pacman -S --noconfirm --needed pacman-contrib terminus-font +setfont ter-v22b +sed -i 's/^#ParallelDownloads/ParallelDownloads/' /etc/pacman.conf +pacman -S --noconfirm --needed reflector rsync grub +cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup +echo -ne " +------------------------------------------------------------------------- + Setting up $iso mirrors for faster downloads +------------------------------------------------------------------------- +" +reflector -a 48 -c $iso -f 5 -l 20 --sort rate --save /etc/pacman.d/mirrorlist +mkdir /mnt &>/dev/null # Hiding error message if any +echo -ne " +------------------------------------------------------------------------- + Installing Prerequisites +------------------------------------------------------------------------- +" +pacman -S --noconfirm --needed gptfdisk btrfs-progs glibc +echo -ne " +------------------------------------------------------------------------- + Formating Disk +------------------------------------------------------------------------- +" +umount -A --recursive /mnt # make sure everything is unmounted before we start +# disk prep +sgdisk -Z ${DISK} # zap all on disk +sgdisk -a 2048 -o ${DISK} # new gpt disk 2048 alignment + +# create partitions +sgdisk -n 1::+1M --typecode=1:ef02 --change-name=1:'BIOSBOOT' ${DISK} # partition 1 (BIOS Boot Partition) +sgdisk -n 2::+300M --typecode=2:ef00 --change-name=2:'EFIBOOT' ${DISK} # partition 2 (UEFI Boot Partition) +sgdisk -n 3::-0 --typecode=3:8300 --change-name=3:'ROOT' ${DISK} # partition 3 (Root), default start, remaining +if [[ ! -d "/sys/firmware/efi" ]]; then # Checking for bios system + sgdisk -A 1:set:2 ${DISK} +fi +partprobe ${DISK} # reread partition table to ensure it is correct + +# make filesystems +echo -ne " +------------------------------------------------------------------------- + Creating Filesystems +------------------------------------------------------------------------- +" +# @description Creates the btrfs subvolumes. +createsubvolumes () { + btrfs subvolume create /mnt/@ + btrfs subvolume create /mnt/@home + btrfs subvolume create /mnt/@var + btrfs subvolume create /mnt/@tmp + btrfs subvolume create /mnt/@.snapshots +} + +# @description Mount all btrfs subvolumes after root has been mounted. +mountallsubvol () { + mount -o ${MOUNT_OPTIONS},subvol=@home ${partition3} /mnt/home + mount -o ${MOUNT_OPTIONS},subvol=@tmp ${partition3} /mnt/tmp + mount -o ${MOUNT_OPTIONS},subvol=@var ${partition3} /mnt/var + mount -o ${MOUNT_OPTIONS},subvol=@.snapshots ${partition3} /mnt/.snapshots +} + +# @description BTRFS subvolulme creation and mounting. +subvolumesetup () { +# create nonroot subvolumes + createsubvolumes +# unmount root to remount with subvolume + umount /mnt +# mount @ subvolume + mount -o ${MOUNT_OPTIONS},subvol=@ ${partition3} /mnt +# make directories home, .snapshots, var, tmp + mkdir -p /mnt/{home,var,tmp,.snapshots} +# mount subvolumes + mountallsubvol +} + +if [[ "${DISK}" =~ "nvme" ]]; then + partition2=${DISK}p2 + partition3=${DISK}p3 +else + partition2=${DISK}2 + partition3=${DISK}3 +fi + +if [[ "${FS}" == "btrfs" ]]; then + mkfs.vfat -F32 -n "EFIBOOT" ${partition2} + mkfs.btrfs -L ROOT ${partition3} -f + mount -t btrfs ${partition3} /mnt + subvolumesetup +elif [[ "${FS}" == "ext4" ]]; then + mkfs.vfat -F32 -n "EFIBOOT" ${partition2} + mkfs.ext4 -L ROOT ${partition3} + mount -t ext4 ${partition3} /mnt +elif [[ "${FS}" == "luks" ]]; then + mkfs.vfat -F32 -n "EFIBOOT" ${partition2} +# enter luks password to cryptsetup and format root partition + echo -n "${LUKS_PASSWORD}" | cryptsetup -y -v luksFormat ${partition3} - +# open luks container and ROOT will be place holder + echo -n "${LUKS_PASSWORD}" | cryptsetup open ${partition3} ROOT - +# now format that container + mkfs.btrfs -L ROOT ${partition3} +# create subvolumes for btrfs + mount -t btrfs ${partition3} /mnt + subvolumesetup +fi + +# mount target +mkdir -p /mnt/boot/efi +mount -t vfat -L EFIBOOT /mnt/boot/ + +if ! grep -qs '/mnt' /proc/mounts; then + echo "Drive is not mounted can not continue" + echo "Rebooting in 3 Seconds ..." && sleep 1 + echo "Rebooting in 2 Seconds ..." && sleep 1 + echo "Rebooting in 1 Second ..." && sleep 1 + reboot now +fi +echo -ne " +------------------------------------------------------------------------- + Arch Install on Main Drive +------------------------------------------------------------------------- +" +pacstrap /mnt base base-devel linux-lts linux-lts-firmware vim nano sudo archlinux-keyring wget libnewt --noconfirm --needed +echo "keyserver hkp://keyserver.ubuntu.com" >> /mnt/etc/pacman.d/gnupg/gpg.conf +cp -R ${SCRIPT_DIR} /mnt/root/ArchTitus +cp /etc/pacman.d/mirrorlist /mnt/etc/pacman.d/mirrorlist + +genfstab -L /mnt >> /mnt/etc/fstab +echo " + Generated /etc/fstab: +" +cat /mnt/etc/fstab +echo -ne " +------------------------------------------------------------------------- + GRUB BIOS Bootloader Install & Check +------------------------------------------------------------------------- +" +if [[ ! -d "/sys/firmware/efi" ]]; then + grub-install --boot-directory=/mnt/boot ${DISK} +else + pacstrap /mnt efibootmgr --noconfirm --needed +fi +echo -ne " +------------------------------------------------------------------------- + Checking for low memory systems <8G +------------------------------------------------------------------------- +" +TOTAL_MEM=$(cat /proc/meminfo | grep -i 'memtotal' | grep -o '[[:digit:]]*') +if [[ $TOTAL_MEM -lt 8000000 ]]; then + # Put swap into the actual system, not into RAM disk, otherwise there is no point in it, it'll cache RAM into RAM. So, /mnt/ everything. + mkdir -p /mnt/opt/swap # make a dir that we can apply NOCOW to to make it btrfs-friendly. + if findmnt -n -o FSTYPE /mnt | grep -q btrfs; then + chattr +C /mnt/opt/swap # apply NOCOW, btrfs needs that. + fi + dd if=/dev/zero of=/mnt/opt/swap/swapfile bs=1M count=2048 status=progress + chmod 600 /mnt/opt/swap/swapfile # set permissions. + chown root /mnt/opt/swap/swapfile + mkswap /mnt/opt/swap/swapfile + swapon /mnt/opt/swap/swapfile + # The line below is written to /mnt/ but doesn't contain /mnt/, since it's just / for the system itself. + echo "/opt/swap/swapfile none swap sw 0 0" >> /mnt/etc/fstab # Add swap to fstab, so it KEEPS working after installation. +fi + +echo -ne " +------------------------------------------------------------------------- + Network Setup +------------------------------------------------------------------------- +" +pacman -S --noconfirm --needed networkmanager dhclient +systemctl enable --now NetworkManager +echo -ne " +------------------------------------------------------------------------- + Setting up mirrors for optimal download +------------------------------------------------------------------------- +" +pacman -S --noconfirm --needed pacman-contrib curl +pacman -S --noconfirm --needed reflector rsync grub arch-install-scripts git +cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak + +nc=$(grep -c ^processor /proc/cpuinfo) +echo -ne " +------------------------------------------------------------------------- + You have " $nc" cores. And + changing the makeflags for "$nc" cores. Aswell as + changing the compression settings. +------------------------------------------------------------------------- +" +TOTAL_MEM=$(cat /proc/meminfo | grep -i 'memtotal' | grep -o '[[:digit:]]*') +if [[ $TOTAL_MEM -gt 8000000 ]]; then +sed -i "s/#MAKEFLAGS=\"-j2\"/MAKEFLAGS=\"-j$nc\"/g" /etc/makepkg.conf +sed -i "s/COMPRESSXZ=(xz -c -z -)/COMPRESSXZ=(xz -c -T $nc -z -)/g" /etc/makepkg.conf +fi +echo -ne " +------------------------------------------------------------------------- + Setup Language to US and set locale +------------------------------------------------------------------------- +" +sed -i 's/^#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen +locale-gen +timedatectl --no-ask-password set-timezone ${TIMEZONE} +timedatectl --no-ask-password set-ntp 1 +localectl --no-ask-password set-locale LANG="en_US.UTF-8" LC_TIME="en_US.UTF-8" +ln -s /usr/share/zoneinfo/${TIMEZONE} /etc/localtime +# Set keymaps +localectl --no-ask-password set-keymap ${KEYMAP} + +# Add sudo no password rights +sed -i 's/^# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/' /etc/sudoers +sed -i 's/^# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/%wheel ALL=(ALL:ALL) NOPASSWD: ALL/' /etc/sudoers + +#Add parallel downloading +sed -i 's/^#ParallelDownloads/ParallelDownloads/' /etc/pacman.conf + +#Enable multilib +sed -i "/\[multilib\]/,/Include/"'s/^#//' /etc/pacman.conf +pacman -Sy --noconfirm --needed + +echo -ne " +------------------------------------------------------------------------- + Installing Microcode +------------------------------------------------------------------------- +" +# determine processor type and install microcode +proc_type=$(lscpu) +if grep -E "GenuineIntel" <<< ${proc_type}; then + echo "Installing Intel microcode" + pacman -S --noconfirm --needed intel-ucode + proc_ucode=intel-ucode.img +elif grep -E "AuthenticAMD" <<< ${proc_type}; then + echo "Installing AMD microcode" + pacman -S --noconfirm --needed amd-ucode + proc_ucode=amd-ucode.img +fi + +echo -ne " +------------------------------------------------------------------------- + Installing Graphics Drivers +------------------------------------------------------------------------- +" +# Graphics Drivers find and install +gpu_type=$(lspci) +if grep -E "NVIDIA|GeForce" <<< ${gpu_type}; then + pacman -S --noconfirm --needed nvidia-lts + nvidia-xconfig +elif lspci | grep 'VGA' | grep -E "Radeon|AMD"; then + pacman -S --noconfirm --needed xf86-video-amdgpu +elif grep -E "Integrated Graphics Controller" <<< ${gpu_type}; then + pacman -S --noconfirm --needed libva-intel-driver libvdpau-va-gl lib32-vulkan-intel vulkan-intel libva-intel-driver libva-utils lib32-mesa +elif grep -E "Intel Corporation UHD" <<< ${gpu_type}; then + pacman -S --needed --noconfirm libva-intel-driver libvdpau-va-gl lib32-vulkan-intel vulkan-intel libva-intel-driver libva-utils lib32-mesa +fi + # Loop through user input until the user gives a valid username + while true + do + read -p "Please enter username:" username + # username regex per response here https://unix.stackexchange.com/questions/157426/what-is-the-regex-to-validate-linux-users + # lowercase the username to test regex + if [[ "${username,,}" =~ ^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$ ]] + then + break + fi + echo "Incorrect username." + done + #Set Password + read -p "Please enter password:" password + + # Loop through user input until the user gives a valid hostname, but allow the user to force save + while true + do + read -p "Please name your machine:" name_of_machine + # hostname regex (!!couldn't find spec for computer name!!) + if [[ "${name_of_machine,,}" =~ ^[a-z][a-z0-9_.-]{0,62}[a-z0-9]$ ]] + then + break + fi + # if validation fails allow the user to force saving of the hostname + read -p "Hostname doesn't seem correct. Do you still want to save it? (y/n)" force + if [[ "${force,,}" = "y" ]] + then + break + fi + done + +echo -ne " +------------------------------------------------------------------------- + Adding User +------------------------------------------------------------------------- +" +if [ $(whoami) = "root" ]; then + groupadd libvirt + useradd -m -G wheel,libvirt -s /bin/bash $USERNAME + echo "$USERNAME created, home directory created, added to wheel and libvirt group, default shell set to /bin/bash" + +# use chpasswd to enter $USERNAME:$password + echo "$USERNAME:$PASSWORD" | chpasswd + echo "$USERNAME password set" + + cp -R $HOME/ArchTitus /home/$USERNAME/ + chown -R $USERNAME: /home/$USERNAME/ArchTitus + echo "ArchTitus copied to home directory" + +# enter $NAME_OF_MACHINE to /etc/hostname + echo $NAME_OF_MACHINE > /etc/hostname +else + echo "You are already a user proceed with aur installs" +fi +if [[ ${FS} == "luks" ]]; then +# Making sure to edit mkinitcpio conf if luks is selected +# add encrypt in mkinitcpio.conf before filesystems in hooks + sed -i 's/filesystems/encrypt filesystems/g' /etc/mkinitcpio.conf +# making mkinitcpio with linux kernel + mkinitcpio -p linux-lts +fi + +export PATH=$PATH:~/.local/bin + +echo -ne " +------------------------------------------------------------------------- + β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— + β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•‘β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β• + β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— + β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ•β•β•β•β–ˆβ–ˆβ•‘ + β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘ + β•šβ•β• β•šβ•β•β•šβ•β• β•šβ•β• β•šβ•β•β•β•β•β•β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β• β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β• +------------------------------------------------------------------------- + Automated Arch Linux Installer + SCRIPTHOME: ArchTitus +------------------------------------------------------------------------- + +Final Setup and Configurations +GRUB EFI Bootloader Install & Check +" + +if [[ -d "/sys/firmware/efi" ]]; then + grub-install --efi-directory=/boot ${DISK} +fi + +echo -ne " +------------------------------------------------------------------------- + Creating (and Theming) Grub Boot Menu +------------------------------------------------------------------------- +" +# set kernel parameter for decrypting the drive +if [[ "${FS}" == "luks" ]]; then +sed -i "s%GRUB_CMDLINE_LINUX_DEFAULT=\"%GRUB_CMDLINE_LINUX_DEFAULT=\"cryptdevice=UUID=${ENCRYPTED_PARTITION_UUID}:ROOT root=/dev/mapper/ROOT %g" /etc/default/grub +fi +# set kernel parameter for adding splash screen +sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[^"]*/& splash /' /etc/default/grub + +echo -e "Installing CyberRe Grub theme..." +THEME_DIR="/boot/grub/themes" +THEME_NAME=CyberRe +echo -e "Creating the theme directory..." +mkdir -p "${THEME_DIR}/${THEME_NAME}" +echo -e "Copying the theme..." +cd "${HOME}/ArchTitus" || exit +cp -a configs${THEME_DIR}/${THEME_NAME}/* ${THEME_DIR}/${THEME_NAME} +echo -e "Backing up Grub config..." +cp -an /etc/default/grub /etc/default/grub.bak +echo -e "Setting the theme as the default..." +# shellcheck disable=SC2069 +grep "GRUB_THEME=" /etc/default/grub 2>&1 >/dev/null && sed -i '/GRUB_THEME=/d' /etc/default/grub +echo "GRUB_THEME=\"${THEME_DIR}/${THEME_NAME}/theme.txt\"" >> /etc/default/grub +echo -e "Updating grub..." +grub-mkconfig -o /boot/grub/grub.cfg +echo -e "All set!" + +echo -ne " +------------------------------------------------------------------------- + Enabling (and Theming) Login Display Manager +------------------------------------------------------------------------- +" + +systemctl enable sddm.service +echo "[Theme]" >> /etc/sddm.conf +echo "Current=Nordic" >> /etc/sddm.conf + +echo -ne " +------------------------------------------------------------------------- + Enabling Essential Services +------------------------------------------------------------------------- +" +ntpd -qg +systemctl enable ntpd.service +echo " NTP enabled" +systemctl disable dhcpcd.service +echo " DHCP disabled" +systemctl stop dhcpcd.service +echo " DHCP stopped" +systemctl enable NetworkManager.service +echo " NetworkManager enabled" + +echo -ne " +------------------------------------------------------------------------- + Enabling (and Theming) Plymouth Boot Splash +------------------------------------------------------------------------- +" +PLYMOUTH_THEMES_DIR="$HOME/ArchTitus/configs/usr/share/plymouth/themes" +PLYMOUTH_THEME="arch-glow" # can grab from config later if we allow selection +mkdir -p /usr/share/plymouth/themes +echo 'Installing Plymouth theme...' +cp -rf "${PLYMOUTH_THEMES_DIR}"/${PLYMOUTH_THEME} /usr/share/plymouth/themes +if [[ $FS == "luks" ]]; then + sed -i 's/HOOKS=(base udev*/& plymouth/' /etc/mkinitcpio.conf # add plymouth after base udev + sed -i 's/HOOKS=(base udev \(.*block\) /&plymouth-/' /etc/mkinitcpio.conf # create plymouth-encrypt after block hook +else + sed -i 's/HOOKS=(base udev*/& plymouth/' /etc/mkinitcpio.conf # add plymouth after base udev +fi +plymouth-set-default-theme -R arch-glow # sets the theme and runs mkinitcpio +echo 'Plymouth theme installed' + +echo -ne " +------------------------------------------------------------------------- + Cleaning +------------------------------------------------------------------------- +" +# Remove no password sudo rights +sed -i 's/^%wheel ALL=(ALL) NOPASSWD: ALL/# %wheel ALL=(ALL) NOPASSWD: ALL/' /etc/sudoers +sed -i 's/^%wheel ALL=(ALL:ALL) NOPASSWD: ALL/# %wheel ALL=(ALL:ALL) NOPASSWD: ALL/' /etc/sudoers +# Add sudo rights +sed -i 's/^# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/' /etc/sudoers +sed -i 's/^# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/' /etc/sudoers + +rm -r $HOME/ArchTitus +rm -r /home/$USERNAME/ArchTitus + +# Replace in the same state +cd "$(pwd)" || exit + + diff --git a/src/commands/system-setup/tab_data.toml b/src/commands/system-setup/tab_data.toml index 53ec55cd..7551e884 100644 --- a/src/commands/system-setup/tab_data.toml +++ b/src/commands/system-setup/tab_data.toml @@ -9,13 +9,17 @@ data = "command_exists" values = ["pacman"] [[data.entries]] -name = "Yay AUR Helper" -script = "arch/yay-setup.sh" +name = "Arch Server Setup" +script = "arch/server-setup.sh" [[data.entries]] name = "Paru AUR Helper" script = "arch/paru-setup.sh" +[[data.entries]] +name = "Yay AUR Helper" +script = "arch/yay-setup.sh" + [[data]] name = "Full System Update" script = "system-update.sh" From 2b900466711a881730d106dc1504328685a0fc0c Mon Sep 17 00:00:00 2001 From: ChrisTitusTech Date: Thu, 22 Aug 2024 22:34:03 +0000 Subject: [PATCH 08/49] Commit Linutil --- build/linutil | Bin 2718464 -> 2747136 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/build/linutil b/build/linutil index 39a0d589d3cfaa29344d32aa728418fbeedbd741..428b10f2d1ecf4e37d23c42c4d2ea8e8dcde979f 100755 GIT binary patch delta 583329 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