Merge branch 'main' into nala

This commit is contained in:
Chris Titus 2024-09-18 13:23:24 -05:00 committed by GitHub
commit e3b25300e2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
32 changed files with 1190 additions and 147 deletions

View File

@ -1,8 +1,3 @@
# Pull Request
## Title
<!--[Provide a succinct and descriptive title for the pull request.]-->
## Type of Change ## Type of Change
- [ ] New feature - [ ] New feature
- [ ] Bug fix - [ ] Bug fix

View File

@ -1,7 +1,7 @@
name: Manage labels based on PR body name: Manage labels based on PR body
on: on:
pull_request: pull_request_target:
types: [opened, edited, reopened, synchronize] types: [opened, edited, reopened, synchronize]
jobs: jobs:
@ -9,8 +9,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Analyze PR Body and manage labels - name: Analyze PR Body and manage labels
shell: bash
run: | run: |
body="${{ github.event.pull_request.body }}" body=$(jq -r '.pull_request.body' "$GITHUB_EVENT_PATH")
labels_to_add=() labels_to_add=()
labels_to_remove=() labels_to_remove=()
declare -A label_checks=( declare -A label_checks=(
@ -20,19 +21,23 @@ jobs:
["Refactoring"]="refactor" ["Refactoring"]="refactor"
["UI/UX improvement"]="UI/UX" ["UI/UX improvement"]="UI/UX"
) )
for key in "${!label_checks[@]}"; do for pattern in "${!label_checks[@]}"; do
if echo "$body" | grep -q "\- \[x\] $key"; then label="${label_checks[$pattern]}"
labels_to_add+=("${label_checks[$key]}") if echo "$body" | grep -Eq "\- \[x\] ($pattern)"; then
labels_to_add+=("$label")
else else
labels_to_remove+=("${label_checks[$key]}") labels_to_remove+=("$label")
fi fi
done 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 - name: Add labels if necessary
if: env.LABELS_TO_ADD != '' if: env.LABELS_TO_ADD != ''
run: | 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 \ curl -s -X POST \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \ -H "Accept: application/vnd.github.v3+json" \
@ -42,9 +47,10 @@ jobs:
- name: Remove labels if necessary - name: Remove labels if necessary
if: env.LABELS_TO_REMOVE != '' if: env.LABELS_TO_REMOVE != ''
run: | 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 \ curl -s -X DELETE \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \ -H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels/$label https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels/$label
done done

View File

@ -1,4 +1,4 @@
#!/bin/sh #!/bin/sh -e
rc='\033[0m' rc='\033[0m'
red='\033[0;31m' red='\033[0;31m'

View File

@ -1,4 +1,4 @@
#!/bin/sh #!/bin/sh -e
RC='\033[0m' RC='\033[0m'
RED='\033[0;31m' RED='\033[0;31m'
@ -35,7 +35,7 @@ check() {
local message=$2 local message=$2
if [ $exit_code -ne 0 ]; then if [ $exit_code -ne 0 ]; then
echo -e "${RED}ERROR: $message${RC}" printf "%b\n" "${RED}ERROR: $message${RC}"
exit 1 exit 1
fi fi
} }

View File

