Merge branch 'main' into testing-7

This commit is contained in:
Chris Titus 2024-09-18 13:14:04 -05:00 committed by GitHub
commit 56e031ed8e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
30 changed files with 1114 additions and 72 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,7 +47,8 @@ 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" \

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() {
printf "%b\n" "${YELLOW}Install Alacritty if not already installed...${RC}" echo "Installing Alacritty..."
if ! command_exists alacritty; then if ! command_exists alacritty; then
case ${PACKAGER} in case ${PACKAGER} in
pacman) pacman)
@ -31,5 +31,5 @@ setupAlacrittyConfig() {
checkEnv checkEnv
checkEscalationTool checkEscalationTool
setupAlacritty installAlacritty
setupAlacrittyConfig setupAlacrittyConfig

View File

@ -143,11 +143,14 @@ clone_config_folders() {
} }
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)
printf "%b\n" "${RED}Pictures directory does not exist${RC}" printf "%b\n" "${RED}Pictures directory does not exist${RC}"
mkdir ~/Pictures mkdir ~/Pictures
@ -157,13 +160,13 @@ configure_backgrounds() {
# 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
printf "%b\n" "${RED}Failed to clone the repository${RC}" 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
printf "%b\n" "${GREEN}Downloaded desktop backgrounds to $BG_DIR${RC}" printf "%b\n" "${GREEN}Downloaded desktop backgrounds to $BG_DIR${RC}"
else else
@ -261,9 +264,6 @@ setupDisplayManager() {
;; ;;
esac esac
fi fi
} }
install_slstatus() { install_slstatus() {

View File

@ -2,8 +2,9 @@
. ../common-script.sh . ../common-script.sh
setupFastfetch() { installFastfetch() {
printf "%b\n" "${YELLOW}Installing Fastfetch if not already installed...${RC}" 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)
@ -29,5 +30,5 @@ setupFastfetchConfig() {
checkEnv checkEnv
checkEscalationTool checkEscalationTool
setupFastfetch installFastfetch
setupFastfetchConfig setupFastfetchConfig

View File

@ -2,7 +2,7 @@
. ../common-script.sh . ../common-script.sh
setupKitty() { installKitty() {
printf "%b\n" "${YELLOW}Install Kitty if not already installed...${RC}" 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
@ -19,7 +19,7 @@ setupKitty() {
} }
setupKittyConfig() { setupKittyConfig() {
printf "%b\n" "${YELLOW}Copy Kitty config files${RC}" 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() {
printf "%b\n" "${YELLOW}Install mybash if not already installed${RC}" 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

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() {
printf "%b\n" "${YELLOW}Install Neovim if not already installed${RC}" 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() {
printf "%b\n" "${YELLOW}Install Rofi if not already installed...${RC}" 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)
@ -19,7 +19,7 @@ setupRofi() {
} }
setupRofiConfig() { setupRofiConfig() {
printf "%b\n" "${YELLOW}Copy Rofi config files${RC}" 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() {
printf "%b\n" "${YELLOW}Install ZSH if not already installed...${RC}" printf "%b\n" "${YELLOWInstalling Zsh...${RC}"
if ! command_exists zsh; then if ! command_exists zsh; then
case "$PACKAGER" in case "$PACKAGER" in
pacman) pacman)
@ -20,7 +20,8 @@ install_zsh() {
} }
# 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

@ -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,7 +19,7 @@ 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}"
printf "%b\n" "${YELLOW}Disabling UFW${RC}" printf "%b\n" "${YELLOW}Disabling UFW${RC}"
$ESCALATION_TOOL ufw disable $ESCALATION_TOOL ufw disable

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

@ -61,7 +61,7 @@ fastUpdate() {
} }
updateSystem() { updateSystem() {
printf "%b\n" "${GREEN}Updating system${RC}" printf "%b\n" "${YELLOW}Updating system${RC}"
case ${PACKAGER} in case ${PACKAGER} in
nala|apt-get) nala|apt-get)
$ESCALATION_TOOL "${PACKAGER}" update -y $ESCALATION_TOOL "${PACKAGER}" update -y

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 {