#!/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 "##################################"