@ -2,8 +2,8 @@
. ../common-script.sh . ../common-script.sh
setupAlacritty() { installAlacritty() {
echo "Install Alacritty if not already installed..." echo "Installing Alacritty..."
if ! command_exists alacritty; then if ! command_exists alacritty; then
case "$PACKAGER" in case "$PACKAGER" in
pacman) pacman)
@ -14,21 +14,22 @@ setupAlacritty() {
;; ;;
esac esac
else else
echo "alacritty is already installed." printf "%b\n" "${GREEN}alacritty is already installed.${RC}"
fi fi
} }
setupAlacrittyConfig() { 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 if [ -d "${HOME}/.config/alacritty" ] && [ ! -d "${HOME}/.config/alacritty-bak" ]; then
cp -r "${HOME}/.config/alacritty" "${HOME}/.config/alacritty-bak" cp -r "${HOME}/.config/alacritty" "${HOME}/.config/alacritty-bak"
fi fi
mkdir -p "${HOME}/.config/alacritty/" 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/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" 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 checkEnv
checkEscalationTool checkEscalationTool
setupAlacritty installAlacritty
setupAlacrittyConfig setupAlacrittyConfig

View File

@ -10,7 +10,7 @@ makeDWM() {
} }
setupDWM() { 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 case "$PACKAGER" in # Install pre-Requisites
pacman) 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
@ -23,7 +23,7 @@ setupDWM() {
$ESCALATION_TOOL "$PACKAGER" install -y libX11-devel libXinerama-devel libXft-devel imlib2-devel libxcb-devel $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 exit 1
;; ;;
esac esac
@ -37,56 +37,56 @@ install_nerd_font() {
# Check if Meslo Nerd-font is already installed # Check if Meslo Nerd-font is already installed
if [ -n "$FONT_INSTALLED" ]; then 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 return 0
fi fi
echo "Installing Meslo Nerd-fonts" printf "%b\n" "${YELLOW}Installing Meslo Nerd-fonts${RC}"
# Create the fonts directory if it doesn't exist # Create the fonts directory if it doesn't exist
if [ ! -d "$FONT_DIR" ]; then if [ ! -d "$FONT_DIR" ]; then
mkdir -p "$FONT_DIR" || { mkdir -p "$FONT_DIR" || {
echo "Failed to create directory: $FONT_DIR" printf "%b\n" "${RED}Failed to create directory: $FONT_DIR${RC}"
return 1 return 1
} }
else else
echo "$FONT_DIR exists, skipping creation." printf "%b\n" "${GREEN}$FONT_DIR exists, skipping creation.${RC}"
fi fi
# Check if the font zip file already exists # Check if the font zip file already exists
if [ ! -f "$FONT_ZIP" ]; then if [ ! -f "$FONT_ZIP" ]; then
# Download the font zip file # Download the font zip file
curl -sSLo "$FONT_ZIP" "$FONT_URL" || { 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 return 1
} }
else 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 fi
# Unzip the font file if it hasn't been unzipped yet # Unzip the font file if it hasn't been unzipped yet
if [ ! -d "$FONT_DIR/Meslo" ]; then if [ ! -d "$FONT_DIR/Meslo" ]; then
unzip "$FONT_ZIP" -d "$FONT_DIR" || { unzip "$FONT_ZIP" -d "$FONT_DIR" || {
echo "Failed to unzip $FONT_ZIP" printf "%b\n" "${RED}Failed to unzip $FONT_ZIP${RC}"
return 1 return 1
} }
else 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 fi
# Remove the zip file # Remove the zip file
rm "$FONT_ZIP" || { rm "$FONT_ZIP" || {
echo "Failed to remove $FONT_ZIP" printf "%b\n" "${RED}Failed to remove $FONT_ZIP${RC}"
return 1 return 1
} }
# Rebuild the font cache # Rebuild the font cache
fc-cache -fv || { fc-cache -fv || {
echo "Failed to rebuild font cache" printf "%b\n" "${RED}Failed to rebuild font cache${RC}"
return 1 return 1
} }
echo "Meslo Nerd-fonts installed successfully" printf "%b\n" "${GREEN}Meslo Nerd-fonts installed successfully${RC}"
} }
picom_animations() { picom_animations() {
@ -94,33 +94,33 @@ picom_animations() {
mkdir -p ~/build mkdir -p ~/build
if [ ! -d ~/build/picom ]; then if [ ! -d ~/build/picom ]; then
if ! git clone https://github.com/FT-Labs/picom.git ~/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 return 1
fi fi
else else
echo "Repository already exists, skipping clone" printf "%b\n" "${GREEN}Repository already exists, skipping clone${RC}"
fi 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 # Build the project
if ! meson setup --buildtype=release build; then if ! meson setup --buildtype=release build; then
echo "Meson setup failed" printf "%b\n" "${RED}Meson setup failed${RC}"
return 1 return 1
fi fi
if ! ninja -C build; then if ! ninja -C build; then
echo "Ninja build failed" printf "%b\n" "${RED}Ninja build failed${RC}"
return 1 return 1
fi fi
# Install the built binary # Install the built binary
if ! $ESCALATION_TOOL ninja -C build install; then 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 return 1
fi fi
echo "Picom animations installed successfully" printf "%b\n" "${GREEN}Picom animations installed successfully${RC}"
} }
clone_config_folders() { clone_config_folders() {
@ -135,45 +135,48 @@ clone_config_folders() {
# Clone the directory to ~/.config/ # Clone the directory to ~/.config/
if [ -d "$dir" ]; then if [ -d "$dir" ]; then
cp -r "$dir" ~/.config/ cp -r "$dir" ~/.config/
echo "Cloned $dir_name to ~/.config/" printf "%b\n" "${GREEN}Cloned $dir_name to ~/.config/${RC}"
else else
echo "Directory $dir_name does not exist, skipping" printf "%b\n" "${RED}Directory $dir_name does not exist, skipping${RC}"
fi fi
done done
} }
configure_backgrounds() { 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 # 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 # 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) # 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 mkdir ~/Pictures
echo "Directory was created in Home folder" printf "%b\n" "${GREEN}Directory was created in Home folder${RC}"
fi fi
# Check if the backgrounds directory (BG_DIR) exists # Check if the backgrounds directory (BG_DIR) exists
if [ ! -d "$BG_DIR" ]; then if [ ! -d "$BG_DIR" ]; then
# If the backgrounds directory doesn't exist, attempt to clone a repository containing backgrounds # 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 # 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 return 1
fi fi
# Rename the cloned directory to 'backgrounds' # 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 # 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 else
# If the backgrounds directory already exists, print a message indicating that the download is being skipped # 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 fi
} }
setupDisplayManager() { setupDisplayManager() {
echo "Setting up Xorg" printf "%b\n" "${YELLOW}Setting up Xorg${RC}"
case "$PACKAGER" in case "$PACKAGER" in
pacman) pacman)
$ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm xorg-xinit xorg-server $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 $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 exit 1
;; ;;
esac esac
echo "Xorg installed successfully" printf "%b\n" "${GREEN}Xorg installed successfully${RC}"
echo "Setting up Display Manager" printf "%b\n" "${YELLOW}Setting up Display Manager${RC}"
currentdm="none" currentdm="none"
for dm in gdm sddm lightdm; do for dm in gdm sddm lightdm; do
if systemctl is-active --quiet "$dm.service"; then if systemctl is-active --quiet "$dm.service"; then
@ -198,10 +201,10 @@ setupDisplayManager() {
break break
fi fi
done done
echo "Current display manager: $currentdm" printf "%b\n" "${GREEN}Current display manager: $currentdm${RC}"
if [ "$currentdm" = "none" ]; then if [ "$currentdm" = "none" ]; then
DM="sddm" DM="sddm"
echo "No display manager found, installing $DM" printf "%b\n" "${YELLOW}No display manager found, installing $DM${RC}"
case "$PACKAGER" in case "$PACKAGER" in
pacman) pacman)
$ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm "$DM" $ESCALATION_TOOL "$PACKAGER" -S --needed --noconfirm "$DM"
@ -213,11 +216,11 @@ setupDisplayManager() {
$ESCALATION_TOOL "$PACKAGER" install -y "$DM" $ESCALATION_TOOL "$PACKAGER" install -y "$DM"
;; ;;
*) *)
echo "Unsupported package manager: $PACKAGER" printf "%b\n" "${RED}Unsupported package manager: $PACKAGER${RC}"
exit 1 exit 1
;; ;;
esac esac
echo "$DM installed successfully" printf "%b\n" "${GREEN}$DM installed successfully${RC}"
systemctl enable "$DM" systemctl enable "$DM"
# Prompt user for auto-login # Prompt user for auto-login
@ -226,7 +229,7 @@ setupDisplayManager() {
read -r answer read -r answer
case "$answer" in case "$answer" in
[Yy]*) [Yy]*)
echo "Configuring SDDM for autologin" printf "%b\n" "${YELLOW}Configuring SDDM for autologin${RC}"
SDDM_CONF="/etc/sddm.conf" SDDM_CONF="/etc/sddm.conf"
if [ ! -f "$SDDM_CONF" ]; then if [ ! -f "$SDDM_CONF" ]; then
echo "[Autologin]" | $ESCALATION_TOOL tee -a "$SDDM_CONF" echo "[Autologin]" | $ESCALATION_TOOL tee -a "$SDDM_CONF"
@ -240,46 +243,43 @@ setupDisplayManager() {
echo "User=$USER" | $ESCALATION_TOOL tee -a "$SDDM_CONF" echo "User=$USER" | $ESCALATION_TOOL tee -a "$SDDM_CONF"
echo "Session=dwm" | $ESCALATION_TOOL tee -a "$SDDM_CONF" echo "Session=dwm" | $ESCALATION_TOOL tee -a "$SDDM_CONF"
fi fi
echo "Checking if autologin group exists" printf "%b\n" "{YELLOW}Checking if autologin group exists${RC}"
if ! getent group autologin > /dev/null; then if ! getent group autologin > /dev/null; then
echo "Creating autologin group" printf "%b\n" "${YELLOW}Creating autologin group${RC}"
$ESCALATION_TOOL groupadd autologin $ESCALATION_TOOL groupadd autologin
else else
echo "Autologin group already exists" printf "%b\n" "${GREEN}Autologin group already exists${RC}"
fi 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) USER_UID_1000=$(getent passwd 1000 | cut -d: -f1)
if [ -n "$USER_UID_1000" ]; then if [ -n "$USER_UID_1000" ]; then
$ESCALATION_TOOL usermod -aG autologin "$USER_UID_1000" $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 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 fi
;; ;;
*) *)
echo "Auto-login configuration skipped" printf "%b\n" "${GREEN}Auto-login configuration skipped${RC}"
;; ;;
esac esac
fi fi
} }
install_slstatus() { 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 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 read -r response # -r flag to prevent backslashes from being interpreted
if [ "$response" = "y" ] || [ "$response" = "Y" ]; then 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; } cd "$HOME/dwm-titus/slstatus" || { echo "Failed to change directory to slstatus"; return 1; }
if $ESCALATION_TOOL make clean install; then if $ESCALATION_TOOL make clean install; then
echo "slstatus installed successfully" printf "%b\n" "${GREEN}slstatus installed successfully${RC}"
else else
echo "Failed to install slstatus" printf "%b\n" "${RED}Failed to install slstatus${RC}"
return 1 return 1
fi fi
else else
echo "Skipping slstatus installation" printf "%b\n" "${GREEN}Skipping slstatus installation${RC}"
fi fi
cd "$HOME" cd "$HOME"
} }

