From 34409a2e523edd4cae2e32b01e3e57093cb5b8c4 Mon Sep 17 00:00:00 2001 From: Christopher Beckmann Date: Sun, 30 Apr 2023 03:33:02 +0200 Subject: [PATCH] Add 'install.sh' --- install.sh | 301 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 install.sh diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..2d441f2 --- /dev/null +++ b/install.sh @@ -0,0 +1,301 @@ +#!/bin/bash + +function show_help { + echo "This is the help" +} + +while getopts "h?vyi:d" opt; do + case "$opt" in + h|\?) + show_help + exit 0 + ;; + v) + P_Verbose=1 + ;; + d) + P_Debug=1 + ;; + y) + P_Yes=1 + ;; + i) + P_Install=$OPTARG + esac +done + +ASK="\e[34m" +INFO="\e[90m\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="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 +} + +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 { + 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 "$ARCH" + 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 to zsh +set_shell zsh + +# ----------------- +# tmux +# ----------------- +apt_install tmux +## Install Config and Theme +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 +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" + +# ----------------- +apt_install unp + +# ----------------- +# 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 glances + +# 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" + +################# +## zsh + +#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 \ No newline at end of file