changed to setup script to /etc/skel
This commit is contained in:
124
install_dotfiles.sh
Executable file
124
install_dotfiles.sh
Executable file
@@ -0,0 +1,124 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
##########################
|
||||
# Color helpers (printf-safe, no tput)
|
||||
##########################
|
||||
RED="\033[0;31m"
|
||||
GREEN="\033[0;32m"
|
||||
YELLOW="\033[0;33m"
|
||||
CYAN="\033[0;36m"
|
||||
GRAY="\033[0;37m"
|
||||
BOLD="\033[1m"
|
||||
RESET="\033[0m"
|
||||
|
||||
# Disable colors if output is not a terminal
|
||||
if [ ! -t 1 ]; then
|
||||
RED="" GREEN="" YELLOW="" CYAN="" GRAY="" BOLD="" RESET=""
|
||||
fi
|
||||
|
||||
say_red() { printf "\n"; printf "%b%s%b\n" "$RED" "$*" "$RESET"; }
|
||||
say_green() { printf "\n"; printf "%b%s%b\n" "$GREEN" "$*" "$RESET"; }
|
||||
say_yellow() { printf "\n"; printf "%b%s%b\n" "$YELLOW" "$*" "$RESET"; }
|
||||
say_cyan() { printf "\n"; printf "%b%s%b\n" "$CYAN" "$*" "$RESET"; }
|
||||
say_gray() { printf "\n"; printf "%b%s%b\n" "$GRAY" "$*" "$RESET"; }
|
||||
say_bold() { printf "\n"; printf "%b%s%b\n" "$BOLD" "$*" "$RESET"; }
|
||||
|
||||
##########################
|
||||
# OS Detection
|
||||
##########################
|
||||
say_yellow "################### Start OS Detection"
|
||||
|
||||
source /etc/os-release
|
||||
|
||||
OS_ID="${ID,,}"
|
||||
OS_LIKE="${ID_LIKE:-}"
|
||||
OS_LIKE="${OS_LIKE,,}"
|
||||
OS_VERSION="${VERSION_ID:-unknown}"
|
||||
OS_PRETTY="$PRETTY_NAME"
|
||||
OS=""
|
||||
|
||||
case "$OS_ID" in
|
||||
arch) OS="arch" ;;
|
||||
debian) OS="debian" ;;
|
||||
ubuntu) OS="ubuntu" ;;
|
||||
fedora) OS="fedora" ;;
|
||||
*)
|
||||
if [[ "$OS_LIKE" == *"ubuntu"* ]]; then
|
||||
OS="ubuntu"
|
||||
elif [[ "$OS_LIKE" == *"arch"* ]]; then
|
||||
OS="arch"
|
||||
elif [[ "$OS_LIKE" == *"debian"* ]]; then
|
||||
OS="debian"
|
||||
elif [[ "$OS_LIKE" == *"fedora"* || "$OS_LIKE" == *"rhel"* ]]; then
|
||||
OS="fedora"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ -n "$OS" ]]; then
|
||||
say_cyan "Detected OS: $OS ($OS_PRETTY)"
|
||||
say_cyan "Version: $OS_VERSION"
|
||||
else
|
||||
say_red "ERROR: Unsupported or unknown Linux distribution."
|
||||
say_red "Detected: ID=$OS_ID, ID_LIKE=${OS_LIKE:-empty}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
say_yellow "End Detection"
|
||||
|
||||
##########################
|
||||
# Copy Dotfiles Logic
|
||||
##########################
|
||||
say_yellow "################### Start Copy Dotfiles"
|
||||
|
||||
# The directory where the script is located (containing arch, debian, etc. folders)
|
||||
SCRIPT_DIR="$(dirname "$(realpath "$0")")"
|
||||
# The source directory for the detected OS
|
||||
DOTFILES_SRC_DIR="$SCRIPT_DIR/$OS"
|
||||
# The target directory
|
||||
TARGET_DIR="/etc/skel"
|
||||
|
||||
# 1. Check if the source directory for the detected OS exists
|
||||
if [[ ! -d "$DOTFILES_SRC_DIR" ]]; then
|
||||
say_red "ERROR: Distribution-specific dotfiles directory not found: $DOTFILES_SRC_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
say_cyan "Source Directory: $DOTFILES_SRC_DIR"
|
||||
say_cyan "Target Directory: $TARGET_DIR"
|
||||
|
||||
# 2. Check for root/sudo privileges (required for writing to /etc/skel)
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
say_red "ERROR: This script must be run with root/sudo privileges to write to $TARGET_DIR."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 3. Perform the copy operation
|
||||
# The 'cp -r' command copies the *contents* of the source directory (DOTFILES_SRC_DIR)
|
||||
# to the target directory (TARGET_DIR), overwriting existing files silently.
|
||||
# The 'cp -rT' flag is often safer to ensure the contents are copied, not the directory itself.
|
||||
# On systems that don't support 'T', using a trailing '/' on the source is safer: cp -r "$DOTFILES_SRC_DIR/" "$TARGET_DIR"
|
||||
|
||||
say_bold "Copying contents of $OS dotfiles to $TARGET_DIR..."
|
||||
|
||||
# Use rsync for a more robust and flexible copy/sync operation
|
||||
# -a: archive mode (preserves permissions, ownership, timestamps)
|
||||
# -v: verbose
|
||||
# -r: recursive (rsync is usually recursive by default, but included for clarity)
|
||||
# --delete: optional, removes files in TARGET_DIR that are not in DOTFILES_SRC_DIR (be careful with this!)
|
||||
|
||||
if command -v rsync >/dev/null 2>&1; then
|
||||
# Ensure a trailing slash on the source to copy contents *of* the directory
|
||||
rsync -avz "$DOTFILES_SRC_DIR/" "$TARGET_DIR"
|
||||
say_green "Successfully synchronized dotfiles using rsync."
|
||||
else
|
||||
# Fallback to cp if rsync is not available
|
||||
say_yellow "rsync not found. Falling back to 'cp -r'."
|
||||
cp -r "$DOTFILES_SRC_DIR/." "$TARGET_DIR"
|
||||
say_green "Successfully copied dotfiles using cp."
|
||||
fi
|
||||
|
||||
say_green "Dotfiles for $OS copied to $TARGET_DIR."
|
||||
|
||||
say_yellow "End Copy Dotfiles"
|
||||
Reference in New Issue
Block a user