View File

@ -2,8 +2,9 @@
. ../common-script.sh . ../common-script.sh
setupFastfetch() { installFastfetch() {
echo "Installing Fastfetch if not already installed..." printf "%b\n" "${YELLOW}Installing Fastfetch if not already installed...${RC}"
if ! command_exists fastfetch; then if ! command_exists fastfetch; then
case "$PACKAGER" in case "$PACKAGER" in
pacman) pacman)
@ -14,12 +15,12 @@ setupFastfetch() {
;; ;;
esac esac
else else
echo "Fastfetch is already installed." printf "%b\n" "${GREEN}Fastfetch is already installed.${RC}"
fi fi
} }
setupFastfetchConfig() { 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 if [ -d "${HOME}/.config/fastfetch" ] && [ ! -d "${HOME}/.config/fastfetch-bak" ]; then
cp -r "${HOME}/.config/fastfetch" "${HOME}/.config/fastfetch-bak" cp -r "${HOME}/.config/fastfetch" "${HOME}/.config/fastfetch-bak"
fi fi
@ -29,5 +30,5 @@ setupFastfetchConfig() {
checkEnv checkEnv
checkEscalationTool checkEscalationTool
setupFastfetch installFastfetch
setupFastfetchConfig setupFastfetchConfig

View File

@ -2,8 +2,8 @@
. ../common-script.sh . ../common-script.sh
setupKitty() { installKitty() {
echo "Install Kitty if not already installed..." printf "%b\n" "${YELLOW}Install Kitty if not already installed...${RC}"
if ! command_exists kitty; then if ! command_exists kitty; then
case "$PACKAGER" in case "$PACKAGER" in
pacman) pacman)
@ -14,12 +14,12 @@ setupKitty() {
;; ;;
esac esac
else else
echo "Kitty is already installed." printf "%b\n" "${GREEN}Kitty is already installed.${RC}"
fi fi
} }
setupKittyConfig() { 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 if [ -d "${HOME}/.config/kitty" ] && [ ! -d "${HOME}/.config/kitty-bak" ]; then
cp -r "${HOME}/.config/kitty" "${HOME}/.config/kitty-bak" cp -r "${HOME}/.config/kitty" "${HOME}/.config/kitty-bak"
fi fi
@ -30,5 +30,5 @@ setupKittyConfig() {
checkEnv checkEnv
checkEscalationTool checkEscalationTool
setupKitty installKitty
setupKittyConfig setupKittyConfig

View File

@ -14,7 +14,7 @@ cloneMyBash() {
} }
installDepend() { installDepend() {
echo "Install mybash if not already installed" printf "%b\n" "${YELLOW}Installing Bash...${RC}"
case "$PACKAGER" in case "$PACKAGER" in
pacman) 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
@ -39,9 +39,9 @@ installFont() {
# Check to see if the MesloLGS Nerd Font is installed (Change this to whatever font you would like) # Check to see if the MesloLGS Nerd Font is installed (Change this to whatever font you would like)
FONT_NAME="MesloLGS Nerd Font Mono" FONT_NAME="MesloLGS Nerd Font Mono"
if fc-list :family | grep -iq "$FONT_NAME"; then 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 else
echo "Installing font '$FONT_NAME'" printf "%b\n" "${YELLOW}Installing font '$FONT_NAME'${RC}"
# Change this URL to correspond with the correct font # Change this URL to correspond with the correct font
FONT_URL="https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip" FONT_URL="https://github.com/ryanoasis/nerd-fonts/releases/latest/download/Meslo.zip"
FONT_DIR="$HOME/.local/share/fonts" FONT_DIR="$HOME/.local/share/fonts"
@ -52,13 +52,13 @@ installFont() {
mv "${TEMP_DIR}"/*.ttf "$FONT_DIR"/"$FONT_NAME" mv "${TEMP_DIR}"/*.ttf "$FONT_DIR"/"$FONT_NAME"
fc-cache -fv fc-cache -fv
rm -rf "${TEMP_DIR}" rm -rf "${TEMP_DIR}"
echo "'$FONT_NAME' installed successfully." printf "%b\n" "${GREEN}'$FONT_NAME' installed successfully.${RC}"
fi fi
} }
installStarshipAndFzf() { installStarshipAndFzf() {
if command_exists starship; then if command_exists starship; then
echo "Starship already installed" printf "%b\n" "${GREEN}Starship already installed${RC}"
return return
fi fi
@ -67,7 +67,7 @@ installStarshipAndFzf() {
exit 1 exit 1
fi fi
if command_exists fzf; then if command_exists fzf; then
echo "Fzf already installed" printf "%b\n" "${GREEN}Fzf already installed${RC}"
else else
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
$ESCALATION_TOOL ~/.fzf/install $ESCALATION_TOOL ~/.fzf/install
@ -76,7 +76,7 @@ installStarshipAndFzf() {
installZoxide() { installZoxide() {
if command_exists zoxide; then if command_exists zoxide; then
echo "Zoxide already installed" printf "%b\n" "${GREEN}Zoxide already installed${RC}"
return return
fi fi

View File

@ -13,8 +13,8 @@ cloneNeovim() {
cd "$HOME" && git clone https://github.com/ChrisTitusTech/neovim.git "$HOME/.local/share/neovim" cd "$HOME" && git clone https://github.com/ChrisTitusTech/neovim.git "$HOME/.local/share/neovim"
} }
setupNeovim() { installNeovim() {
echo "Install Neovim if not already installed" printf "%b\n" "${YELLOW}Installing Neovim...${RC}"
case "$PACKAGER" in case "$PACKAGER" in
pacman) 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
@ -36,6 +36,7 @@ setupNeovim() {
} }
backupNeovimConfig() { backupNeovimConfig() {
printf "%b\n" "${YELLOW}Backing up existing configuration files...${RC}"
if [ -d "$HOME/.config/nvim" ] && [ ! -d "$HOME/.config/nvim-backup" ]; then if [ -d "$HOME/.config/nvim" ] && [ ! -d "$HOME/.config/nvim-backup" ]; then
cp -r "$HOME/.config/nvim" "$HOME/.config/nvim-backup" cp -r "$HOME/.config/nvim" "$HOME/.config/nvim-backup"
fi fi
@ -43,6 +44,7 @@ backupNeovimConfig() {
} }
linkNeovimConfig() { linkNeovimConfig() {
printf "%b\n" "${YELLOW}Linking Neovim configuration files...${RC}"
mkdir -p "$HOME/.config/nvim" 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. 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 checkEnv
checkEscalationTool checkEscalationTool
cloneNeovim cloneNeovim
setupNeovim installNeovim
backupNeovimConfig backupNeovimConfig
linkNeovimConfig linkNeovimConfig

View File

@ -2,8 +2,8 @@
. ../common-script.sh . ../common-script.sh
setupRofi() { installRofi() {
echo "Install Rofi if not already installed..." printf "%b\n" "${YELLOW}Installing Rofi...${RC}"
if ! command_exists rofi; then if ! command_exists rofi; then
case "$PACKAGER" in case "$PACKAGER" in
pacman) pacman)
@ -14,12 +14,12 @@ setupRofi() {
;; ;;
esac esac
else else
echo "Rofi is already installed." printf "%b\n" "${GREEN}Rofi is already installed.${RC}"
fi fi
} }
setupRofiConfig() { 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 if [ -d "$HOME/.config/rofi" ] && [ ! -d "$HOME/.config/rofi-bak" ]; then
cp -r "$HOME/.config/rofi" "$HOME/.config/rofi-bak" cp -r "$HOME/.config/rofi" "$HOME/.config/rofi-bak"
fi fi
@ -35,5 +35,5 @@ setupRofiConfig() {
checkEnv checkEnv
checkEscalationTool checkEscalationTool
setupRofi installRofi
setupRofiConfig setupRofiConfig

View File

@ -3,8 +3,8 @@
. ../common-script.sh . ../common-script.sh
# Function to install zsh # Function to install zsh
install_zsh() { installZsh() {
echo "Install ZSH if not already installed..." printf "%b\n" "${YELLOWInstalling Zsh...${RC}"
if ! command_exists zsh; then if ! command_exists zsh; then
case "$PACKAGER" in case "$PACKAGER" in
pacman) pacman)
@ -15,12 +15,13 @@ install_zsh() {
;; ;;
esac esac
else else
echo "ZSH is already installed." printf "%b\n" "${GREEN}ZSH is already installed.${RC}"
fi fi
} }
# Function to setup zsh configuration # Function to setup zsh configuration
setup_zsh_config() { setupZshConfig() {
echo "Setting up Zsh configuration..."
CONFIG_DIR="$HOME/.config/zsh" CONFIG_DIR="$HOME/.config/zsh"
ZSHRC_FILE="$CONFIG_DIR/.zshrc" ZSHRC_FILE="$CONFIG_DIR/.zshrc"
@ -48,5 +49,5 @@ EOL
checkEnv checkEnv
checkEscalationTool checkEscalationTool
install_zsh installZsh
setup_zsh_config setupZshConfig

View File

@ -5,6 +5,7 @@
RC='\033[0m' RC='\033[0m'
RED='\033[31m' RED='\033[31m'
YELLOW='\033[33m' YELLOW='\033[33m'
CYAN='\033[36m'
GREEN='\033[32m' GREEN='\033[32m'
command_exists() { command_exists() {

View File

@ -1,11 +1,11 @@
#!/bin/bash #!/bin/bash
# Search for possible Diablo II Resurrected folder locations # 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) possible_paths=$(find $HOME -type d -path "*/drive_c/Program Files (x86)/Diablo II Resurrected" 2>/dev/null)
if [ -z "$possible_paths" ]; then 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 exit 1
fi fi
@ -23,7 +23,7 @@ print_menu() {
if ((start + max_display > total)); then start=$((total - max_display)); fi if ((start + max_display > total)); then start=$((total - max_display)); fi
if ((start < 0)); then start=0; 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 for i in $(seq 0 $((max_display - 1))); do
if ((i + start >= total)); then break; fi if ((i + start >= total)); then break; fi
if [ $((i + start)) -eq $selected ]; then if [ $((i + start)) -eq $selected ]; then
@ -84,17 +84,17 @@ mods_path="$d2r_path/mods"
mkdir -p "$mods_path" mkdir -p "$mods_path"
# Download the latest release # 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 curl -sSLo /tmp/lootfilter.zip https://github.com/ChrisTitusTech/d2r-loot-filter/releases/latest/download/lootfilter.zip
# Extract the contents to the mods folder # 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" unzip -q -o /tmp/lootfilter.zip -d "$mods_path"
# Clean up # Clean up
rm /tmp/lootfilter.zip 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 # Add instructions for setting launch options
echo echo

View File

@ -3,7 +3,7 @@
. ../common-script.sh . ../common-script.sh
installPkg() { installPkg() {
echo "Install UFW if not already installed..." echo "Installing UFW..."
if ! command_exists ufw; then if ! command_exists ufw; then
case "$PACKAGER" in case "$PACKAGER" in
pacman) pacman)
@ -19,24 +19,24 @@ installPkg() {
} }
configureUFW() { 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 $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 $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 $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 $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 $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 default allow outgoing
$ESCALATION_TOOL ufw enable $ESCALATION_TOOL ufw enable

View File

@ -13,7 +13,7 @@ installDepend() {
echo "Include = /etc/pacman.d/mirrorlist" | $ESCALATION_TOOL tee -a /etc/pacman.conf echo "Include = /etc/pacman.d/mirrorlist" | $ESCALATION_TOOL tee -a /etc/pacman.conf
$ESCALATION_TOOL "$PACKAGER" -Syu $ESCALATION_TOOL "$PACKAGER" -Syu
else else
echo "Multilib is already enabled." printf "%b\n" "${GREEN}Multilib is already enabled.${RC}"
fi fi
$AUR_HELPER -S --needed --noconfirm "$DEPENDENCIES" $AUR_HELPER -S --needed --noconfirm "$DEPENDENCIES"
;; ;;

View File

@ -20,7 +20,7 @@ removeSnaps() {
$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 esac
} }

View File

@ -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" <<EOL
[global]
workgroup = WORKGROUP
server string = Samba Server
security = user
map to guest = bad user
dns proxy = no
[Share]
path = $SHARED_DIR
browsable = yes
writable = yes
guest ok = no
read only = no
EOL
fi
# Enable and start Samba services
$ESCALATION_TOOL systemctl enable smb nmb
$ESCALATION_TOOL systemctl start smb nmb
# Check if Samba is running
if systemctl is-active --quiet smb && systemctl is-active --quiet nmb; then
printf "%b\n" "${GREEN}Samba is up and running.${RC}"
printf "%b\n" "${YELLOW}Samba share available at: $SHARED_DIR${RC}"
else
printf "%b\n" "${RED}Failed to start Samba.${RC}"
fi
}
# Function to configure firewall (optional)
configure_firewall() {
printf "%b\n" "${BLUE}Configuring firewall...${RC}"
if command_exists ufw; then
$ESCALATION_TOOL ufw allow OpenSSH
$ESCALATION_TOOL ufw allow Samba
$ESCALATION_TOOL ufw enable
printf "%b\n" "${GREEN}Firewall configured for SSH and Samba.${RC}"
else
printf "%b\n" "${YELLOW}UFW is not installed. Skipping firewall configuration.${RC}"
fi
}
setup_ssh_samba(){
printf "Samba and SSH Setup Script\n"
printf "----------------------------\n"
clear
# Display menu
printf "Select an option:\n"
printf "1. Setup SSH\n"
printf "2. Setup Samba\n"
printf "3. Configure Firewall\n"
printf "4. Setup All\n"
printf "5. Exit\n"
printf "Enter your choice [1-5]: "
read CHOICE
case "$CHOICE" in
1)
setup_ssh
;;
2)
setup_samba
;;
3)
configure_firewall
;;
4)
setup_ssh
setup_samba
configure_firewall
;;
5)
printf "%b\n" "${GREEN}Exiting.${RC}"
exit 0
;;
*)
printf "%b\n" "${RED}Invalid choice. Please enter a number between 1 and 5.${RC}"
exit 1
;;
esac
printf "%b\n" "${GREEN}Setup completed.${RC}"
}
checkEnv
checkEscalationTool
setup_ssh_samba

