diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3b61761b3..093357d25 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,8 +1,3 @@ -# Pull Request - -## Title - - ## Type of Change - [ ] New feature - [ ] Bug fix diff --git a/.github/workflows/pr-labels.yaml b/.github/workflows/pr-labels.yaml index eab956f41..82f9ac97d 100644 --- a/.github/workflows/pr-labels.yaml +++ b/.github/workflows/pr-labels.yaml @@ -1,7 +1,7 @@ name: Manage labels based on PR body on: - pull_request: + pull_request_target: types: [opened, edited, reopened, synchronize] jobs: @@ -9,8 +9,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Analyze PR Body and manage labels + shell: bash run: | - body="${{ github.event.pull_request.body }}" + body=$(jq -r '.pull_request.body' "$GITHUB_EVENT_PATH") labels_to_add=() labels_to_remove=() declare -A label_checks=( @@ -20,19 +21,23 @@ jobs: ["Refactoring"]="refactor" ["UI/UX improvement"]="UI/UX" ) - for key in "${!label_checks[@]}"; do - if echo "$body" | grep -q "\- \[x\] $key"; then - labels_to_add+=("${label_checks[$key]}") + for pattern in "${!label_checks[@]}"; do + label="${label_checks[$pattern]}" + if echo "$body" | grep -Eq "\- \[x\] ($pattern)"; then + labels_to_add+=("$label") else - labels_to_remove+=("${label_checks[$key]}") + labels_to_remove+=("$label") fi done - echo "LABELS_TO_ADD=${labels_to_add[*]}" >> $GITHUB_ENV - echo "LABELS_TO_REMOVE=${labels_to_remove[*]}" >> $GITHUB_ENV + + echo "LABELS_TO_ADD=$(IFS=,; echo "${labels_to_add[*]}")" >> $GITHUB_ENV + echo "LABELS_TO_REMOVE=$(IFS=,; echo "${labels_to_remove[*]}")" >> $GITHUB_ENV + - name: Add labels if necessary if: env.LABELS_TO_ADD != '' run: | - for label in ${{ env.LABELS_TO_ADD }}; do + IFS=',' read -ra labels <<< "${LABELS_TO_ADD}" + for label in "${labels[@]}"; do curl -s -X POST \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ @@ -42,9 +47,10 @@ jobs: - name: Remove labels if necessary if: env.LABELS_TO_REMOVE != '' run: | - for label in ${{ env.LABELS_TO_REMOVE }}; do + IFS=',' read -ra labels <<< "${LABELS_TO_REMOVE}" + for label in "${labels[@]}"; do curl -s -X DELETE \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels/$label - done \ No newline at end of file + done diff --git a/start.sh b/start.sh index d1e7658ae..b6fe4fdc8 100755 --- a/start.sh +++ b/start.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/sh -e rc='\033[0m' red='\033[0;31m' diff --git a/startdev.sh b/startdev.sh index 1070ea429..0df8ce53a 100755 --- a/startdev.sh +++ b/startdev.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/sh -e RC='\033[0m' RED='\033[0;31m' @@ -35,7 +35,7 @@ check() { local message=$2 if [ $exit_code -ne 0 ]; then - echo -e "${RED}ERROR: $message${RC}" + printf "%b\n" "${RED}ERROR: $message${RC}" exit 1 fi } diff --git a/tabs/applications-setup/alacritty-setup.sh b/tabs/applications-setup/alacritty-setup.sh index 92e49d337..4c1c58d7d 100755 --- a/tabs/applications-setup/alacritty-setup.sh +++ b/tabs/applications-setup/alacritty-setup.sh @@ -2,33 +2,34 @@ . ../common-script.sh -setupAlacritty() { - echo "Install Alacritty if not already installed..." +installAlacritty() { + printf "%b\n" "${YELLOW}Installing Alacritty...${RC}" if ! command_exists alacritty; then - case ${PACKAGER} in + case "$PACKAGER" in pacman) - $ESCALATION_TOOL ${PACKAGER} -S --needed --noconfirm alacritty + $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm alacritty ;; *) - $ESCALATION_TOOL ${PACKAGER} install -y alacritty + $ESCALATION_TOOL "$PACKAGER" install -y alacritty ;; esac else - echo "alacritty is already installed." + printf "%b\n" "${GREEN}Alacritty is already installed.${RC}" fi } setupAlacrittyConfig() { - echo "Copy alacritty config files" + printf "%b\n" "${YELLOW}Copy alacritty config files${RC}" if [ -d "${HOME}/.config/alacritty" ] && [ ! -d "${HOME}/.config/alacritty-bak" ]; then cp -r "${HOME}/.config/alacritty" "${HOME}/.config/alacritty-bak" fi mkdir -p "${HOME}/.config/alacritty/" curl -sSLo "${HOME}/.config/alacritty/alacritty.toml" "https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/alacritty/alacritty.toml" curl -sSLo "${HOME}/.config/alacritty/nordic.toml" "https://github.com/ChrisTitusTech/dwm-titus/raw/main/config/alacritty/nordic.toml" + printf "%b\n" "${GREEN}Alacritty configuration files copied.${RC}" } checkEnv checkEscalationTool -setupAlacritty +installAlacritty setupAlacrittyConfig \ No newline at end of file diff --git a/tabs/applications-setup/dwmtitus-setup.sh b/tabs/applications-setup/dwmtitus-setup.sh index acc56c0e7..9ae234455 100755 --- a/tabs/applications-setup/dwmtitus-setup.sh +++ b/tabs/applications-setup/dwmtitus-setup.sh @@ -2,33 +2,33 @@ . ../common-script.sh -makeDWM() { - cd "$HOME" && git clone https://github.com/ChrisTitusTech/dwm-titus.git # CD to Home directory to install dwm-titus - # This path can be changed (e.g. to linux-toolbox directory) - cd dwm-titus/ # Hardcoded path, maybe not the best. - $ESCALATION_TOOL make clean install # Run make clean install -} - setupDWM() { - echo "Installing DWM-Titus if not already installed" + printf "%b\n" "${YELLOW}Installing DWM-Titus if not already installed${RC}" case "$PACKAGER" in # Install pre-Requisites pacman) - $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm base-devel libx11 libxinerama libxft imlib2 libxcb + $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm base-devel libx11 libxinerama libxft imlib2 libxcb git ;; apt-get|nala) - $ESCALATION_TOOL "$PACKAGER" install -y build-essential libx11-dev libxinerama-dev libxft-dev libimlib2-dev libx11-xcb-dev libfontconfig1 libx11-6 libxft2 libxinerama1 libxcb-res0-dev + $ESCALATION_TOOL "$PACKAGER" install -y build-essential libx11-dev libxinerama-dev libxft-dev libimlib2-dev libx11-xcb-dev libfontconfig1 libx11-6 libxft2 libxinerama1 libxcb-res0-dev git ;; dnf) $ESCALATION_TOOL "$PACKAGER" groupinstall -y "Development Tools" $ESCALATION_TOOL "$PACKAGER" install -y libX11-devel libXinerama-devel libXft-devel imlib2-devel libxcb-devel ;; *) - echo "Unsupported package manager: $PACKAGER" + printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}" exit 1 ;; esac } +makeDWM() { + cd "$HOME" && git clone https://github.com/ChrisTitusTech/dwm-titus.git # CD to Home directory to install dwm-titus + # This path can be changed (e.g. to linux-toolbox directory) + cd dwm-titus/ # Hardcoded path, maybe not the best. + $ESCALATION_TOOL make clean install # Run make clean install +} + install_nerd_font() { FONT_DIR="$HOME/.local/share/fonts" FONT_ZIP="$FONT_DIR/Meslo.zip" @@ -37,56 +37,56 @@ install_nerd_font() { # Check if Meslo Nerd-font is already installed if [ -n "$FONT_INSTALLED" ]; then - echo "Meslo Nerd-fonts are already installed." + printf "%b\n" "${GREEN}Meslo Nerd-fonts are already installed.${RC}" return 0 fi - echo "Installing Meslo Nerd-fonts" + printf "%b\n" "${YELLOW}Installing Meslo Nerd-fonts${RC}" # Create the fonts directory if it doesn't exist if [ ! -d "$FONT_DIR" ]; then mkdir -p "$FONT_DIR" || { - echo "Failed to create directory: $FONT_DIR" + printf "%b\n" "${RED}Failed to create directory: $FONT_DIR${RC}" return 1 } else - echo "$FONT_DIR exists, skipping creation." + printf "%b\n" "${GREEN}$FONT_DIR exists, skipping creation.${RC}" fi # Check if the font zip file already exists if [ ! -f "$FONT_ZIP" ]; then # Download the font zip file curl -sSLo "$FONT_ZIP" "$FONT_URL" || { - echo "Failed to download Meslo Nerd-fonts from $FONT_URL" + printf "%b\n" "${RED}Failed to download Meslo Nerd-fonts from $FONT_URL${RC}" return 1 } else - echo "Meslo.zip already exists in $FONT_DIR, skipping download." + printf "%b\n" "${GREEN}Meslo.zip already exists in $FONT_DIR, skipping download.${RC}" fi # Unzip the font file if it hasn't been unzipped yet if [ ! -d "$FONT_DIR/Meslo" ]; then unzip "$FONT_ZIP" -d "$FONT_DIR" || { - echo "Failed to unzip $FONT_ZIP" + printf "%b\n" "${RED}Failed to unzip $FONT_ZIP${RC}" return 1 } else - echo "Meslo font files already unzipped in $FONT_DIR, skipping unzip." + printf "%b\n" "${GREEN}Meslo font files already unzipped in $FONT_DIR, skipping unzip.${RC}" fi # Remove the zip file rm "$FONT_ZIP" || { - echo "Failed to remove $FONT_ZIP" + printf "%b\n" "${RED}Failed to remove $FONT_ZIP${RC}" return 1 } # Rebuild the font cache fc-cache -fv || { - echo "Failed to rebuild font cache" + printf "%b\n" "${RED}Failed to rebuild font cache${RC}" return 1 } - echo "Meslo Nerd-fonts installed successfully" + printf "%b\n" "${GREEN}Meslo Nerd-fonts installed successfully${RC}" } picom_animations() { @@ -94,33 +94,33 @@ picom_animations() { mkdir -p ~/build if [ ! -d ~/build/picom ]; then if ! git clone https://github.com/FT-Labs/picom.git ~/build/picom; then - echo "Failed to clone the repository" + printf "%b\n" "${RED}Failed to clone the repository${RC}" return 1 fi else - echo "Repository already exists, skipping clone" + printf "%b\n" "${GREEN}Repository already exists, skipping clone${RC}" fi - cd ~/build/picom || { echo "Failed to change directory to picom"; return 1; } + cd ~/build/picom || { printf "%b\n" "${RED}Failed to change directory to picom${RC}"; return 1; } # Build the project if ! meson setup --buildtype=release build; then - echo "Meson setup failed" + printf "%b\n" "${RED}Meson setup failed${RC}" return 1 fi if ! ninja -C build; then - echo "Ninja build failed" + printf "%b\n" "${RED}Ninja build failed${RC}" return 1 fi # Install the built binary if ! $ESCALATION_TOOL ninja -C build install; then - echo "Failed to install the built binary" + printf "%b\n" "${RED}Failed to install the built binary${RC}" return 1 fi - echo "Picom animations installed successfully" + printf "%b\n" "${GREEN}Picom animations installed successfully${RC}" } clone_config_folders() { @@ -135,45 +135,48 @@ clone_config_folders() { # Clone the directory to ~/.config/ if [ -d "$dir" ]; then cp -r "$dir" ~/.config/ - echo "Cloned $dir_name to ~/.config/" + printf "%b\n" "${GREEN}Cloned $dir_name to ~/.config/${RC}" else - echo "Directory $dir_name does not exist, skipping" + printf "%b\n" "${RED}Directory $dir_name does not exist, skipping${RC}" fi done } configure_backgrounds() { + # Set the variable PIC_DIR which stores the path for images + PIC_DIR="$HOME/Pictures" + # Set the variable BG_DIR to the path where backgrounds will be stored - BG_DIR="$HOME/Pictures/backgrounds" + BG_DIR="$PIC_DIR/backgrounds" # Check if the ~/Pictures directory exists - if [ ! -d "~/Pictures" ]; then + if [ ! -d "$PIC_DIR" ]; then # If it doesn't exist, print an error message and return with a status of 1 (indicating failure) - echo "Pictures directory does not exist" + printf "%b\n" "${RED}Pictures directory does not exist${RC}" mkdir ~/Pictures - echo "Directory was created in Home folder" + printf "%b\n" "${GREEN}Directory was created in Home folder${RC}" fi - + # Check if the backgrounds directory (BG_DIR) exists if [ ! -d "$BG_DIR" ]; then # If the backgrounds directory doesn't exist, attempt to clone a repository containing backgrounds - if ! git clone https://github.com/ChrisTitusTech/nord-background.git ~/Pictures; then + if ! git clone https://github.com/ChrisTitusTech/nord-background.git "$PIC_DIR/nord-background"; then # If the git clone command fails, print an error message and return with a status of 1 - echo "Failed to clone the repository" + printf "%b\n" "${RED}Failed to clone the repository${RC}" return 1 fi # Rename the cloned directory to 'backgrounds' - mv ~/Pictures/nord-background ~/Pictures/backgrounds + mv "$PIC_DIR/nord-background" "$PIC_DIR/backgrounds" # Print a success message indicating that the backgrounds have been downloaded - echo "Downloaded desktop backgrounds to $BG_DIR" + printf "%b\n" "${GREEN}Downloaded desktop backgrounds to $BG_DIR${RC}" else # If the backgrounds directory already exists, print a message indicating that the download is being skipped - echo "Path $BG_DIR exists for desktop backgrounds, skipping download of backgrounds" + printf "%b\n" "${GREEN}Path $BG_DIR exists for desktop backgrounds, skipping download of backgrounds${RC}" fi } setupDisplayManager() { - echo "Setting up Xorg" + printf "%b\n" "${YELLOW}Setting up Xorg${RC}" case "$PACKAGER" in pacman) $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm xorg-xinit xorg-server @@ -185,12 +188,12 @@ setupDisplayManager() { $ESCALATION_TOOL "$PACKAGER" install -y xorg-x11-xinit xorg-x11-server-Xorg ;; *) - echo "Unsupported package manager: $PACKAGER" + printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}" exit 1 ;; esac - echo "Xorg installed successfully" - echo "Setting up Display Manager" + printf "%b\n" "${GREEN}Xorg installed successfully${RC}" + printf "%b\n" "${YELLOW}Setting up Display Manager${RC}" currentdm="none" for dm in gdm sddm lightdm; do if systemctl is-active --quiet "$dm.service"; then @@ -198,10 +201,10 @@ setupDisplayManager() { break fi done - echo "Current display manager: $currentdm" + printf "%b\n" "${GREEN}Current display manager: $currentdm${RC}" if [ "$currentdm" = "none" ]; then DM="sddm" - echo "No display manager found, installing $DM" + printf "%b\n" "${YELLOW}No display manager found, installing $DM${RC}" case "$PACKAGER" in pacman) $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm "$DM" @@ -213,11 +216,11 @@ setupDisplayManager() { $ESCALATION_TOOL "$PACKAGER" install -y "$DM" ;; *) - echo "Unsupported package manager: $PACKAGER" + printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}" exit 1 ;; esac - echo "$DM installed successfully" + printf "%b\n" "${GREEN}$DM installed successfully${RC}" systemctl enable "$DM" # Prompt user for auto-login @@ -226,7 +229,7 @@ setupDisplayManager() { read -r answer case "$answer" in [Yy]*) - echo "Configuring SDDM for autologin" + printf "%b\n" "${YELLOW}Configuring SDDM for autologin${RC}" SDDM_CONF="/etc/sddm.conf" if [ ! -f "$SDDM_CONF" ]; then echo "[Autologin]" | $ESCALATION_TOOL tee -a "$SDDM_CONF" @@ -240,46 +243,43 @@ setupDisplayManager() { echo "User=$USER" | $ESCALATION_TOOL tee -a "$SDDM_CONF" echo "Session=dwm" | $ESCALATION_TOOL tee -a "$SDDM_CONF" fi - echo "Checking if autologin group exists" + printf "%b\n" "{YELLOW}Checking if autologin group exists${RC}" if ! getent group autologin > /dev/null; then - echo "Creating autologin group" + printf "%b\n" "${YELLOW}Creating autologin group${RC}" $ESCALATION_TOOL groupadd autologin else - echo "Autologin group already exists" + printf "%b\n" "${GREEN}Autologin group already exists${RC}" fi - echo "Adding user with UID 1000 to autologin group" + printf "%b\n" "${YELLOW}Adding user with UID 1000 to autologin group${RC}" USER_UID_1000=$(getent passwd 1000 | cut -d: -f1) if [ -n "$USER_UID_1000" ]; then $ESCALATION_TOOL usermod -aG autologin "$USER_UID_1000" - echo "User $USER_UID_1000 added to autologin group" + printf "%b\n" "${GREEN}User $USER_UID_1000 added to autologin group${RC}" else - echo "No user with UID 1000 found - Auto login not possible" + printf "%b\n" "${RED}No user with UID 1000 found - Auto login not possible${RC}" fi ;; *) - echo "Auto-login configuration skipped" + printf "%b\n" "${GREEN}Auto-login configuration skipped${RC}" ;; esac fi - - - } install_slstatus() { printf "Do you want to install slstatus? (y/N): " # using printf instead of 'echo' to avoid newline, -n flag for 'echo' is not supported in POSIX read -r response # -r flag to prevent backslashes from being interpreted if [ "$response" = "y" ] || [ "$response" = "Y" ]; then - echo "Installing slstatus" + printf "%b\n" "${YELLOW}Installing slstatus${RC}" cd "$HOME/dwm-titus/slstatus" || { echo "Failed to change directory to slstatus"; return 1; } if $ESCALATION_TOOL make clean install; then - echo "slstatus installed successfully" + printf "%b\n" "${GREEN}slstatus installed successfully${RC}" else - echo "Failed to install slstatus" + printf "%b\n" "${RED}Failed to install slstatus${RC}" return 1 fi else - echo "Skipping slstatus installation" + printf "%b\n" "${GREEN}Skipping slstatus installation${RC}" fi cd "$HOME" } @@ -292,4 +292,4 @@ makeDWM install_slstatus install_nerd_font clone_config_folders -configure_backgrounds +configure_backgrounds \ No newline at end of file diff --git a/tabs/applications-setup/fastfetch-setup.sh b/tabs/applications-setup/fastfetch-setup.sh index e3f9a4f72..60077f145 100644 --- a/tabs/applications-setup/fastfetch-setup.sh +++ b/tabs/applications-setup/fastfetch-setup.sh @@ -2,24 +2,24 @@ . ../common-script.sh -setupFastfetch() { - echo "Installing Fastfetch if not already installed..." +installFastfetch() { + printf "%b\n" "${YELLOW}Installing Fastfetch...${RC}" if ! command_exists fastfetch; then - case ${PACKAGER} in + case "$PACKAGER" in pacman) - $ESCALATION_TOOL "${PACKAGER}" -S --needed --noconfirm fastfetch + $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm fastfetch ;; *) - $ESCALATION_TOOL "${PACKAGER}" install -y fastfetch + $ESCALATION_TOOL "$PACKAGER" install -y fastfetch ;; esac else - echo "Fastfetch is already installed." + printf "%b\n" "${GREEN}Fastfetch is already installed.${RC}" fi } setupFastfetchConfig() { - echo "Copying Fastfetch config files..." + printf "%b\n" "${YELLOW}Copying Fastfetch config files...${RC}" if [ -d "${HOME}/.config/fastfetch" ] && [ ! -d "${HOME}/.config/fastfetch-bak" ]; then cp -r "${HOME}/.config/fastfetch" "${HOME}/.config/fastfetch-bak" fi @@ -29,5 +29,5 @@ setupFastfetchConfig() { checkEnv checkEscalationTool -setupFastfetch +installFastfetch setupFastfetchConfig \ No newline at end of file diff --git a/tabs/applications-setup/kitty-setup.sh b/tabs/applications-setup/kitty-setup.sh index 7afbbe5d8..480eed829 100755 --- a/tabs/applications-setup/kitty-setup.sh +++ b/tabs/applications-setup/kitty-setup.sh @@ -2,24 +2,24 @@ . ../common-script.sh -setupKitty() { - echo "Install Kitty if not already installed..." +installKitty() { + printf "%b\n" "${YELLOW}Install Kitty if not already installed...${RC}" if ! command_exists kitty; then - case ${PACKAGER} in + case "$PACKAGER" in pacman) - $ESCALATION_TOOL "${PACKAGER}" -S --needed --noconfirm kitty + $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm kitty ;; *) - $ESCALATION_TOOL "${PACKAGER}" install -y kitty + $ESCALATION_TOOL "$PACKAGER" install -y kitty ;; esac else - echo "Kitty is already installed." + printf "%b\n" "${GREEN}Kitty is already installed.${RC}" fi } setupKittyConfig() { - echo "Copy Kitty config files" + printf "%b\n" "${YELLOW}Copying Kitty configuration files...${RC}" if [ -d "${HOME}/.config/kitty" ] && [ ! -d "${HOME}/.config/kitty-bak" ]; then cp -r "${HOME}/.config/kitty" "${HOME}/.config/kitty-bak" fi @@ -30,5 +30,5 @@ setupKittyConfig() { checkEnv checkEscalationTool -setupKitty +installKitty setupKittyConfig \ No newline at end of file diff --git a/tabs/applications-setup/mybash-setup.sh b/tabs/applications-setup/mybash-setup.sh index 7bca14e2c..7449072aa 100644 --- a/tabs/applications-setup/mybash-setup.sh +++ b/tabs/applications-setup/mybash-setup.sh @@ -4,29 +4,20 @@ gitpath="$HOME/.local/share/mybash" -cloneMyBash() { - # Check if the dir exists before attempting to clone into it. - if [ -d "$gitpath" ]; then - rm -rf "$gitpath" - fi - mkdir -p "$HOME/.local/share" # Only create the dir if it doesn't exist. - cd "$HOME" && git clone https://github.com/ChrisTitusTech/mybash.git "$gitpath" -} - installDepend() { - echo "Install mybash if not already installed" + printf "%b\n" "${YELLOW}Installing Bash...${RC}" case "$PACKAGER" in pacman) - $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm bash bash-completion tar bat tree unzip fontconfig + $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm bash bash-completion tar bat tree unzip fontconfig git ;; apt) - $ESCALATION_TOOL "$PACKAGER" install -y bash bash-completion tar bat tree unzip fontconfig + $ESCALATION_TOOL "$PACKAGER" install -y bash bash-completion tar bat tree unzip fontconfig git ;; dnf) - $ESCALATION_TOOL "$PACKAGER" install -y bash bash-completion tar bat tree unzip fontconfig + $ESCALATION_TOOL "$PACKAGER" install -y bash bash-completion tar bat tree unzip fontconfig git ;; zypper) - $ESCALATION_TOOL "$PACKAGER" install -y bash bash-completion tar bat tree unzip fontconfig + $ESCALATION_TOOL "$PACKAGER" install -y bash bash-completion tar bat tree unzip fontconfig git ;; *) printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}" # The packages above were grabbed out of the original mybash-setup-script. @@ -35,13 +26,22 @@ installDepend() { esac } +cloneMyBash() { + # Check if the dir exists before attempting to clone into it. + if [ -d "$gitpath" ]; then + rm -rf "$gitpath" + fi + mkdir -p "$HOME/.local/share" # Only create the dir if it doesn't exist. + cd "$HOME" && git clone https://github.com/ChrisTitusTech/mybash.git "$gitpath" +} + installFont() { # Check to see if the MesloLGS Nerd Font is installed (Change this to whatever font you would like) FONT_NAME="MesloLGS Nerd Font Mono" if fc-list :family | grep -iq "$FONT_NAME"; then - echo "Font '$FONT_NAME' is installed." + printf "%b\n" "${GREEN}Font '$FONT_NAME' is installed.${RC}" else - echo "Installing font '$FONT_NAME'" + printf "%b\n" "${YELLOW}Installing font '$FONT_NAME'${RC}" # Change this URL to correspond with the correct font FONT_URL="https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip" FONT_DIR="$HOME/.local/share/fonts" @@ -52,13 +52,13 @@ installFont() { mv "${TEMP_DIR}"/*.ttf "$FONT_DIR"/"$FONT_NAME" fc-cache -fv rm -rf "${TEMP_DIR}" - echo "'$FONT_NAME' installed successfully." + printf "%b\n" "${GREEN}'$FONT_NAME' installed successfully.${RC}" fi } installStarshipAndFzf() { if command_exists starship; then - echo "Starship already installed" + printf "%b\n" "${GREEN}Starship already installed${RC}" return fi @@ -67,7 +67,7 @@ installStarshipAndFzf() { exit 1 fi if command_exists fzf; then - echo "Fzf already installed" + printf "%b\n" "${GREEN}Fzf already installed${RC}" else git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf $ESCALATION_TOOL ~/.fzf/install @@ -76,7 +76,7 @@ installStarshipAndFzf() { installZoxide() { if command_exists zoxide; then - echo "Zoxide already installed" + printf "%b\n" "${GREEN}Zoxide already installed${RC}" return fi @@ -110,8 +110,8 @@ linkConfig() { checkEnv checkEscalationTool -cloneMyBash installDepend +cloneMyBash installFont installStarshipAndFzf installZoxide diff --git a/tabs/applications-setup/neovim-setup.sh b/tabs/applications-setup/neovim-setup.sh index 0d3a2578d..36d43c881 100755 --- a/tabs/applications-setup/neovim-setup.sh +++ b/tabs/applications-setup/neovim-setup.sh @@ -13,20 +13,20 @@ cloneNeovim() { cd "$HOME" && git clone https://github.com/ChrisTitusTech/neovim.git "$HOME/.local/share/neovim" } -setupNeovim() { - echo "Install Neovim if not already installed" +installNeovim() { + printf "%b\n" "${YELLOW}Installing Neovim...${RC}" case "$PACKAGER" in pacman) - $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm neovim ripgrep fzf python-virtualenv luarocks go shellcheck + $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm neovim ripgrep fzf python-virtualenv luarocks go shellcheck git ;; apt) - $ESCALATION_TOOL "$PACKAGER" install -y neovim ripgrep fd-find python3-venv luarocks golang-go shellcheck + $ESCALATION_TOOL "$PACKAGER" install -y neovim ripgrep fd-find python3-venv luarocks golang-go shellcheck git ;; dnf) - $ESCALATION_TOOL "$PACKAGER" install -y neovim ripgrep fzf python3-virtualenv luarocks golang ShellCheck + $ESCALATION_TOOL "$PACKAGER" install -y neovim ripgrep fzf python3-virtualenv luarocks golang ShellCheck git ;; zypper) - $ESCALATION_TOOL "$PACKAGER" install -y neovim ripgrep fzf python3-virtualenv luarocks golang ShellCheck + $ESCALATION_TOOL "$PACKAGER" install -y neovim ripgrep fzf python3-virtualenv luarocks golang ShellCheck git ;; *) printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}" # The packages above were grabbed out of the original nvim-setup-script. @@ -36,6 +36,7 @@ setupNeovim() { } backupNeovimConfig() { + printf "%b\n" "${YELLOW}Backing up existing configuration files...${RC}" if [ -d "$HOME/.config/nvim" ] && [ ! -d "$HOME/.config/nvim-backup" ]; then cp -r "$HOME/.config/nvim" "$HOME/.config/nvim-backup" fi @@ -43,13 +44,14 @@ backupNeovimConfig() { } linkNeovimConfig() { + printf "%b\n" "${YELLOW}Linking Neovim configuration files...${RC}" mkdir -p "$HOME/.config/nvim" ln -s "$gitpath/titus-kickstart/"* "$HOME/.config/nvim/" # Wild card is used here to link all contents of titus-kickstart. } checkEnv checkEscalationTool +installNeovim cloneNeovim -setupNeovim backupNeovimConfig linkNeovimConfig \ No newline at end of file diff --git a/tabs/applications-setup/rofi-setup.sh b/tabs/applications-setup/rofi-setup.sh index c58745170..cd5c644af 100755 --- a/tabs/applications-setup/rofi-setup.sh +++ b/tabs/applications-setup/rofi-setup.sh @@ -2,8 +2,8 @@ . ../common-script.sh -setupRofi() { - echo "Install Rofi if not already installed..." +installRofi() { + printf "%b\n" "${YELLOW}Installing Rofi...${RC}" if ! command_exists rofi; then case "$PACKAGER" in pacman) @@ -14,12 +14,12 @@ setupRofi() { ;; esac else - echo "Rofi is already installed." + printf "%b\n" "${GREEN}Rofi is already installed.${RC}" fi } setupRofiConfig() { - echo "Copy Rofi config files" + printf "%b\n" "${YELLOW}Copying Rofi configuration files...${RC}" if [ -d "$HOME/.config/rofi" ] && [ ! -d "$HOME/.config/rofi-bak" ]; then cp -r "$HOME/.config/rofi" "$HOME/.config/rofi-bak" fi @@ -35,5 +35,5 @@ setupRofiConfig() { checkEnv checkEscalationTool -setupRofi +installRofi setupRofiConfig diff --git a/tabs/applications-setup/zsh-setup.sh b/tabs/applications-setup/zsh-setup.sh index eaa608b5f..626099db9 100644 --- a/tabs/applications-setup/zsh-setup.sh +++ b/tabs/applications-setup/zsh-setup.sh @@ -3,24 +3,25 @@ . ../common-script.sh # Function to install zsh -install_zsh() { - echo "Install ZSH if not already installed..." - if ! command_exists zsh; then - case "$PACKAGER" in - pacman) - $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm zsh - ;; - *) - $ESCALATION_TOOL "$PACKAGER" install -y zsh - ;; - esac - else - echo "ZSH is already installed." - fi +installZsh() { + printf "%b\n" "${YELLOW}Installing Zsh...${RC}" + if ! command_exists zsh; then + case "$PACKAGER" in + pacman) + $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm zsh + ;; + *) + $ESCALATION_TOOL "$PACKAGER" install -y zsh + ;; + esac + else + printf "%b\n" "${GREEN}ZSH is already installed.${RC}" + fi } # Function to setup zsh configuration -setup_zsh_config() { +setupZshConfig() { + echo "Setting up Zsh configuration..." CONFIG_DIR="$HOME/.config/zsh" ZSHRC_FILE="$CONFIG_DIR/.zshrc" @@ -48,5 +49,5 @@ EOL checkEnv checkEscalationTool -install_zsh -setup_zsh_config +installZsh +setupZshConfig diff --git a/tabs/common-script.sh b/tabs/common-script.sh index aa4deae95..6bcab74da 100644 --- a/tabs/common-script.sh +++ b/tabs/common-script.sh @@ -5,6 +5,7 @@ RC='\033[0m' RED='\033[31m' YELLOW='\033[33m' +CYAN='\033[36m' GREEN='\033[32m' command_exists() { @@ -27,8 +28,8 @@ checkAURHelper() { echo "Installing yay as AUR helper..." $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm base-devel - cd /opt && $ESCALATION_TOOL git clone https://aur.archlinux.org/yay-git.git && $ESCALATION_TOOL chown -R "$USER":"$USER" ./yay-git - cd yay-git && makepkg --noconfirm -si + cd /opt && $ESCALATION_TOOL git clone https://aur.archlinux.org/yay-bin.git && $ESCALATION_TOOL chown -R "$USER":"$USER" ./yay-bin + cd yay-bin && makepkg --noconfirm -si if command_exists yay; then AUR_HELPER="yay" @@ -81,7 +82,7 @@ checkPackageManager() { fi done - if [ -z "${PACKAGER}" ]; then + if [ -z "$PACKAGER" ]; then printf "%b\n" "${RED}Can't find a supported package manager${RC}" exit 1 fi @@ -125,7 +126,7 @@ checkDistro() { checkEnv() { checkCommandRequirements 'curl groups sudo' - checkPackageManager 'apt-get nala dnf pacman zypper yum xbps-install nix-env' + checkPackageManager 'nala apt-get dnf pacman zypper yum xbps-install nix-env' checkCurrentDirectoryWritable checkSuperUser checkDistro diff --git a/tabs/gaming/diablo-ii/d2r-loot-filters.sh b/tabs/gaming/diablo-ii/d2r-loot-filters.sh index 1fa43fabd..a7cd7694a 100755 --- a/tabs/gaming/diablo-ii/d2r-loot-filters.sh +++ b/tabs/gaming/diablo-ii/d2r-loot-filters.sh @@ -1,11 +1,11 @@ #!/bin/bash # Search for possible Diablo II Resurrected folder locations -echo "Searching for Diablo II Resurrected folders..." +printf "%b\n" "${YELLOW}Searching for Diablo II Resurrected folders...${RC}" possible_paths=$(find $HOME -type d -path "*/drive_c/Program Files (x86)/Diablo II Resurrected" 2>/dev/null) if [ -z "$possible_paths" ]; then - echo "Error: No Diablo II Resurrected folders found." + printf "%b\n" "${RED}Error: No Diablo II Resurrected folders found.${RC}" exit 1 fi @@ -23,7 +23,7 @@ print_menu() { if ((start + max_display > total)); then start=$((total - max_display)); fi if ((start < 0)); then start=0; fi - echo "Please select the Diablo II: Resurrected installation path:" + printf "%b\n" "${YELLOW}Please select the Diablo II: Resurrected installation path:${RC}" for i in $(seq 0 $((max_display - 1))); do if ((i + start >= total)); then break; fi if [ $((i + start)) -eq $selected ]; then @@ -84,17 +84,17 @@ mods_path="$d2r_path/mods" mkdir -p "$mods_path" # Download the latest release -echo "Downloading the latest loot filter..." +printf "%b\n" "${YELLOW}Downloading the latest loot filter...${RC}" curl -sSLo /tmp/lootfilter.zip https://github.com/ChrisTitusTech/d2r-loot-filter/releases/latest/download/lootfilter.zip # Extract the contents to the mods folder -echo "Extracting loot filter to $mods_path..." +printf "%b\n" "${YELLOW}Extracting loot filter to $mods_path...${RC}" unzip -q -o /tmp/lootfilter.zip -d "$mods_path" # Clean up rm /tmp/lootfilter.zip -echo "Loot filter installed successfully in $mods_path" +printf "%b\n" "${GREEN}Loot filter installed successfully in $mods_path${RC}" # Add instructions for setting launch options echo diff --git a/tabs/security/firewall-baselines.sh b/tabs/security/firewall-baselines.sh index 5abb0c766..8ce390486 100644 --- a/tabs/security/firewall-baselines.sh +++ b/tabs/security/firewall-baselines.sh @@ -3,14 +3,14 @@ . ../common-script.sh installPkg() { - echo "Install UFW if not already installed..." + echo "Installing UFW..." if ! command_exists ufw; then - case ${PACKAGER} in + case "$PACKAGER" in pacman) - $ESCALATION_TOOL "${PACKAGER}" -S --needed --noconfirm ufw + $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm ufw ;; *) - $ESCALATION_TOOL "${PACKAGER}" install -y ufw + $ESCALATION_TOOL "$PACKAGER" install -y ufw ;; esac else @@ -19,24 +19,24 @@ installPkg() { } configureUFW() { - printf "%b\n" "${GREEN}Using Chris Titus Recommended Firewall Rules${RC}" + printf "%b\n" "${YELLOW}Using Chris Titus Recommended Firewall Rules${RC}" - echo "Disabling UFW" + printf "%b\n" "${YELLOW}Disabling UFW${RC}" $ESCALATION_TOOL ufw disable - echo "Limiting port 22/tcp (UFW)" + printf "%b\n" "${YELLOW}Limiting port 22/tcp (UFW)${RC}" $ESCALATION_TOOL ufw limit 22/tcp - echo "Allowing port 80/tcp (UFW)" + printf "%b\n" "${YELLOW}Allowing port 80/tcp (UFW)${RC}" $ESCALATION_TOOL ufw allow 80/tcp - echo "Allowing port 443/tcp (UFW)" + printf "%b\n" "${YELLO}Allowing port 443/tcp (UFW)${RC}" $ESCALATION_TOOL ufw allow 443/tcp - echo "Denying Incoming Packets by Default(UFW)" + printf "%b\n" "${YELLOW}Denying Incoming Packets by Default(UFW)${RC}" $ESCALATION_TOOL ufw default deny incoming - echo "Allowing Outcoming Packets by Default(UFW)" + printf "%b\n" "${YELLOW}Allowing Outcoming Packets by Default(UFW)${RC}" $ESCALATION_TOOL ufw default allow outgoing $ESCALATION_TOOL ufw enable diff --git a/tabs/system-setup/1-compile-setup.sh b/tabs/system-setup/1-compile-setup.sh index a9d21890d..7f1b3f733 100755 --- a/tabs/system-setup/1-compile-setup.sh +++ b/tabs/system-setup/1-compile-setup.sh @@ -6,14 +6,14 @@ installDepend() { ## Check for dependencies. DEPENDENCIES='tar tree multitail tldr trash-cli unzip cmake make jq' printf "%b\n" "${YELLOW}Installing dependencies...${RC}" - case $PACKAGER in + case "$PACKAGER" in pacman) if ! grep -q "^\s*\[multilib\]" /etc/pacman.conf; then echo "[multilib]" | $ESCALATION_TOOL tee -a /etc/pacman.conf echo "Include = /etc/pacman.d/mirrorlist" | $ESCALATION_TOOL tee -a /etc/pacman.conf $ESCALATION_TOOL "$PACKAGER" -Syu else - echo "Multilib is already enabled." + printf "%b\n" "${GREEN}Multilib is already enabled.${RC}" fi $AUR_HELPER -S --needed --noconfirm "$DEPENDENCIES" ;; diff --git a/tabs/system-setup/3-global-theme.sh b/tabs/system-setup/3-global-theme.sh index c3e360da5..141d0dd22 100644 --- a/tabs/system-setup/3-global-theme.sh +++ b/tabs/system-setup/3-global-theme.sh @@ -4,21 +4,21 @@ install_theme_tools() { printf "%b\n" "${YELLOW}Installing theme tools (qt6ct and kvantum)...${RC}\n" - case $PACKAGER in - apt-get) - $ESCALATION_TOOL apt-get update - $ESCALATION_TOOL apt-get install -y qt6ct kvantum + case "$PACKAGER" in + apt-get|nala) + $ESCALATION_TOOL "$PACKAGER" update + $ESCALATION_TOOL "$PACKAGER" install -y qt6ct kvantum ;; zypper) - $ESCALATION_TOOL zypper refresh - $ESCALATION_TOOL zypper --non-interactive install qt6ct kvantum + $ESCALATION_TOOL "$PACKAGER" refresh + $ESCALATION_TOOL "$PACKAGER" --non-interactive install qt6ct kvantum ;; dnf) - $ESCALATION_TOOL dnf update - $ESCALATION_TOOL dnf install -y qt6ct kvantum + $ESCALATION_TOOL "$PACKAGER" update + $ESCALATION_TOOL "$PACKAGER" install -y qt6ct kvantum ;; pacman) - $ESCALATION_TOOL pacman -S --needed --noconfirm qt6ct kvantum + $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm qt6ct kvantum ;; *) printf "%b\n" "${RED}Unsupported package manager. Please install qt6ct and kvantum manually.${RC}\n" diff --git a/tabs/system-setup/4-remove-snaps.sh b/tabs/system-setup/4-remove-snaps.sh index f804aa5b8..2cba860bb 100644 --- a/tabs/system-setup/4-remove-snaps.sh +++ b/tabs/system-setup/4-remove-snaps.sh @@ -3,24 +3,24 @@ . ../common-script.sh removeSnaps() { - case $PACKAGER in + case "$PACKAGER" in pacman) - $ESCALATION_TOOL ${PACKAGER} -Rns snapd + $ESCALATION_TOOL "$PACKAGER" -Rns snapd ;; apt-get|nala) - $ESCALATION_TOOL ${PACKAGER} autoremove --purge snapd + $ESCALATION_TOOL "$PACKAGER" autoremove --purge snapd if [ "$ID" = ubuntu ]; then $ESCALATION_TOOL apt-mark hold snapd fi ;; dnf) - $ESCALATION_TOOL ${PACKAGER} remove snapd + $ESCALATION_TOOL "$PACKAGER" remove snapd ;; zypper) - $ESCALATION_TOOL ${PACKAGER} remove snapd + $ESCALATION_TOOL "$PACKAGER" remove snapd ;; *) - echo "Removing snapd not implemented for this package manager" + printf "%b\n" "${RED}Removing snapd not implemented for this package manager${RC}" ;; esac } diff --git a/tabs/system-setup/5-samba-ssh-setup.sh b/tabs/system-setup/5-samba-ssh-setup.sh new file mode 100755 index 000000000..ddd43c994 --- /dev/null +++ b/tabs/system-setup/5-samba-ssh-setup.sh @@ -0,0 +1,205 @@ +#!/bin/sh -e + +# Load common script functions +. ../common-script.sh + +# Function to install packages based on the package manager +install_package() { + PACKAGE=$1 + if ! command_exists "$PACKAGE"; then + case "$PACKAGER" in + pacman) + $ESCALATION_TOOL "$PACKAGER" -S --noconfirm "$PACKAGE" + ;; + *) + $ESCALATION_TOOL "$PACKAGER" install -y "$PACKAGE" + ;; + esac + else + echo "$PACKAGE is already installed." + fi +} + +# Function to setup and configure SSH +setup_ssh() { + printf "%b\n" "${YELLOW}Setting up SSH...${RC}" + + # Detect package manager and install appropriate SSH package + case "$PACKAGER" in + "apt-get") + install_package openssh-server + SSH_SERVICE="ssh" + ;; + "pacman") + install_package openssh + SSH_SERVICE="sshd" + ;; + *) + install_package openssh-server + SSH_SERVICE="sshd" + ;; + esac + + # Enable and start the appropriate SSH service + $ESCALATION_TOOL systemctl enable "$SSH_SERVICE" + $ESCALATION_TOOL systemctl start "$SSH_SERVICE" + + # Get the local IP address + LOCAL_IP=$(ip -4 addr show | awk '/inet / {print $2}' | tail -n 1) + + printf "%b\n" "${GREEN}Your local IP address is: $LOCAL_IP${RC}" + + # Check if SSH is running + if systemctl is-active --quiet "$SSH_SERVICE"; then + printf "%b\n" "${GREEN}SSH is up and running.${RC}" + else + printf "%b\n" "${RED}Failed to start SSH.${RC}" + fi +} + +# Function to setup and configure Samba +setup_samba() { + printf "%b\n" "${YELLOW}Setting up Samba...${RC}" + + # Install Samba if not installed + install_package samba + + SAMBA_CONFIG="/etc/samba/smb.conf" + + if [ -f "$SAMBA_CONFIG" ]; then + printf "%b\n" "${YELLOW}Samba configuration file already exists in $SAMBA_CONFIG.${RC}" + printf "Do you want to modify the existing Samba configuration? (yes/no): " + read -r MODIFY_SAMBA + if [ "$MODIFY_SAMBA" = "yes" ]; then + "$ESCALATION_TOOL" "$EDITOR" "$SAMBA_CONFIG" + fi + else + printf "%b\n" "${YELLOW}No existing Samba configuration found. Setting up a new one...${RC}" + + # Prompt user for shared directory path + printf "Enter the path for the Samba share (default: /srv/samba/share): " + read -r SHARED_DIR + SHARED_DIR=${SHARED_DIR:-/srv/samba/share} + + # Create the shared directory if it doesn't exist + $ESCALATION_TOOL mkdir -p "$SHARED_DIR" + $ESCALATION_TOOL chmod -R 0777 "$SHARED_DIR" + + # Add a new Samba user + echo "Enter Samba username: " + read -r SAMBA_USER + + # Loop until the passwords match + while true; do + echo "Enter Samba password: " + stty -echo + read -r SAMBA_PASSWORD + stty echo + echo "Confirm Samba password: " + stty -echo + read SAMBA_PASSWORD_CONFIRM + stty echo + echo "" + if [ "$SAMBA_PASSWORD" = "$SAMBA_PASSWORD_CONFIRM" ]; then + printf "%b\n" "${GREEN}Passwords match.${RC}" + break + else + printf "%b\n" "${RED}Passwords do not match. Please try again.${RC}" + fi + done + + # Add the user and set the password + $ESCALATION_TOOL smbpasswd -a "$SAMBA_USER" + + # Configure Samba settings + $ESCALATION_TOOL sh -c "cat > $SAMBA_CONFIG" < /etc/lightdm/lightdm.conf.d/50-autologin.conf" + $ESCALATION_TOOL "echo 'autologin-user=$user' >> /etc/lightdm/lightdm.conf.d/50-autologin.conf" + $ESCALATION_TOOL "echo 'autologin-user-timeout=0' >> /etc/lightdm/lightdm.conf.d/50-autologin.conf" + + echo "LightDM has been configured for autologin." +} + +# Function to remove LightDM autologin +remove_lightdm_autologin() { + echo "Removing LightDM autologin configuration..." + $ESCALATION_TOOL rm -f /etc/lightdm/lightdm.conf.d/50-autologin.conf + echo "LightDM autologin configuration has been removed." +} + +# Function to configure GDM +configure_gdm() { + echo "Configuring GDM for autologin..." + + echo "Enter username for GDM autologin: " + read -r user + + $ESCALATION_TOOL "echo '[daemon]' > /etc/gdm/custom.conf" + $ESCALATION_TOOL "echo 'AutomaticLoginEnable = true' >> /etc/gdm/custom.conf" + $ESCALATION_TOOL "echo 'AutomaticLogin = $user' >> /etc/gdm/custom.conf" + + echo "GDM has been configured for autologin." +} + +# Function to remove GDM autologin +remove_gdm_autologin() { + echo "Removing GDM autologin configuration..." + $ESCALATION_TOOL sed -i '/AutomaticLoginEnable/d' /etc/gdm/custom.conf + $ESCALATION_TOOL sed -i '/AutomaticLogin/d' /etc/gdm/custom.conf + echo "GDM autologin configuration has been removed." +} + +# Function to configure SDDM +configure_sddm() { + echo "Configuring SDDM for autologin..." + + echo "Enter username for SDDM autologin: " + read -r user + list_sessions # Show session options + + $ESCALATION_TOOL "echo '[Autologin]' > /etc/sddm.conf" + $ESCALATION_TOOL "echo 'User=$user' >> /etc/sddm.conf" + $ESCALATION_TOOL "echo 'Session=$session' >> /etc/sddm.conf" + + echo "SDDM has been configured for autologin." +} + +# Function to remove SDDM autologin +remove_sddm_autologin() { + echo "Removing SDDM autologin configuration..." + $ESCALATION_TOOL sed -i '/\[Autologin\]/,+2d' /etc/sddm.conf + echo "SDDM autologin configuration has been removed." +} + +# Function to configure LXDM +configure_lxdm() { + echo "Configuring LXDM for autologin..." + + echo "Enter username for LXDM autologin: " + read -r user + list_sessions # Show session options + + $ESCALATION_TOOL sed -i "s/^#.*autologin=.*$/autologin=${user}/" /etc/lxdm/lxdm.conf + $ESCALATION_TOOL sed -i "s|^#.*session=.*$|session=/usr/bin/${session}|; s|^session=.*$|session=/usr/bin/${session}|" /etc/lxdm/lxdm.conf + + echo "LXDM has been configured for autologin." +} + +# Function to remove LXDM autologin +remove_lxdm_autologin() { + echo "Removing LXDM autologin configuration..." + $ESCALATION_TOOL sed -i "s/^autologin=.*$/#autologin=/" /etc/lxdm/lxdm.conf + $ESCALATION_TOOL sed -i "s/^session=.*$/#session=/" /etc/lxdm/lxdm.conf + echo "LXDM autologin configuration has been removed." +} + +# Function to configure or remove autologin based on user choice +configure_or_remove_autologin() { + echo "Do you want to add or remove autologin?" + echo "1) Add autologin" + echo "2) Remove autologin" + echo "Enter your choice [1-2]: " + read action_choice + + if [ "$action_choice" = "1" ]; then + echo "Choose the display manager to configure:" + echo "1) LightDM" + echo "2) GDM" + echo "3) SDDM" + echo "4) LXDM" + echo "Enter your choice [1-4]: " + read choice + + case "$choice" in + 1) configure_lightdm ;; + 2) configure_gdm ;; + 3) configure_sddm ;; + 4) configure_lxdm ;; + *) echo "Invalid option selected." ;; + esac + elif [ "$action_choice" = "2" ]; then + echo "Choose the display manager to remove autologin:" + echo "1) LightDM" + echo "2) GDM" + echo "3) SDDM" + echo "4) LXDM" + echo "Enter your choice [1-4]: " + read choice + + case "$choice" in + 1) remove_lightdm_autologin ;; + 2) remove_gdm_autologin ;; + 3) remove_sddm_autologin ;; + 4) remove_lxdm_autologin ;; + *) echo "Invalid option selected." ;; + esac + else + echo "Invalid choice. Exiting..." + exit 1 + fi + + echo "Action completed. Exiting..." + exit 0 +} + + +checkEnv +checkEscalationTool +configure_or_remove_autologin diff --git a/tabs/utils/bluetooth-control.sh b/tabs/utils/bluetooth-control.sh index 508d3708a..36c1d35c8 100644 --- a/tabs/utils/bluetooth-control.sh +++ b/tabs/utils/bluetooth-control.sh @@ -6,12 +6,12 @@ setupBluetooth() { printf "%b\n" "${YELLOW}Installing Bluez...${RC}" if ! command_exists bluetoothctl; then - case ${PACKAGER} in + case "$PACKAGER" in pacman) - $ESCALATION_TOOL "${PACKAGER}" -S --noconfirm bluez-utils + $ESCALATION_TOOL "$PACKAGER" -S --noconfirm bluez-utils ;; *) - $ESCALATION_TOOL "${PACKAGER}" install -y bluez + $ESCALATION_TOOL "$PACKAGER" install -y bluez ;; esac else @@ -68,8 +68,8 @@ scan_devices() { printf "%b\n" "${GREEN}Devices found:${RC}" echo "$devices" fi - echo "Press any key to return to the main menu..." - read -n 1 + printf "Press any key to return to the main menu..." + read -r dummy } # Function to prompt for MAC address using numbers @@ -85,8 +85,8 @@ prompt_for_mac() { devices=$(bluetoothctl devices) if [ -z "$devices" ]; then printf "%b\n" "${RED}No devices available. Please scan for devices first.${RC}" - echo "Press any key to return to the main menu..." - read -n 1 + printf "Press any key to return to the main menu..." + read -r dummy return fi @@ -121,8 +121,8 @@ prompt_for_mac() { printf "%b\n" "${RED}Invalid choice. Please try again.${RC}" fi done - echo "Press any key to return to the main menu..." - read -n 1 + printf "Press any key to return to the main menu..." + read -r dummy } # Function to pair with a device @@ -147,5 +147,6 @@ remove_device() { # Initialize checkEnv +checkEscalationTool setupBluetooth main_menu diff --git a/tabs/utils/create-bootable-usb.sh b/tabs/utils/create-bootable-usb.sh new file mode 100644 index 000000000..6feae2dac --- /dev/null +++ b/tabs/utils/create-bootable-usb.sh @@ -0,0 +1,193 @@ +#!/bin/sh -e + +. ../common-script.sh + +# Function to display usage instructions +usage() { + printf "%b\n" "${RED} Usage: $0 ${RC}" + echo "No arguments needed. The script will prompt for ISO path and USB device." + exit 1 +} + +# Function to display all available block devices +list_devices() { + printf "%b\n" "${YELLOW} Available devices and partitions: ${RC}" + echo "" + $ESCALATION_TOOL lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL + echo "" +} + +# Function to fetch the latest Arch Linux ISO +fetch_arch_latest_iso() { + ARCH_BASE_URL="https://archive.archlinux.org/iso/" + ARCH_LATEST=$(curl -s "$ARCH_BASE_URL" | grep -oP '(?<=href=")[0-9]{4}\.[0-9]{2}\.[0-9]{2}(?=/)' | sort -V | tail -1) + ARCH_URL="${ARCH_BASE_URL}${ARCH_LATEST}/archlinux-${ARCH_LATEST}-x86_64.iso" + printf "%b\n" "${GREEN} Selected Arch Linux (latest) ISO URL: ${RC} $ARCH_URL" +} + +# Function to fetch older Arch Linux ISOs and display in a table format +fetch_arch_older_isos() { + ARCH_BASE_URL="https://archive.archlinux.org/iso/" + ARCH_VERSIONS=$(curl -s "$ARCH_BASE_URL" | grep -oP '(?<=href=")[0-9]{4}\.[0-9]{2}\.[0-9]{2}(?=/)' | sort -V) + + # Filter versions to include only those from 2017-04-01 and later + MIN_DATE="2017.04.01" + ARCH_VERSIONS=$(echo "$ARCH_VERSIONS" | awk -v min_date="$MIN_DATE" '$0 >= min_date') + + if [ -z "$ARCH_VERSIONS" ]; then + printf "%b\n" "${RED}No Arch Linux versions found from ${MIN_DATE} onwards.${RC}" + exit 1 + fi + + printf "%b\n" "${YELLOW}Available Arch Linux versions from ${MIN_DATE} onwards:${RC}" + + COUNTER=1 + ROW_ITEMS=6 # Number of versions to show per row + for VERSION in $ARCH_VERSIONS; do + printf "%-5s${YELLOW}%-15s ${RC}" "$COUNTER)" "$VERSION" + + if [ $(( COUNTER % ROW_ITEMS )) -eq 0 ]; then + echo "" # New line after every 6 versions + fi + + COUNTER=$((COUNTER + 1)) + done + printf "\n" # New line after the last row + printf "Select an Arch Linux version (1-%d): " "$((COUNTER - 1))" + read -r ARCH_OPTION + ARCH_DIR=$(echo "$ARCH_VERSIONS" | sed -n "${ARCH_OPTION}p") + ARCH_URL="${ARCH_BASE_URL}${ARCH_DIR}/archlinux-${ARCH_DIR}-x86_64.iso" + printf "%b\n" "${GREEN}Selected Arch Linux (older) ISO URL: $ARCH_URL${RC}" +} + + +# Function to fetch the latest Debian Linux ISO +fetch_debian_latest_iso() { + DEBIAN_URL=$(curl -s https://www.debian.org/distrib/netinst | grep -oP '(?<=href=")[^"]+debian-[0-9.]+-amd64-netinst.iso(?=")' | head -1) + printf "%b\n" "${GREEN} Selected Debian Linux (latest) ISO URL: ${RC} $DEBIAN_URL" +} + +# Function to ask whether to use local or online ISO +choose_iso_source() { + printf "%b\n" "${YELLOW} Do you want to use a local ISO or download online? ${RC}" + printf "1) Download online\n" + printf "2) Use local ISO\n" + printf "\n" + printf "Select option (1-2): " + read -r ISO_SOURCE_OPTION + + case $ISO_SOURCE_OPTION in + 1) + fetch_iso_urls # Call the function to fetch online ISO URLs + ;; + 2) + printf "Enter the path to the already downloaded ISO file: " + read -r ISO_PATH + if [ ! -f "$ISO_PATH" ]; then + printf "%b\n" "${RED} ISO file not found: $ISO_PATH ${RC}" + exit 1 + fi + ;; + *) + printf "%b\n" "${RED}Invalid option selected. ${RC}" + exit 1 + ;; + esac +} + +# Function to fetch ISO URLs +fetch_iso_urls() { + clear + printf "%b\n" "${YELLOW}Available ISOs for download:${RC}" + echo "1) Arch Linux (latest)" + echo "2) Arch Linux (older versions)" + echo "3) Debian Linux (latest)" + echo "" + read -p "Select the ISO you want to download (1-3): " ISO_OPTION + + case $ISO_OPTION in + 1) + fetch_arch_latest_iso + ISO_URL=$ARCH_URL + ;; + 2) + fetch_arch_older_isos + ISO_URL=$ARCH_URL + ;; + 3) + fetch_debian_latest_iso + ISO_URL=$DEBIAN_URL + ;; + *) + printf "%b\n" "${RED}Invalid option selected.${RC}" + exit 1 + ;; + esac + + ISO_PATH=$(basename "$ISO_URL") + printf "%b\n" "${YELLOW}Downloading ISO...${RC}" + curl -L -o "$ISO_PATH" "$ISO_URL" + if [ $? -ne 0 ]; then + printf "%b\n" "${RED}Failed to download the ISO file.${RC}" + exit 1 + fi +} + +write_iso(){ + clear + + # Ask whether to use a local or online ISO + choose_iso_source + + clear + # Display all available devices + list_devices + + # Prompt user for USB device + read -p "Enter the USB device (e.g., /dev/sdX): " USB_DEVICE + + # Verify that the USB device exists + if [ ! -b "$USB_DEVICE" ]; then + printf "%b\n" "${RED}USB device not found: $USB_DEVICE${RC}" + exit 1 + fi + + # Confirm the device selection with the user + printf "%b\n" "${RED}WARNING: This will erase all data on ${USB_DEVICE}. Are you sure you want to continue? (yes/no)${RC}" + read -r CONFIRMATION + + if [ "$CONFIRMATION" != "yes" ]; then + printf "%b\n" "${YELLOW}Operation cancelled.${RC}" + exit 1 + fi + + # Display progress and create the bootable USB drive + printf "%b\n" "${YELLOW}Creating bootable USB drive...${RC}" + if ! $ESCALATION_TOOL dd if="$ISO_PATH" of="$USB_DEVICE" bs=4M status=progress oflag=sync; then + printf "%b\n" "${RED}Failed to create bootable USB drive${RC}" + exit 1 + fi + + # Sync to ensure all data is written + if ! $ESCALATION_TOOL sync; then + printf "%b\n" "${RED}Failed to sync data${RC}" + exit 1 + fi + + printf "%b\n" "${GREEN}Bootable USB drive created successfully!${RC}" + + # Eject the USB device + printf "%b\n" "${YELLOW}Ejecting ${USB_DEVICE}...${RC}" + if ! $ESCALATION_TOOL umount "${USB_DEVICE}"* 2>/dev/null; then + printf "%b\n" "${RED}Failed to unmount ${USB_DEVICE}${RC}" + fi + if ! $ESCALATION_TOOL eject "$USB_DEVICE"; then + printf "%b\n" "${RED}Failed to eject ${USB_DEVICE}${RC}" + fi + + printf "%b\n" "${GREEN}You can safely remove your USB drive. Reinsert the drive to be detected.${RC}" +} + +checkEnv +checkEscalationTool +write_iso \ No newline at end of file diff --git a/tabs/utils/monitor-control/change_orientation.sh b/tabs/utils/monitor-control/change_orientation.sh index 8d8679659..19e085f48 100755 --- a/tabs/utils/monitor-control/change_orientation.sh +++ b/tabs/utils/monitor-control/change_orientation.sh @@ -20,7 +20,8 @@ change_orientation() { i=$((i + 1)) done - read -p "Enter the number of the monitor: " monitor_choice + printf "Enter the number of the monitor: " + read -r monitor_choice if ! echo "$monitor_choice" | grep -qE '^[0-9]+$' || [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$((i - 1))" ]; then printf "%b\n" "${RED}Invalid selection.${RC}" @@ -39,8 +40,8 @@ change_orientation() { printf "%b\n" "3. ${GREEN}Right${RC}" printf "%b\n" "4. ${GREEN}Inverted${RC}" - read -p "Enter the number of the orientation: " orientation_choice - + printf "Enter the number of the orientation: " + read -r orientation_choice case $orientation_choice in 1) orientation="normal" ;; 2) orientation="left" ;; diff --git a/tabs/utils/monitor-control/enable_monitor.sh b/tabs/utils/monitor-control/enable_monitor.sh index 6d6ec5b63..2173f7f1b 100755 --- a/tabs/utils/monitor-control/enable_monitor.sh +++ b/tabs/utils/monitor-control/enable_monitor.sh @@ -21,7 +21,8 @@ enable_monitor() { i=$((i + 1)) done - read -p "Enter the number of the monitor: " monitor_choice + printf "Enter the number of the monitor: " + read -r monitor_choice if ! echo "$monitor_choice" | grep -qE '^[0-9]+$' || [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$((i - 1))" ]; then printf "%b\n" "${RED}Invalid selection.${RC}" diff --git a/tabs/utils/monitor-control/manage_arrangement.sh b/tabs/utils/monitor-control/manage_arrangement.sh index 268b930f0..684dbfd4c 100755 --- a/tabs/utils/monitor-control/manage_arrangement.sh +++ b/tabs/utils/monitor-control/manage_arrangement.sh @@ -20,7 +20,8 @@ manage_arrangement() { i=$((i + 1)) done - read -p "Enter the number of the monitor to arrange: " monitor_choice + printf "Enter the number of the monitor to arrange: " + read -r monitor_choice if ! echo "$monitor_choice" | grep -qE '^[0-9]+$' || [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$((i - 1))" ]; then printf "%b\n" "${RED}Invalid selection.${RC}" @@ -36,7 +37,8 @@ manage_arrangement() { printf "%b\n" "3. ${YELLOW}Above${RC}" printf "%b\n" "4. ${YELLOW}Below${RC}" - read -p "Enter the number of the position: " position_choice + printf "Enter the number of the position: " + read -r position_choice case $position_choice in 1) position="--left-of" ;; @@ -53,7 +55,8 @@ manage_arrangement() { fi done - read -p "Enter the number of the reference monitor: " ref_choice + printf "Enter the number of the reference monitor: " + read -r ref_choice if ! echo "$ref_choice" | grep -qE '^[0-9]+$' || [ "$ref_choice" -lt 1 ] || [ "$ref_choice" -gt "$((i - 1))" ] || [ "$ref_choice" -eq "$monitor_choice" ]; then printf "%b\n" "${RED}Invalid selection.${RC}" diff --git a/tabs/utils/monitor-control/set_brightness.sh b/tabs/utils/monitor-control/set_brightness.sh new file mode 100644 index 000000000..16f3da3b6 --- /dev/null +++ b/tabs/utils/monitor-control/set_brightness.sh @@ -0,0 +1,85 @@ +#!/bin/sh -e + +. ./utility_functions.sh + +# Function to adjust brightness for a selected monitor +adjust_monitor_brightness() { + while true; do + monitor_list=$(detect_connected_monitors) + monitor_array=$(echo "$monitor_list" | tr '\n' ' ') + set -- $monitor_array + count=1 + + clear + printf "%b\n" "${YELLOW}=========================================${RC}" + printf "%b\n" "${YELLOW} Adjust Monitor Brightness${RC}" + printf "%b\n" "${YELLOW}=========================================${RC}" + printf "%b\n" "${YELLOW}Choose a monitor to adjust brightness:${RC}" + for monitor in "$@"; do + echo "$count. $monitor" + count=$((count + 1)) + done + + echo "Enter the number of the monitor (or 'q' to quit): " + read monitor_choice + + if [ "$monitor_choice" = "q" ]; then + printf "%b\n" "${RED}Exiting...${RC}" + return + fi + + if ! echo "$monitor_choice" | grep -qE '^[0-9]+$'; then + echo "Invalid selection. Please try again." + echo "Press [Enter] to continue..." + read dummy + continue + fi + + if [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$#" ]; then + printf "%b\n" "${RED}Invalid selection. Please try again.${RC}" + echo "Press [Enter] to continue..." + read dummy + continue + fi + + monitor_name=$(eval echo "\${$monitor_choice}") + current_brightness=$(get_current_brightness "$monitor_name") + + # Correctly calculate the brightness percentage + current_brightness_percentage=$(awk "BEGIN {printf \"%.0f\", $current_brightness * 100}") + printf "%b\n" "${YELLOW}Current brightness for $monitor_name${RC}: ${GREEN}$current_brightness_percentage%${RC}" + + while true; do + echo "Enter the new brightness value as a percentage (10 to 100, or 'q' to quit): " + read new_brightness_percentage + + if [ "$new_brightness_percentage" = "q" ]; then + printf "%b\n" "${RED}Exiting...${RC}" + return + fi + + # Validate brightness input: accept only values above 10 + if ! echo "$new_brightness_percentage" | grep -qE '^[0-9]+$' || [ "$new_brightness_percentage" -lt 10 ] || [ "$new_brightness_percentage" -gt 100 ]; then + printf "%b\n" "${RED}Invalid brightness value. Please enter a value between 10 and 100.${RC}" + continue + fi + + # Convert percentage to xrandr brightness value (10% to 0.10) + new_brightness=$(awk "BEGIN {printf \"%.2f\", $new_brightness_percentage / 100}") + + echo "Set brightness for $monitor_name to $new_brightness_percentage%? (y/n): " + read confirm + if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then + printf "%b\n" "${GREEN}Setting brightness for $monitor_name to $new_brightness_percentage%${RC}" + execute_command "xrandr --output $monitor_name --brightness $new_brightness" + printf "%b\n" "${GREEN}Brightness for $monitor_name set to $new_brightness_percentage% successfully.${RC}" + break + else + printf "%b\n" "${RED}Action canceled. Please choose a different brightness value.${RC}" + fi + done + done +} + +# Call the adjust_monitor_brightness function +adjust_monitor_brightness diff --git a/tabs/utils/monitor-control/set_primary_monitor.sh b/tabs/utils/monitor-control/set_primary_monitor.sh index 143a8379d..c1a704168 100755 --- a/tabs/utils/monitor-control/set_primary_monitor.sh +++ b/tabs/utils/monitor-control/set_primary_monitor.sh @@ -20,7 +20,8 @@ set_primary_monitor() { i=$((i + 1)) done - read -p "Enter the number of the monitor: " monitor_choice + printf "Enter the number of the monitor to arrange: " + read -r monitor_choice if ! echo "$monitor_choice" | grep -qE '^[0-9]+$' || [ "$monitor_choice" -lt 1 ] || [ "$monitor_choice" -gt "$((i - 1))" ]; then printf "%b\n" "${RED}Invalid selection.${RC}" diff --git a/tabs/utils/monitor-control/utility_functions.sh b/tabs/utils/monitor-control/utility_functions.sh index 48b4c8da9..42b324c2e 100755 --- a/tabs/utils/monitor-control/utility_functions.sh +++ b/tabs/utils/monitor-control/utility_functions.sh @@ -6,15 +6,15 @@ setup_xrandr() { echo "Install xrandr if not already installed..." if ! command_exists xrandr; then - case ${PACKAGER} in + case "$PACKAGER" in pacman) - $ESCALATION_TOOL "${PACKAGER}" -S --noconfirm xorg-xrandr + $ESCALATION_TOOL "$PACKAGER" -S --noconfirm xorg-xrandr ;; - apt-get) - $ESCALATION_TOOL "${PACKAGER}" install -y x11-xserver-utils + apt-get|nala) + $ESCALATION_TOOL "$PACKAGER" install -y x11-xserver-utils ;; *) - $ESCALATION_TOOL "${PACKAGER}" install -y xorg-x11-server-utils + $ESCALATION_TOOL "$PACKAGER" install -y xorg-x11-server-utils ;; esac else @@ -38,6 +38,12 @@ detect_connected_monitors() { echo "$xrandr_output" | grep " connected" | awk '{print $1}' } +# Function to get the current brightness for a monitor +get_current_brightness() { + monitor="$1" + xrandr --verbose | grep -A 10 "^$monitor connected" | grep "Brightness:" | awk '{print $2}' +} + # Function to get resolutions for a monitor get_unique_resolutions() { monitor="$1" @@ -73,8 +79,9 @@ get_unique_resolutions() { # Function to prompt for confirmation confirm_action() { action="$1" - echo "$action" - read -p "Are you sure? (y/n): " confirm + printf "%b\n" "${CYAN}$action${RC}" + printf "%b" "${CYAN}Are you sure? (y/n): ${RC}" + read -r confirm if echo "$confirm" | grep -qE '^[Yy]$'; then return 0 else @@ -83,4 +90,5 @@ confirm_action() { } checkEnv -setup_xrandr \ No newline at end of file +checkEscalationTool +setup_xrandr diff --git a/tabs/utils/numlock.sh b/tabs/utils/numlock.sh index 2b23c3f16..79f2f6808 100755 --- a/tabs/utils/numlock.sh +++ b/tabs/utils/numlock.sh @@ -60,5 +60,6 @@ numlockSetup() { fi } +checkEnv checkEscalationTool numlockSetup diff --git a/tabs/utils/power-profile.sh b/tabs/utils/power-profile.sh new file mode 100644 index 000000000..3cc1823fc --- /dev/null +++ b/tabs/utils/power-profile.sh @@ -0,0 +1,100 @@ +#!/bin/sh -e + +. ../common-script.sh + +installAutoCpufreq() { + clear + printf "%b\n" "${YELLOW}Checking if auto-cpufreq is already installed...${RC}" + + # Check if auto-cpufreq is already installed + if command_exists auto-cpufreq; then + printf "%b\n" "${GREEN}auto-cpufreq is already installed.${RC}" + else + printf "%b\n" "${YELLOW}Installing auto-cpufreq...${RC}" + + # Install git if not already installed + if ! command_exists git; then + printf "%b\n" "${YELLOW}git not found. Installing git...${RC}" + case ${PACKAGER} in + pacman) + $ESCALATION_TOOL ${PACKAGER} -S --needed --noconfirm git + ;; + *) + $ESCALATION_TOOL ${PACKAGER} install -y git + ;; + esac + fi + + # Clone the auto-cpufreq repository and run the installer + if [ ! -d "auto-cpufreq" ]; then + printf "%b\n" "${YELLOW}Cloning auto-cpufreq repository...${RC}" + git clone https://github.com/AdnanHodzic/auto-cpufreq.git + fi + + case ${PACKAGER} in + *) + cd auto-cpufreq + printf "%b\n" "${YELLOW}Running auto-cpufreq installer...${RC}" + $ESCALATION_TOOL ./auto-cpufreq-installer + ;; + esac + cd .. + fi +} + +configureAutoCpufreq() { + printf "%b\n" "${YELLOW}Configuring auto-cpufreq...${RC}" + + if command_exists auto-cpufreq; then + # Check if the system has a battery to determine if it's a laptop + if [ -d /sys/class/power_supply/BAT0 ]; then + printf "%b\n" "${GREEN}System detected as laptop. Updating auto-cpufreq for laptop...${RC}" + $ESCALATION_TOOL auto-cpufreq --force powersave + else + printf "%b\n" "${GREEN}System detected as desktop. Updating auto-cpufreq for desktop...${RC}" + $ESCALATION_TOOL auto-cpufreq --force performance + fi + else + printf "%b\n" "${RED}auto-cpufreq is not installed, skipping configuration.${RC}" + fi +} + +removeAutoCpufreqTweak() { + printf "%b\n" "${YELLOW}Removing auto-cpufreq tweak...${RC}" + + if command_exists auto-cpufreq; then + printf "%b\n" "${YELLOW}Resetting auto-cpufreq configuration...${RC}" + $ESCALATION_TOOL auto-cpufreq --force reset + else + printf "%b\n" "${RED}auto-cpufreq is not installed, skipping removal.${RC}" + fi +} + +apply_or_remove_auto_cpufreq() { + # Prompt user for action + printf "%b\n" "${YELLOW}Do you want to apply the auto-cpufreq tweak or remove it?${RC}" + printf "%b\n" "${YELLOW}1) Apply tweak${RC}" + printf "%b\n" "${YELLOW}2) Remove tweak${RC}" + printf "%b" "Enter your choice [1/2]: " + read -r choice + + case $choice in + 1) + configureAutoCpufreq + ;; + 2) + removeAutoCpufreqTweak + ;; + *) + printf "%b\n" "${RED}Invalid choice. Exiting.${RC}" + exit 1 + ;; + esac + + printf "%b\n" "${GREEN}auto-cpufreq setup complete.${RC}" +} + +checkEnv +checkEscalationTool +installAutoCpufreq +apply_or_remove_auto_cpufreq \ No newline at end of file diff --git a/tabs/utils/tab_data.toml b/tabs/utils/tab_data.toml index bf05a1b36..d5783fc0e 100644 --- a/tabs/utils/tab_data.toml +++ b/tabs/utils/tab_data.toml @@ -20,6 +20,22 @@ script = "ollama.sh" name = "Service Manager" script = "service-control.sh" +[[data]] +name = "Auto Login" +script = "auto-login.sh" + +[[data]] +name = "Bootable USB Creator" +script = "create-bootable-usb.sh" + +[[data]] +name = "Auto Power Profiling" +script = "power-profile.sh" + +[[data]] +name = "Timeshift Backup" +script = "timeshift.sh" + [[data]] name = "Monitor Control" @@ -73,3 +89,8 @@ script = "monitor-control/scale_monitor.sh" name = "Reset Scaling" script = "monitor-control/reset_scaling.sh" matches = true + +[[data.entries]] +name = "Set Brightness" +script = "monitor-control/set_brightness.sh" +matches = true \ No newline at end of file diff --git a/tabs/utils/timeshift.sh b/tabs/utils/timeshift.sh new file mode 100644 index 000000000..2d4a5a780 --- /dev/null +++ b/tabs/utils/timeshift.sh @@ -0,0 +1,162 @@ +#!/bin/sh -e + +. ../common-script.sh + +# Function to install Timeshift +install_timeshift() { + clear + printf "%b\n" "${YELLOW}Checking if Timeshift is installed...${RC}" + + if ! command_exists timeshift; then + case ${PACKAGER} in + pacman) + $ESCALATION_TOOL "${PACKAGER}" -S --noconfirm timeshift + ;; + *) + $ESCALATION_TOOL "${PACKAGER}" install -y timeshift + ;; + esac + else + echo "Timeshift is already installed." + fi +} + +# Function to display the menu +display_menu() { + clear + printf "%b\n" "${CYAN}Timeshift CLI Automation${RC}" + printf "%b\n" "${CYAN}\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-" + printf "%b\n" "${CYAN}1) List Snapshots${RC}" + printf "%b\n" "${CYAN}2) List Devices${RC}" + printf "%b\n" "${CYAN}3) Create Snapshot${RC}" + printf "%b\n" "${CYAN}4) Restore Snapshot${RC}" + printf "%b\n" "${CYAN}5) Delete Snapshot${RC}" + printf "%b\n" "${CYAN}6) Delete All Snapshots${RC}" + printf "%b\n" "${CYAN}7) Exit${RC}" + printf "%b\n" "${CYAN}\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-" +} + +# Function to list snapshots +list_snapshots() { + printf "%b\n" "${CYAN}Listing snapshots...${RC}" + $ESCALATION_TOOL timeshift --list-snapshots +} + +# Function to list devices +list_devices() { + printf "%b\n" "${CYAN}Listing available devices...${RC}" + $ESCALATION_TOOL timeshift --list-devices +} + +# Function to create a new snapshot +create_snapshot() { + printf "%b" "${CYAN}Enter a comment for the snapshot (optional): ${RC}" + read -r COMMENT + printf "%b" "${CYAN}Enter snapshot tag (O,B,H,D,W,M) (leave empty for no tag): ${RC}" + read -r TAG + + if [ -z "$COMMENT" ] && [ -z "$TAG" ]; then + echo "Creating snapshot with no comment or tag..." + $ESCALATION_TOOL timeshift --create + elif [ -z "$TAG" ]; then + echo "Creating snapshot with no tag..." + $ESCALATION_TOOL timeshift --create --comments "$COMMENT" + else + echo "Creating snapshot with tag: $TAG..." + $ESCALATION_TOOL timeshift --create --comments "$COMMENT" --tags "$TAG" + fi + + if [ $? -eq 0 ]; then + echo "Snapshot created successfully." + else + echo "Snapshot creation failed." + fi +} + +# Function to restore a snapshot +restore_snapshot() { + list_snapshots + + printf "%b" "${CYAN}Enter the snapshot name you want to restore: ${RC}" + read -r SNAPSHOT + printf "%b" "${CYAN}Enter the target device (e.g., /dev/sda1): ${RC}" + read -r TARGET_DEVICE + printf "%b" "${CYAN}Do you want to skip GRUB reinstall? (yes/no): ${RC}" + read -r SKIP_GRUB + + if [ "$SKIP_GRUB" = "yes" ]; then + $ESCALATION_TOOL timeshift --restore --snapshot "$SNAPSHOT" --target-device "$TARGET_DEVICE" --skip-grub --yes + else + printf "%b" "${CYAN}Enter GRUB device (e.g., /dev/sda): ${RC}" + read -r GRUB_DEVICE + $ESCALATION_TOOL timeshift --restore --snapshot "$SNAPSHOT" --target-device "$TARGET_DEVICE" --grub-device "$GRUB_DEVICE" --yes + fi + + if [ $? -eq 0 ]; then + printf "%b\n" "${GREEN}Snapshot restored successfully.${RC}" + else + printf "%b\n" "${RED}Snapshot restore failed.${RC}" + fi +} + +# Function to delete a snapshot +delete_snapshot() { + list_snapshots + + printf "%b" "${CYAN}Enter the snapshot name you want to delete: ${RC}" + read -r SNAPSHOT + + printf "%b\n" "${YELLOW}Deleting snapshot $SNAPSHOT...${RC}" + $ESCALATION_TOOL timeshift --delete --snapshot "$SNAPSHOT" --yes + + if [ $? -eq 0 ]; then + printf "%b\n" "${GREEN}Snapshot deleted successfully.${RC}" + else + printf "%b\n" "${RED}Snapshot deletion failed.${RC}" + fi +} + +# Function to delete all snapshots +delete_all_snapshots() { + printf "%b\n" "${RED}WARNING: This will delete all snapshots!${RC}" + printf "%b" "${CYAN}Are you sure? (yes/no): ${RC}" + read -r CONFIRMATION + + if [ "$CONFIRMATION" = "yes" ]; then + echo "Deleting all snapshots..." + $ESCALATION_TOOL timeshift --delete-all --yes + if [ $? -eq 0 ]; then + printf "%b\n" "${GREEN}All snapshots deleted successfully.${RC}" + else + printf "%b\n" "${RED}Failed to delete snapshots.${RC}" + fi + else + printf "%b\n" "${RED}Operation cancelled.${RC}" + fi +} + +main_menu() { +while true; do + display_menu + printf "%b" "${CYAN}Select an option (1-7): ${RC}" + read -r OPTION + + case $OPTION in + 1) list_snapshots ;; + 2) list_devices ;; + 3) create_snapshot ;; + 4) restore_snapshot ;; + 5) delete_snapshot ;; + 6) delete_all_snapshots ;; + 7) printf "%b\n" "${GREEN}Exiting...${RC}"; exit 0 ;; + *) printf "%b\n" "${RED}Invalid option. Please try again.${RC}" ;; + esac + printf "%b" "${CYAN}Press Enter to continue...${RC}" + read -r dummy +done +} + +checkEnv +checkEscalationTool +install_timeshift +main_menu diff --git a/tabs/utils/wifi-control.sh b/tabs/utils/wifi-control.sh index 036e2a28c..5518f25b9 100644 --- a/tabs/utils/wifi-control.sh +++ b/tabs/utils/wifi-control.sh @@ -6,15 +6,15 @@ setupNetworkManager() { printf "%b\n" "${YELLOW}Installing NetworkManager...${RC}" if ! command_exists nmcli; then - case ${PACKAGER} in + case "$PACKAGER" in pacman) - $ESCALATION_TOOL "${PACKAGER}" -S --noconfirm networkmanager + $ESCALATION_TOOL "$PACKAGER" -S --noconfirm networkmanager ;; dnf) - $ESCALATION_TOOL "${PACKAGER}" install -y NetworkManager-1 + $ESCALATION_TOOL "$PACKAGER" install -y NetworkManager-1 ;; *) - $ESCALATION_TOOL "${PACKAGER}" install -y network-manager + $ESCALATION_TOOL "$PACKAGER" install -y network-manager ;; esac else @@ -65,15 +65,15 @@ main_menu() { scan_networks() { clear printf "%b\n" "${YELLOW}Scanning for WiFi networks...${RC}" - networks=$(nmcli -t -f SSID,BSSID,SIGNAL dev wifi list | head -n 10) + networks=$(nmcli -t -f SSID,BSSID,SIGNAL dev wifi list | awk -F: '!seen[$1]++' | head -n 10) if [ -z "$networks" ]; then printf "%b\n" "${RED}No networks found.${RC}" else printf "%b\n" "${GREEN}Top 10 Networks found:${RC}" - echo "$networks" | sed 's/\\//g' | awk -F: '{printf("%d. SSID: %-25s \n", NR, $1)}' + echo "$networks" | awk -F: '{printf("%d. SSID: %-25s \n", NR, $1)}' fi echo "Press any key to return to the main menu..." - read -n 1 + read -r dummy } # Function to turn WiFi on @@ -86,7 +86,7 @@ wifi_on() { printf "%b\n" "${RED}Failed to turn on WiFi.${RC}" } echo "Press any key to return to the main menu..." - read -n 1 + read -r dummy } # Function to turn WiFi off @@ -99,7 +99,7 @@ wifi_off() { printf "%b\n" "${RED}Failed to turn off WiFi.${RC}" } echo "Press any key to return to the main menu..." - read -n 1 + read -r dummy } # Function to prompt for WiFi network selection @@ -108,65 +108,53 @@ prompt_for_network() { prompt_msg=$2 success_msg=$3 failure_msg=$4 + temp_file=$(mktemp) while true; do clear - networks=$(nmcli -t -f SSID dev wifi list | head -n 10) + networks=$(nmcli -t -f SSID dev wifi list | awk -F: '!seen[$1]++' | grep -v '^$') if [ -z "$networks" ]; then printf "%b\n" "${RED}No networks available. Please scan for networks first.${RC}" echo "Press any key to return to the main menu..." - read -n 1 + read -r dummy + rm -f "$temp_file" return fi - - # Display networks with numbers + + echo "$networks" > "$temp_file" + i=1 - echo "$networks" | while IFS= read -r network; do + while IFS= read -r network; do ssid=$(echo "$network" | awk -F: '{print $1}') - echo "$i. SSID: $ssid" + printf "%d. SSID: %s\n" "$i" "$ssid" i=$((i + 1)) - done + done < "$temp_file" + echo "0. Exit to main menu" echo -n "$prompt_msg" read choice - # Validate the choice - if echo "$choice" | grep -qE '^[0-9]+$' && [ "$choice" -le "$((i - 1))" ] && [ "$choice" -gt 0 ]; then - network=$(echo "$networks" | sed -n "${choice}p") - ssid=$(echo "$network" | awk -F: '{print $1}') + if [ "$choice" -ge 1 ] && [ "$choice" -lt "$i" ]; then + ssid=$(sed -n "${choice}p" "$temp_file" | awk -F: '{print $1}') if [ "$action" = "connect" ]; then echo -n "Enter password for SSID $ssid: " - read -s password + read password echo nmcli dev wifi connect "$ssid" password "$password" && { printf "%b\n" "${GREEN}$success_msg${RC}" - break - } || { - printf "%b\n" "${RED}$failure_msg${RC}" - } - elif [ "$action" = "disconnect" ]; then - nmcli connection down "$ssid" && { - printf "%b\n" "${GREEN}$success_msg${RC}" - break - } || { - printf "%b\n" "${RED}$failure_msg${RC}" - } - elif [ "$action" = "remove" ]; then - nmcli connection delete "$ssid" && { - printf "%b\n" "${GREEN}$success_msg${RC}" - break } || { printf "%b\n" "${RED}$failure_msg${RC}" } fi - elif [ "$choice" -eq 0 ]; then - return else printf "%b\n" "${RED}Invalid choice. Please try again.${RC}" fi + + echo "Press any key to return to the selection menu..." + read -r dummy done - echo "Press any key to return to the main menu..." - read -n 1 + + rm -f "$temp_file" } # Function to connect to a WiFi network @@ -186,5 +174,6 @@ remove_network() { # Initialize checkEnv +checkEscalationTool setupNetworkManager -main_menu +main_menu \ No newline at end of file diff --git a/tui/src/hint.rs b/tui/src/hint.rs index b557a7d40..9ab7f1acf 100644 --- a/tui/src/hint.rs +++ b/tui/src/hint.rs @@ -16,7 +16,7 @@ pub struct ShortcutList { } pub struct Shortcut { - pub key_sequenses: Vec>, + pub key_sequences: Vec>, pub desc: &'static str, } @@ -75,7 +75,7 @@ impl ShortcutList { impl Shortcut { pub fn new(key_sequences: Vec<&'static str>, desc: &'static str) -> Self { Self { - key_sequenses: key_sequences + key_sequences: key_sequences .iter() .map(|s| Span::styled(*s, Style::default().bold())) .collect(), @@ -85,7 +85,7 @@ impl Shortcut { fn to_spans(&self) -> Vec { let mut ret: Vec<_> = self - .key_sequenses + .key_sequences .iter() .flat_map(|seq| { [ @@ -124,10 +124,10 @@ pub fn draw_shortcuts(state: &AppState, frame: &mut Frame, area: Rect) { if state.selected_item_is_up_dir() { hints.push(Shortcut::new( vec!["l", "Right", "Enter", "h", "Left"], - "Go to parrent directory", + "Go to parent directory", )); } else { - hints.push(Shortcut::new(vec!["h", "Left"], "Go to parrent directory")); + hints.push(Shortcut::new(vec!["h", "Left"], "Go to parent directory")); hints.push(get_list_item_shortcut(state)); if state.selected_item_is_cmd() { hints.push(Shortcut::new(vec!["p"], "Enable preview")); diff --git a/tui/src/state.rs b/tui/src/state.rs index 22e2df4de..20cc0870b 100644 --- a/tui/src/state.rs +++ b/tui/src/state.rs @@ -26,13 +26,14 @@ pub struct AppState { tabs: Vec, /// Current tab current_tab: ListState, - /// This stack keeps track of our "current dirrectory". You can think of it as `pwd`. but not + /// This stack keeps track of our "current directory". You can think of it as `pwd`. but not /// just the current directory, all paths that took us here, so we can "cd .." visit_stack: Vec, /// This is the state asociated with the list widget, used to display the selection in the /// widget selection: ListState, filter: Filter, + drawable: bool, } pub enum Focus { @@ -60,11 +61,55 @@ impl AppState { visit_stack: vec![root_id], selection: ListState::default().with_selected(Some(0)), filter: Filter::new(), + drawable: false, }; state.update_items(); state } pub fn draw(&mut self, frame: &mut Frame) { + let terminal_size = frame.area(); + let min_width = 77; // Minimum width threshold + let min_height = 19; // Minimum height threshold + + if terminal_size.width < min_width || terminal_size.height < min_height { + let size_warning_message = format!( + "Terminal size too small:\nWidth = {} Height = {}\n\nMinimum size:\nWidth = {} Height = {}", + terminal_size.width, + terminal_size.height, + min_width, + min_height, + ); + + let warning_paragraph = Paragraph::new(size_warning_message.clone()) + .alignment(Alignment::Center) + .style(Style::default().fg(ratatui::style::Color::Red).bold()) + .wrap(ratatui::widgets::Wrap { trim: true }); + + // Get the maximum width and height of text lines + let text_lines: Vec = size_warning_message + .lines() + .map(|line| line.to_string()) + .collect(); + let max_line_length = text_lines.iter().map(|line| line.len()).max().unwrap_or(0); + let num_lines = text_lines.len(); + + // Calculate the centered area + let centered_area = ratatui::layout::Rect { + x: terminal_size.x + (terminal_size.width - max_line_length as u16) / 2, + y: terminal_size.y + (terminal_size.height - num_lines as u16) / 2, + width: max_line_length as u16, + height: num_lines as u16, + }; + frame.render_widget(warning_paragraph, centered_area); + self.drawable = false; + } else { + self.drawable = true; + } + + if !self.drawable { + return; + } + let label_block = Block::default() .borders(Borders::all()) @@ -187,12 +232,26 @@ impl AppState { } pub fn handle_key(&mut self, key: &KeyEvent) -> bool { + // This should be defined first to allow closing + // the application even when not drawable ( If terminal is small ) + if matches!(self.focus, Focus::TabList | Focus::List) { + if key.code == KeyCode::Char('q') + || key.code == KeyCode::Char('c') && key.modifiers.contains(KeyModifiers::CONTROL) + { + return false; + } + } + + // If UI is not drawable returning true will mark as the key handled + if !self.drawable { + return true; + } + // Handle key only when Tablist or List is focused // Prevents exiting the application even when a command is running // Add keys here which should work on both TabList and List if matches!(self.focus, Focus::TabList | Focus::List) { match key.code { - KeyCode::Char('q') => return false, KeyCode::Tab => { if self.current_tab.selected().unwrap() == self.tabs.len() - 1 { self.current_tab.select_first(); // Select first tab when it is at last @@ -285,7 +344,7 @@ impl AppState { ); } - /// Checks ehther the current tree node is the root node (can we go up the tree or no) + /// Checks either the current tree node is the root node (can we go up the tree or no) /// Returns `true` if we can't go up the tree (we are at the tree root) /// else returns `false` pub fn at_root(&self) -> bool {