305 lines
9.1 KiB
Bash
Executable File
305 lines
9.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
clear
|
|
current_user="$(whoami)"
|
|
selected_user=""
|
|
|
|
pause() {
|
|
read -rp "Press Enter to continue..."
|
|
}
|
|
|
|
# ========================
|
|
# OS & DEPENDENCIES
|
|
# ========================
|
|
install_dependencies() {
|
|
echo "============================================="
|
|
echo "[ Checking and installing dependencies... ]"
|
|
echo "============================================="
|
|
|
|
local need_jq=0
|
|
local need_curl=0
|
|
|
|
if ! command -v jq >/dev/null 2>&1; then
|
|
need_jq=1
|
|
fi
|
|
if ! command -v curl >/dev/null 2>&1; then
|
|
need_curl=1
|
|
fi
|
|
|
|
if [[ $need_jq -eq 0 && $need_curl -eq 0 ]]; then
|
|
echo " -> Dependencies (jq, curl) are already installed."
|
|
return 0
|
|
fi
|
|
|
|
local sudo_cmd=""
|
|
if [[ "$EUID" -ne 0 ]] && command -v sudo >/dev/null 2>&1; then
|
|
sudo_cmd="sudo"
|
|
fi
|
|
|
|
# Distro detection
|
|
local distro=""
|
|
if [[ -f /etc/os-release ]]; then
|
|
# shellcheck disable=SC1091
|
|
source /etc/os-release
|
|
distro="${ID:-unknown}"
|
|
echo " -> Detected OS: ${PRETTY_NAME:-$distro}"
|
|
fi
|
|
|
|
echo " -> Installing required packages (jq, curl)..."
|
|
|
|
if command -v apt-get >/dev/null 2>&1; then
|
|
echo " -> Using apt package manager..."
|
|
$sudo_cmd apt-get update -qq && $sudo_cmd apt-get install -y jq curl
|
|
elif command -v dnf >/dev/null 2>&1; then
|
|
echo " -> Using dnf package manager..."
|
|
$sudo_cmd dnf install -y jq curl
|
|
elif command -v yum >/dev/null 2>&1; then
|
|
echo " -> Using yum package manager..."
|
|
$sudo_cmd yum install -y jq curl
|
|
elif command -v pacman >/dev/null 2>&1; then
|
|
echo " -> Using pacman package manager..."
|
|
$sudo_cmd pacman -Sy --noconfirm jq curl
|
|
elif command -v zypper >/dev/null 2>&1; then
|
|
echo " -> Using zypper package manager..."
|
|
$sudo_cmd zypper --non-interactive in jq curl
|
|
elif command -v apk >/dev/null 2>&1; then
|
|
echo " -> Using apk package manager..."
|
|
$sudo_cmd apk add --no-cache jq curl
|
|
elif command -v brew >/dev/null 2>&1; then
|
|
echo " -> Using Homebrew..."
|
|
brew install jq curl
|
|
else
|
|
echo " -> [WARNING] No supported package manager found. Please install 'jq' and 'curl' manually."
|
|
fi
|
|
|
|
if command -v jq >/dev/null 2>&1; then
|
|
echo " -> [OK] jq is installed."
|
|
else
|
|
echo " -> [WARNING] jq could not be installed automatically."
|
|
fi
|
|
}
|
|
|
|
select_user() {
|
|
while true; do
|
|
echo "----------------------------"
|
|
echo "Available users:"
|
|
echo "----------------------------"
|
|
grep -E ':/home/' /etc/passwd | cut -d: -f1
|
|
echo "q = exit"
|
|
echo "----------------------------"
|
|
|
|
read -rp "Type the user: " choice
|
|
|
|
if [[ "$choice" == "q" ]]; then
|
|
echo "Exiting..."
|
|
exit 1
|
|
elif [[ -d "/home/$choice" ]]; then
|
|
read -rp "Confirm user '$choice'? (y/N): " confirm
|
|
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
|
|
selected_user="$choice"
|
|
return
|
|
fi
|
|
else
|
|
echo "User '$choice' not valid!"
|
|
pause
|
|
fi
|
|
done
|
|
}
|
|
|
|
# ========================
|
|
# USER SELECTION
|
|
# ========================
|
|
while true; do
|
|
echo "### brc-script installer ###"
|
|
echo "---------------------------------------------"
|
|
echo "Install for current user ($current_user)?"
|
|
echo "---------------------------------------------"
|
|
echo " y - yes"
|
|
echo " n - choose another user"
|
|
echo " q - exit"
|
|
echo " default - yes"
|
|
echo "---------------------------------------------"
|
|
|
|
read -rp "Choice: " choice
|
|
|
|
case "$choice" in
|
|
n)
|
|
select_user
|
|
break
|
|
;;
|
|
q)
|
|
echo "Exiting..."
|
|
exit 1
|
|
;;
|
|
*)
|
|
read -rp "Confirm current user '$current_user'? (Y/n): " confirm
|
|
if [[ "$confirm" == "y" || "$confirm" == "Y" || -z "$confirm" ]]; then
|
|
selected_user="$current_user"
|
|
break
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
clear
|
|
done
|
|
|
|
# ========================
|
|
# DEPENDENCIES CHECK
|
|
# ========================
|
|
install_dependencies
|
|
|
|
# ========================
|
|
# VARIABLES
|
|
# ========================
|
|
|
|
if [ "$selected_user" == "root" ]; then
|
|
home="/root"
|
|
bashrc="$home/.bashrc"
|
|
else
|
|
home="/home/$selected_user"
|
|
bashrc="$home/.bashrc"
|
|
fi
|
|
|
|
mainfolder="$home/.bashrc.d"
|
|
neededfolder="$mainfolder/scripts-needed"
|
|
availablefolder="$mainfolder/scripts-available"
|
|
enabledfolder="$mainfolder/scripts-enabled"
|
|
removedfolder="$mainfolder/scripts-removed"
|
|
|
|
script_dir="$(cd "$(dirname "$0")" && pwd)"
|
|
|
|
# ========================
|
|
# CREATE DIRECTORIES
|
|
# ========================
|
|
echo ""
|
|
echo "[ Creating modular directories... ]"
|
|
|
|
mkdir -p "$neededfolder"
|
|
mkdir -p "$availablefolder"
|
|
mkdir -p "$enabledfolder"
|
|
mkdir -p "$removedfolder"
|
|
|
|
# ========================
|
|
# BACKUP AND MIGRATE .bashrc
|
|
# ========================
|
|
backup_file="$home/bashrc-backup-$(date +%F_%H-%M-%S)"
|
|
|
|
if [[ -f "$bashrc" ]]; then
|
|
cp "$bashrc" "$backup_file"
|
|
echo "[ Backup created at $backup_file ]"
|
|
|
|
# Check if existing bashrc has meaningful content (excluding empty lines and existing modular block)
|
|
cleaned_bashrc=$(grep -v "Modular Bashrc" "$bashrc" | grep -v "scripts-needed" | grep -v "scripts-enabled" | grep -v "scripts-available" | tr -d '[:space:]')
|
|
|
|
if [[ -n "$cleaned_bashrc" ]]; then
|
|
echo "[ Migrating existing .bashrc content into 00_default.sh... ]"
|
|
cat << 'EOF' > "$availablefolder/00_default.sh"
|
|
#!/bin/bash
|
|
# ============================================================
|
|
# Modular Bashrc - 00_default.sh
|
|
# Migrated automatically from your pre-existing ~/.bashrc
|
|
# Add your custom exports, aliases and functions here!
|
|
# ============================================================
|
|
|
|
EOF
|
|
cat "$bashrc" >> "$availablefolder/00_default.sh"
|
|
echo "" >> "$availablefolder/00_default.sh"
|
|
|
|
# Automatically enable 00_default.sh so user keeps their previous configuration active
|
|
ln -sf "$availablefolder/00_default.sh" "$enabledfolder/00_default.sh"
|
|
echo " -> [OK] 00_default.sh created and enabled in scripts-enabled/"
|
|
else
|
|
if [[ -f "$script_dir/00_default.sh" ]]; then
|
|
cp "$script_dir/00_default.sh" "$availablefolder/00_default.sh"
|
|
echo " -> Copied standard 00_default.sh template"
|
|
fi
|
|
fi
|
|
else
|
|
echo "[ WARNING: .bashrc not found, creating modular base ]"
|
|
if [[ -f "$script_dir/00_default.sh" ]]; then
|
|
cp "$script_dir/00_default.sh" "$availablefolder/00_default.sh"
|
|
fi
|
|
fi
|
|
|
|
# ========================
|
|
# WRITE CLEAN .bashrc
|
|
# ========================
|
|
if [[ -f "$script_dir/NEEDED-FOR-INSTALLER" ]]; then
|
|
cat "$script_dir/NEEDED-FOR-INSTALLER" > "$bashrc"
|
|
echo "[ Updated .bashrc with clean modular loader ]"
|
|
else
|
|
echo "[ ERROR: NEEDED-FOR-INSTALLER missing ]"
|
|
exit 1
|
|
fi
|
|
|
|
# ========================
|
|
# COPY NEEDED SCRIPTS
|
|
# ========================
|
|
needed_to_copy="$script_dir/scripts-needed"
|
|
if [[ -d "$needed_to_copy" ]]; then
|
|
cp -r "$needed_to_copy"/* "$neededfolder/"
|
|
chmod 750 "$neededfolder"/*.sh 2>/dev/null
|
|
echo "[ Main logic scripts installed in scripts-needed ]"
|
|
fi
|
|
|
|
# ========================
|
|
# COPY DEFAULT SCRIPTS
|
|
# ========================
|
|
echo "[ Installing default available scripts... ]"
|
|
|
|
default_scripts=(
|
|
"01_git-cli-highlitgh.sh"
|
|
"02_git-cli-highlitgh-root.sh"
|
|
"03_bashboard.sh"
|
|
"04_aliases.sh"
|
|
)
|
|
|
|
for script in "${default_scripts[@]}"; do
|
|
if [[ -f "$script_dir/$script" ]]; then
|
|
cp "$script_dir/$script" "$availablefolder/"
|
|
echo " -> Copied $script"
|
|
else
|
|
echo " -> WARNING: $script not found"
|
|
fi
|
|
done
|
|
|
|
# Save version/commit information if inside git repo
|
|
repo_dir="$(cd "$script_dir/.." && pwd)"
|
|
if git -C "$repo_dir" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
current_commit=$(git -C "$repo_dir" rev-parse HEAD 2>/dev/null)
|
|
echo "$current_commit" > "$mainfolder/.version"
|
|
else
|
|
date +%s > "$mainfolder/.version"
|
|
fi
|
|
|
|
# Fix ownership if running as root for a normal user
|
|
if [[ "$current_user" == "root" && "$selected_user" != "root" ]]; then
|
|
chown -R "$selected_user":"$selected_user" "$mainfolder" "$bashrc" "$backup_file" 2>/dev/null
|
|
fi
|
|
|
|
# ========================
|
|
# FINAL MESSAGE
|
|
# ========================
|
|
echo ""
|
|
echo "##################################"
|
|
echo " Installation Done "
|
|
echo "##################################"
|
|
echo ""
|
|
echo "Scripts available in:"
|
|
echo " $availablefolder"
|
|
echo ""
|
|
echo "Use commands:"
|
|
echo " brc-script -> manage scripts"
|
|
echo " brc-script -l -> list scripts"
|
|
echo " brc-script -p -> preview script (with line numbers)"
|
|
echo " brc-script -v -> cat script (plain code)"
|
|
echo " brc-script -e -> enable script(s)"
|
|
echo " brc-script -d -> disable script(s)"
|
|
echo " brc-script --update -> check Gitea updates"
|
|
echo " brc-script --upgrade -> upgrade scripts"
|
|
echo " refresh-brc -> reload config"
|
|
echo ""
|
|
echo "##################################"
|
|
echo " Thanks for using Modular Bashrc! "
|
|
echo "##################################"
|