View File

@ -0,0 +1,87 @@
#!/bin/sh -e
. ../common-script.sh
# Function to prompt the user for installation choice
choose_installation() {
clear
printf "%b\n" "${YELLOW}Choose what to install:${RC}"
printf "%b\n" "1. ${YELLOW}Docker${RC}"
printf "%b\n" "2. ${YELLOW}Docker Compose${RC}"
printf "%b\n" "3. ${YELLOW}Both${RC}"
read -p "Enter your choice [1-3]: " CHOICE
case "$CHOICE" in
1) INSTALL_DOCKER=1; INSTALL_COMPOSE=0 ;;
2) INSTALL_DOCKER=0; INSTALL_COMPOSE=1 ;;
3) INSTALL_DOCKER=1; INSTALL_COMPOSE=1 ;;
*) echo "Invalid choice. Exiting."; exit 1 ;;
esac
}
install_docker() {
printf "%b\n" "${YELLOW}Installing Docker...${RC}"
case $PACKAGER in
apt-get | yum)
curl -fsSL https://get.docker.com | sh
;;
zypper)
$ESCALATION_TOOL ${PACKAGER} --non-interactive install docker
$ESCALATION_TOOL systemctl enable docker
$ESCALATION_TOOL systemctl start docker
;;
pacman)
$ESCALATION_TOOL ${PACKAGER} -S --noconfirm docker
$ESCALATION_TOOL systemctl enable docker
$ESCALATION_TOOL systemctl start docker
;;
*)
printf "${RED}Unsupported package manager. Please install Docker manually.${RC}\n"
exit 1
;;
esac
}
install_docker_compose() {
printf "%b\n" "${YELLOW}Installing Docker Compose...${RC}"
case $PACKAGER in
apt-get | yum)
$ESCALATION_TOOL ${PACKAGER} update
$ESCALATION_TOOL ${PACKAGER} install -y docker-compose-plugin
;;
zypper)
$ESCALATION_TOOL ${PACKAGER} --non-interactive install docker-compose
;;
pacman)
$ESCALATION_TOOL ${PACKAGER} -S --noconfirm docker-compose
;;
*)
printf "${RED}Unsupported package manager. Please install Docker Compose manually.${RC}\n"
exit 1
;;
esac
}
install_components() {
choose_installation
if [ "$INSTALL_DOCKER" -eq 1 ]; then
if ! command_exists docker; then
install_docker
else
printf "%b\n" "${GREEN}Docker is already installed.${RC}"
fi
fi
if [ "$INSTALL_COMPOSE" -eq 1 ]; then
if ! command_exists docker-compose || ! command_exists docker compose version; then
install_docker_compose
else
printf "%b\n" "${GREEN}Docker Compose is already installed.${RC}"
fi
fi
}
checkEnv
checkEscalationTool
install_components

