diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3b61761b..093357d2 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 eab956f4..82f9ac97 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 d1e7658a..b6fe4fdc 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 1070ea42..0df8ce53 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 eb8a5d4b..3625ca96 100755 --- a/tabs/applications-setup/alacritty-setup.sh +++ b/tabs/applications-setup/alacritty-setup.sh @@ -2,8 +2,8 @@ . ../common-script.sh -setupAlacritty() { - echo "Install Alacritty if not already installed..." +installAlacritty() { + echo "Installing Alacritty..." if ! command_exists alacritty; then case "$PACKAGER" in pacman) @@ -14,21 +14,22 @@ setupAlacritty() { ;; 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 acc56c0e..9017639d 100755 --- a/tabs/applications-setup/dwmtitus-setup.sh +++ b/tabs/applications-setup/dwmtitus-setup.sh @@ -10,7 +10,7 @@ makeDWM() { } 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 @@ -23,7 +23,7 @@ setupDWM() { $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 @@ -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" } diff --git a/tabs/applications-setup/fastfetch-setup.sh b/tabs/applications-setup/fastfetch-setup.sh index 1415f9a8..83fb52fa 100644 --- a/tabs/applications-setup/fastfetch-setup.sh +++ b/tabs/applications-setup/fastfetch-setup.sh @@ -2,8 +2,9 @@ . ../common-script.sh -setupFastfetch() { - echo "Installing Fastfetch if not already installed..." +installFastfetch() { + printf "%b\n" "${YELLOW}Installing Fastfetch if not already installed...${RC}" + if ! command_exists fastfetch; then case "$PACKAGER" in pacman) @@ -14,12 +15,12 @@ setupFastfetch() { ;; 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 +30,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 5195a9cc..480eed82 100755 --- a/tabs/applications-setup/kitty-setup.sh +++ b/tabs/applications-setup/kitty-setup.sh @@ -2,8 +2,8 @@ . ../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 pacman) @@ -14,12 +14,12 @@ setupKitty() { ;; 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 7bca14e2..380f1e2b 100644 --- a/tabs/applications-setup/mybash-setup.sh +++ b/tabs/applications-setup/mybash-setup.sh @@ -14,7 +14,7 @@ cloneMyBash() { } 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 @@ -39,9 +39,9 @@ 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 diff --git a/tabs/applications-setup/neovim-setup.sh b/tabs/applications-setup/neovim-setup.sh index 0d3a2578..826fd538 100755 --- a/tabs/applications-setup/neovim-setup.sh +++ b/tabs/applications-setup/neovim-setup.sh @@ -13,8 +13,8 @@ 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 @@ -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,6 +44,7 @@ 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. } @@ -50,6 +52,6 @@ linkNeovimConfig() { checkEnv checkEscalationTool cloneNeovim -setupNeovim +installNeovim 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 c5874517..cd5c644a 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 eaa608b5..5d466136 100644 --- a/tabs/applications-setup/zsh-setup.sh +++ b/tabs/applications-setup/zsh-setup.sh @@ -3,8 +3,8 @@ . ../common-script.sh # Function to install zsh -install_zsh() { - echo "Install ZSH if not already installed..." +installZsh() { + printf "%b\n" "${YELLOWInstalling Zsh...${RC}" if ! command_exists zsh; then case "$PACKAGER" in pacman) @@ -15,12 +15,13 @@ install_zsh() { ;; esac else - echo "ZSH is already installed." + 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 75e80db8..97721eaf 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() { diff --git a/tabs/gaming/diablo-ii/d2r-loot-filters.sh b/tabs/gaming/diablo-ii/d2r-loot-filters.sh index 1fa43fab..a7cd7694 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 951b6415..8ce39048 100644 --- a/tabs/security/firewall-baselines.sh +++ b/tabs/security/firewall-baselines.sh @@ -3,7 +3,7 @@ . ../common-script.sh installPkg() { - echo "Install UFW if not already installed..." + echo "Installing UFW..." if ! command_exists ufw; then case "$PACKAGER" in pacman) @@ -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 14ef06cd..7f1b3f73 100755 --- a/tabs/system-setup/1-compile-setup.sh +++ b/tabs/system-setup/1-compile-setup.sh @@ -13,7 +13,7 @@ installDepend() { 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/4-remove-snaps.sh b/tabs/system-setup/4-remove-snaps.sh index 5d899648..2cba860b 100644 --- a/tabs/system-setup/4-remove-snaps.sh +++ b/tabs/system-setup/4-remove-snaps.sh @@ -20,7 +20,7 @@ removeSnaps() { $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 00000000..ddd43c99 --- /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/create-bootable-usb.sh b/tabs/utils/create-bootable-usb.sh new file mode 100644 index 00000000..6feae2da --- /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/set_brightness.sh b/tabs/utils/monitor-control/set_brightness.sh new file mode 100644 index 00000000..16f3da3b --- /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/utility_functions.sh b/tabs/utils/monitor-control/utility_functions.sh index 28b4fad7..42b324c2 100755 --- a/tabs/utils/monitor-control/utility_functions.sh +++ b/tabs/utils/monitor-control/utility_functions.sh @@ -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 diff --git a/tabs/utils/power-profile.sh b/tabs/utils/power-profile.sh new file mode 100644 index 00000000..3cc1823f --- /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 bf05a1b3..d5783fc0 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 00000000..2d4a5a78 --- /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/tui/src/hint.rs b/tui/src/hint.rs index 27474ea9..37947159 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 1d11ce80..ca405162 100644 --- a/tui/src/state.rs +++ b/tui/src/state.rs @@ -26,7 +26,7 @@ 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 @@ -262,7 +262,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 {