#!/bin/bash function show_help { echo "This is the help" } while getopts "h?vyi:acrbm:" opt; do case "$opt" in h|\?) show_help; exit 0 ;; v) P_Verbose=1 ;; d) P_Debug=1 ;; y) P_Yes=1 ;; a) P_APT=1 ;; c) P_CONFIG=1 ;; r) P_RC=1 ;; b) P_BINARY=1 ;; i) P_Install=$OPTARG ;; m) ARCH=$OPTARG ;; esac done ASK="\e[34m" INFO="\e[91m\e[1m" ADD="\e[32m\e[1m" ENDCOLOR="\e[0m" HOME_PATH="$HOME" TMP_PATH="$HOME_PATH/tmp/kamu_install" CONFIG_PATH="$HOME_PATH/.config" BINARY_PATH="/usr/bin" RC_FILE=".zshrc" ARCH=$(/usr/bin/dpkg --print-architecture) function log { color $1 "[$2]" echo "$3" } function log_add { log $ADD "+" "$1" } function log_info { log $INFO "*" "$1" } function log_error { log $ERROR "!" "$1" } function log_debug { if [ -z "$P_Debug" ]; then return 0; fi log $INFO "&" "$1" } function ask { color $ASK "[?]" read -d '' -p "$1 [Y/n] " -N 1 -r } function color { echo -en "$1$2$ENDCOLOR " } function user_confirm { if [ ! -z "$P_Yes" ]; then return 0; fi ask "$1" while [ true ]; do if [[ ! $REPLY =~ ^[$'\n']$ ]]; then echo -e -n "\n"; fi case $REPLY in [Yy$'\n']* ) return 0;; [Nn]* ) return 1;; * ) ask "Please enter";; esac done } function user_confirm_overwrite { user_confirm "$1 already exists. Do you want to overwrite?" return $? } function download_config { mkdir -p "$CONFIG_PATH/$1/" FILE="$CONFIG_PATH/$1/$2" if [ ! -e "$FILE" ] || user_confirm_overwrite "$FILE"; then wget -O "$FILE" "$3" > /dev/null 2>&1 log_add "Added $FILE" fi } function install_rc { # Make sure the directory exists mkdir -p "$CONFIG_PATH/$1/" # This is the config file FILE="$CONFIG_PATH/$1/.$1.rc" # Does the file already exist? or does the user want to overwrite it? if [ ! -e "$FILE" ] || user_confirm_overwrite "$FILE"; then # Download the file and save it wget -O "$FILE" "$2" > /dev/null 2>&1 log_add "Added $FILE" fi # Add the file to the rc file as source $file SOURCE_CMD=$( echo "source $FILE" ) RC="$HOME_PATH/$RC_FILE" if ! cat "$RC" | grep "$SOURCE_CMD" > /dev/null; then echo "$SOURCE_CMD" >> "$RC" log_add "Added \"$SOURCE_CMD\" to $RC" else log_info "\"$SOURCE_CMD\" already in $RC" fi # Add the file to the rc file as source $file in root RC_ROOT="/root/$RC_FILE" if ! sudo cat "$RC_ROOT" | grep "$SOURCE_CMD" > /dev/null; then echo "$SOURCE_CMD" | sudo tee -a "$RC_ROOT" log_add "Added \"$SOURCE_CMD\" to $RC_ROOT" else log_info "\"$SOURCE_CMD\" already in $RC_ROOT" fi } function init_install_rc { # Add the file to the rc file as source $file SOURCE_CMD="$1" RC="$HOME_PATH/$RC_FILE" if ! cat "$RC" | grep "$SOURCE_CMD" > /dev/null; then echo "$SOURCE_CMD" >> "$RC" log_add "Added \"$SOURCE_CMD\" to $RC" else log_info "\"$SOURCE_CMD\" already in $RC" fi # Add the file to the rc file as source $file in root RC_ROOT="/root/$RC_FILE" if ! sudo cat "$RC_ROOT" | grep "$SOURCE_CMD" > /dev/null; then echo "$SOURCE_CMD" | sudo tee -a "$RC_ROOT" log_add "Added \"$SOURCE_CMD\" to $RC_ROOT" else log_info "\"$SOURCE_CMD\" already in $RC_ROOT" fi } function install_deb_check { CHECK_CURRENT=$(dpkg -s "$1" | grep -E "Status|Version") INSTALLED_CURRENT=$(echo $CHECK_CURRENT | grep -oE "Status: .*" | cut -d ' ' -f 2) VERSION_CURRENT=$(echo $CHECK_CURRENT | grep -oE "Version: .*" | cut -d ' ' -f 2) CHECK_NEW=$(sudo dpkg -I $TMP_PATH/$1.deb | grep -E "Status|Version") INSTALLED_NEW=$(echo $CHECK_NEW | grep -oE "Status: .*" | cut -d ' ' -f 2) VERSION_NEW=$(echo $CHECK_NEW | grep -oE "Version: .*" | cut -d ' ' -f 2) if [ ! -z "$CHECK_CURRENT" ]; then if [[ "$VERSION_CURRENT" != "$VERSION_NEW" ]]; then log_info "$1 ($VERSION_CURRENT) is installed." else log_info "$1 ($VERSION_CURRENT) is already installed. Skipping ..." return 1 fi if ! user_confirm "Do you want to install $1 ($VERSION_NEW)?"; then return 1 fi fi return 0 } function install_deb { if [ ! -z "$P_" ]; then return 0; fi log_info "Downloading $2 to $TMP_PATH ..." wget -O $TMP_PATH/$1.deb $2 > /dev/null 2>&1 if ! install_deb_check $1; then return 1 fi INSTALL=$(sudo dpkg -i $TMP_PATH/$1.deb) UNPACK=$(echo -n "$INSTALL" | grep -oE "Unpacking .*") PROG=$(echo -n $UNPACK | cut -d '(' -f 1 | cut -d ' ' -f 2) CURR_VERSION=$(echo -n $UNPACK | cut -d '(' -f 2 | cut -d ')' -f 1) PREV_VERSION=$(echo -n $UNPACK | cut -d '(' -f 3 | cut -d ')' -f 1) color $ADD "[+]" echo -n "Installed $PROG ($CURR_VERSION)" if [ ! -z ${PREV_VERSION+x} ]; then echo " over ($PREV_VERSION)" else echo "" fi #rm $TMP_PATH/$1.deb return 0 } function init { log_info "Found Architecture: $ARCH" if ! user_confirm "Is '$ARCH' the correct architecture to download programs?"; then log_info "Exiting ..." exit 0 fi log_info "Running apt update ..." sudo apt update > /dev/null 2>&1 mkdir -p $TMP_PATH/ mkdir -p $CONFIG_PATH/ } function cleanup { rm -R $TMP_PATH } function apt_install { RESULT=$(sudo apt install -y $1 2>&1 ) if echo "$1 is already the newest version" | grep "$RESULT" > /dev/null; then log_info "$1 is already installed" else log_add "Installed $1" fi } function github_latest { VERSION=$(curl -I "https://github.com/$1/releases/latest/" 2> /dev/null | grep -iE "^Location:" | tr -s ' ' | cut -d '/' -f 8 2> /dev/null) echo -n ${VERSION//[$'\t\r\n']} } function install_deb_github { local PATTERN=${3/ARCH/$ARCH}; log_debug "Loading most recent version for $1" local VERSION=$(github_latest $2 2> /dev/null ) VERSION=${VERSION/v/} log_debug "Found version $VERSION" local FILE=${PATTERN/VERSION/$VERSION} local LINK="https://github.com/$2/releases/latest/download/$FILE" log_debug "Download link: $LINK" install_deb "$1" ${LINK//[$'\t\r\n']} } function git_clone { CLONE=$(git clone "$1" "$2" 2>&1) if [[ $CLONE =~ "already exists" ]]; then log_debug "$1 already exists. Running 'git pull'." PULL=$(git -C "$2" pull) log_info "$PULL" fi } function install_binary { log_info "Downloading $2 to $BINARY_PATH ..." sudo wget -O $BINARY_PATH/$1 $2 > /dev/null 2>&1 sudo chmod +x $BINARY_PATH/$1 } function install_binary_github { local PATTERN=${3/ARCH/$ARCH}; log_debug "Loading most recent version for $1" VERSION=$(github_latest $2 2> /dev/null) VERSION=${VERSION/v/} log_debug "Found version $VERSION" local FILE=${PATTERN/VERSION/$VERSION} local LINK="https://github.com/$2/releases/latest/download/$FILE" log_debug "Download link: $LINK" install_binary "$1" ${LINK//[$'\t\r\n']} } function set_shell { CURR_U=$(grep "^$USER" /etc/passwd | cut -d ':' -f 7 | cut -d '/' -f 4) CURR_R=$(grep "^root" /etc/passwd | cut -d ':' -f 7 | cut -d '/' -f 4) if [[ $1 != $CURR_U ]]; then log_add "Setting default shell to $1" sudo -u $USER chsh -s $(which $1) sudo chsh -s $(which $1) else log_info "Shell already set to $1" fi } # -------------------------------------------------------------------------------------------------- init # ----------------- # zsh # ----------------- apt_install zsh set_shell zsh # --- TODO --- : Keyboard navigation, Suggestions, ... # ----------------- # General Config # ----------------- init_install_rc "export KHOME=$HOME_PATH" init_install_rc "export XDG_CONFIG_HOME=$CONFIG_PATH" install_rc "shell" "https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/.general.rc" # ----------------- # tmux # ----------------- apt_install tmux download_config tmux tmux.conf https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/.tmux.conf download_config tmux tmux.theme https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/.tmux.theme download_config tmux myip.sh https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/myip.sh sudo chmod +x ${CONFIG_HOME}/tmux/myip.sh install_rc tmux https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/.tmux.rc git_clone "https://github.com/tmux-plugins/tpm" "$HOME/.tmux/plugins/tpm" # ----------------- # unp # ----------------- apt_install unp # --- TODO --- : rc file # ----------------- # bat # ----------------- install_deb_github bat "sharkdp/bat" "bat_VERSION_ARCH.deb" install_rc bat https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/.bat.rc # ----------------- # Install lsd https://github.com/Peltoche/lsd # ----------------- install_deb_github "lsd" "lsd-rs/lsd" "lsd_VERSION_ARCH.deb" install_rc lsd https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/.lsd.rc download_config lsd "config.yaml" "https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/.lsd.conf" download_config lsd "themes/kamu.yaml" "https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/.lsd.theme" #wget -O .zshrc https://git.grml.org/f/grml-etc-core/etc/zsh/zshrc # ----------------- # Install OhMyPosh # ----------------- download_config "omp" "omp.json" "https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/.omp.json" install_rc "omp" "https://git.cbeck.tech/kamu/dotfiles/raw/branch/main/.omp.rc" install_binary_github "oh-my-posh" "JanDeDobbeleer/oh-my-posh" "posh-linux-ARCH" #git clone https://github.com/zsh-users/zsh-autosuggestions "$HOME/.config/zsh/zsh-autosuggestions" # source ~/.config/zsh/zsh-autosuggestions/zsh-autosuggestions.zsh cleanup exit 0