View File

@ -336,7 +336,7 @@ sgdisk -a 2048 -o ${DISK} # new gpt disk 2048 alignment
# create partitions # create partitions
sgdisk -n 1::+1M --typecode=1:ef02 --change-name=1:'BIOSBOOT' ${DISK} # partition 1 (BIOS Boot Partition) sgdisk -n 1::+1M --typecode=1:ef02 --change-name=1:'BIOSBOOT' ${DISK} # partition 1 (BIOS Boot Partition)
sgdisk -n 2::+300M --typecode=2:ef00 --change-name=2:'EFIBOOT' ${DISK} # partition 2 (UEFI Boot Partition) sgdisk -n 2::+1GiB --typecode=2:ef00 --change-name=2:'EFIBOOT' ${DISK} # partition 2 (UEFI Boot Partition)
sgdisk -n 3::-0 --typecode=3:8300 --change-name=3:'ROOT' ${DISK} # partition 3 (Root), default start, remaining sgdisk -n 3::-0 --typecode=3:8300 --change-name=3:'ROOT' ${DISK} # partition 3 (Root), default start, remaining
if [[ ! -d "/sys/firmware/efi" ]]; then # Checking for bios system if [[ ! -d "/sys/firmware/efi" ]]; then # Checking for bios system
sgdisk -A 1:set:2 ${DISK} sgdisk -A 1:set:2 ${DISK}

View File

@ -51,3 +51,11 @@ script = "3-global-theme.sh"
[[data]] [[data]]
name = "Remove Snaps" name = "Remove Snaps"
script = "4-remove-snaps.sh" script = "4-remove-snaps.sh"
[[data]]
name = "SSH-Samba Setup"
script = "5-samba-ssh-setup.sh"
[[data]]
name = "Docker Setup"
script = "6-docker-setup.sh"

View File

@ -1,5 +0,0 @@
#!/bin/sh
say_hello () {
echo Hi
}

View File

@ -1,6 +0,0 @@
#!/bin/sh
# The current working directory will always be inside "commands"
. test/lib.sh
say_hello

179
tabs/utils/auto-login.sh Normal file
View File

@ -0,0 +1,179 @@
#!/bin/sh -e
. ../common-script.sh
# Function to list common session options
list_sessions() {
echo "Select the session:"
echo "1) GNOME (gnome.desktop)"
echo "2) KDE Plasma (plasma.desktop)"
echo "3) XFCE (xfce.desktop)"
echo "4) LXDE (LXDE.desktop)"
echo "5) LXQt (lxqt.desktop)"
echo "6) Cinnamon (cinnamon.desktop)"
echo "7) MATE (mate.desktop)"
echo "8) Openbox (openbox.desktop)"
echo "9) i3 (i3.desktop)"
echo "10) Custom session"
echo "Enter your choice [1-10]: "
read session_choice
case "$session_choice" in
1) session="gnome.desktop" ;;
2) session="plasma.desktop" ;;
3) session="xfce.desktop" ;;
4) session="LXDE.desktop" ;;
5) session="lxqt.desktop" ;;
6) session="cinnamon.desktop" ;;
7) session="mate.desktop" ;;
8) session="openbox.desktop" ;;
9) session="i3.desktop" ;;
10)
echo "Enter custom session name (e.g., mysession.desktop): "
read -r session ;;
*)
echo "Invalid option selected."
exit 1 ;;
esac
}
# Function to configure LightDM
configure_lightdm() {
echo "Configuring LightDM for autologin..."
echo "Enter username for LightDM autologin: "
read -r user
$ESCALATION_TOOL "echo '[Seat:*]' > /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

View File

@ -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

View File

@ -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

View File

@ -38,6 +38,12 @@ detect_connected_monitors() {
echo "$xrandr_output" | grep " connected" | awk '{print $1}' 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 # Function to get resolutions for a monitor
get_unique_resolutions() { get_unique_resolutions() {
monitor="$1" monitor="$1"
@ -73,8 +79,9 @@ get_unique_resolutions() {
# Function to prompt for confirmation # Function to prompt for confirmation
confirm_action() { confirm_action() {
action="$1" action="$1"
echo "$action" printf "%b\n" "${CYAN}$action${RC}"
read -p "Are you sure? (y/n): " confirm printf "%b" "${CYAN}Are you sure? (y/n): ${RC}"
read -r confirm
if echo "$confirm" | grep -qE '^[Yy]$'; then if echo "$confirm" | grep -qE '^[Yy]$'; then
return 0 return 0
else else

100
tabs/utils/power-profile.sh Normal file
View File

@ -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

View File

@ -20,6 +20,22 @@ script = "ollama.sh"
name = "Service Manager" name = "Service Manager"
script = "service-control.sh" 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]] [[data]]
name = "Monitor Control" name = "Monitor Control"
@ -73,3 +89,8 @@ script = "monitor-control/scale_monitor.sh"
name = "Reset Scaling" name = "Reset Scaling"
script = "monitor-control/reset_scaling.sh" script = "monitor-control/reset_scaling.sh"
matches = true matches = true
[[data.entries]]
name = "Set Brightness"
script = "monitor-control/set_brightness.sh"
matches = true

162
tabs/utils/timeshift.sh Normal file
View File

@ -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

View File

@ -16,7 +16,7 @@ pub struct ShortcutList {
} }
pub struct Shortcut { pub struct Shortcut {
pub key_sequenses: Vec<Span<'static>>, pub key_sequences: Vec<Span<'static>>,
pub desc: &'static str, pub desc: &'static str,
} }
@ -75,7 +75,7 @@ impl ShortcutList {
impl Shortcut { impl Shortcut {
pub fn new(key_sequences: Vec<&'static str>, desc: &'static str) -> Self { pub fn new(key_sequences: Vec<&'static str>, desc: &'static str) -> Self {
Self { Self {
key_sequenses: key_sequences key_sequences: key_sequences
.iter() .iter()
.map(|s| Span::styled(*s, Style::default().bold())) .map(|s| Span::styled(*s, Style::default().bold()))
.collect(), .collect(),
@ -85,7 +85,7 @@ impl Shortcut {
fn to_spans(&self) -> Vec<Span> { fn to_spans(&self) -> Vec<Span> {
let mut ret: Vec<_> = self let mut ret: Vec<_> = self
.key_sequenses .key_sequences
.iter() .iter()
.flat_map(|seq| { .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() { if state.selected_item_is_up_dir() {
hints.push(Shortcut::new( hints.push(Shortcut::new(
vec!["l", "Right", "Enter", "h", "Left"], vec!["l", "Right", "Enter", "h", "Left"],
"Go to parrent directory", "Go to parent directory",
)); ));
} else { } 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)); hints.push(get_list_item_shortcut(state));
if state.selected_item_is_cmd() { if state.selected_item_is_cmd() {
hints.push(Shortcut::new(vec!["p"], "Enable preview")); hints.push(Shortcut::new(vec!["p"], "Enable preview"));

View File

@ -26,7 +26,7 @@ pub struct AppState {
tabs: Vec<Tab>, tabs: Vec<Tab>,
/// Current tab /// Current tab
current_tab: ListState, 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 .." /// just the current directory, all paths that took us here, so we can "cd .."
visit_stack: Vec<NodeId>, visit_stack: Vec<NodeId>,
/// This is the state asociated with the list widget, used to display the selection in the /// 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) /// Returns `true` if we can't go up the tree (we are at the tree root)
/// else returns `false` /// else returns `false`
pub fn at_root(&self) -> bool { pub fn at_root(&self) -> bool {