#!/bin/bash # dotfiles -- install # author: johannst gInstallConfigFile=install.config #"::" gToolsConfig=( "bashrc:bash:bashrcInstaller" "gdb:gdb:gdbrcInstaller" "cgdb:cgdb:cgdbrcInstaller" "conkyrc:conky:conkyrcInstaller" "gitconfig:git:gitConfigInstaller" "tmux.conf:tmux:tmuxConfigInstaller" "vimrc:vim:vimConfigInstaller" "Xresources:xterm:xtermConfigInstaller" "i3config:i3:i3ConfigInstaller" "i3status:i3status:i3statusConfigInstaller" "i3blocks:i3blocks:i3blocksConfigInstaller" "termite:termite:termiteConfigInstaller" "zshrc:zsh:zshrcInstaller" ) gMagicNumber=e2718281 ABS_BASE_DIR=$(readlink -f $(dirname $0)) #{{{ bashrcInstaller function bashrcInstaller() { local bashrc=~/.bashrc touch $bashrc grep $gMagicNumber $bashrc > /dev/null 2>&1 if [[ $? = 0 ]]; then return 1 fi echo -e "\n# $gMagicNumber - Auto generated, do not delete or modify!" >> $bashrc echo -e "source $ABS_BASE_DIR/bashrc" >> $bashrc return 0 } #}}} #{{{ gdbrcInstaller function gdbrcInstaller() { local gdbinit=~/.gdbinit local gdbdir=~/.gdb touch $gdbinit grep $gMagicNumber $gdbinit > /dev/null 2>&1 if [[ $? = 0 ]]; then return 1 fi if [ ! -d $gdbdir ]; then mkdir $gdbdir; fi echo -e "\n# $gMagicNumber - Auto generated, do not delete or modify!" >> $gdbinit echo -e "source $ABS_BASE_DIR/gdbinit" >> $gdbinit } #}}} #{{{ cgdbrcInstaller function cgdbrcInstaller() { echo "cgdbrcInstaller called" return 1 } #}}} #{{{ conkyrcInstaller function conkyrcInstaller() { echo "conkyrcInstaller called" return 1 } #}}} #{{{ gitConfigInstaller function gitConfigInstaller() { local gitconf=~/.gitconfig touch $gitconf grep $gMagicNumber $gitconf > /dev/null 2>&1 if [[ $? = 0 ]]; then return 1 fi echo -e "\n# $gMagicNumber - Auto generated, do not delete or modify!" >> $gitconf echo -e "[include]" >> $gitconf echo -e " path = $ABS_BASE_DIR/gitconfig" >> $gitconf return 0 } #}}} #{{{ tmuxConfigInstaller function tmuxConfigInstaller() { local tmuxconf=~/.tmux.conf touch $tmuxconf grep $gMagicNumber $tmuxconf > /dev/null 2>&1 if [[ $? = 0 ]]; then return 1 fi echo -e "\n# $gMagicNumber - Auto generated, do not delete or modify!" >> $tmuxconf echo -e "source-file $ABS_BASE_DIR/tmux.conf" >> $tmuxconf return 0 } #}}} #{{{ vimConfigInstaller function vimConfigInstaller() { local vimrc=~/.vimrc local vim_home=~/.vim touch $vimrc grep $gMagicNumber $vimrc > /dev/null 2>&1 if [[ $? = 0 ]]; then return 1 fi mkdir $vim_home > /dev/null 2>&1 ln -s $ABS_BASE_DIR/vim/* $vim_home > /dev/null 2>&1 echo -e "\n\" $gMagicNumber - Auto generated, do not delete or modify!" >> $vimrc echo -e "let \$MYVIMRC='$ABS_BASE_DIR/vimrc'" >> $vimrc echo -e "let \$VIMHOME='$vim_home'" >> $vimrc # link ctags type ctags >/dev/null 2>&1 && { echo -e "let \$MYCTAGS='$(which ctags)'" >> $vimrc; } echo -e "source $ABS_BASE_DIR/vimrc" >> $vimrc echo -e 'if filereadable(expand("~/.vimrc_background")) && g:gBase16ColorEnabled == 1' >> $vimrc echo -e '\tlet base16colorspace=256' >> $vimrc echo -e '\tsource ~/.vimrc_background' >> $vimrc echo -e 'endif' >> $vimrc git clone https://github.com/VundleVim/Vundle.vim.git $vim_home/bundle/Vundle.vim || { echo "Vundle not cloned, using existing!"; } vim +PluginUpdate +qall -c "q" return 0 } #}}} #{{{ xtermConfigInstaller function xtermConfigInstaller() { echo "xtermConfigInstaller called" return 1 } #}}} #{{{ i3ConfigInstaller function i3ConfigInstaller() { local i3_home=~/.i3 local i3_conf=$i3_home/config mkdir $i3_home 2> /dev/null if [ -f $i3_conf ]; then return 1 fi cp i3wm.conf $i3_conf return 0 } #}}} #{{{ i3statusConfigInstaller function i3statusConfigInstaller() { local i3_home=~/.i3 local i3_status_conf=$i3_home/i3status.conf mkdir $i3_home 2> /dev/null if [ -f $i3_status_conf ]; then return 1 fi cp i3status.conf $i3_status_conf local nif=$(ip link show | grep ^[1-9] | grep -v LOOPBACK | sed 's/ //g' | cut -d ':' -f 2) local num_wlanif=$(echo -e $nif | tr ' ' '\n' | grep wl | wc -l) local wlanif=$(echo -e $nif | tr ' ' '\n' | grep wl) if [[ $num_wlanif != 1 || -z $wlanif ]]; then echo "[Warning]: i3statusConfigInstaller couldn't find name of WIFI IF!" sed -i '/__DEF__WIFI_START__/,/__DEF__WIFI_END__/d' $i3_status_conf else sed -i "s/__NIF_WIFI__/$wlanif/g" $i3_status_conf fi local num_ethif=$(echo -e $nif | tr ' ' '\n' | grep en | wc -l) local ethif=$(echo -e $nif | tr ' ' '\n' | grep en) if [[ $num_ethif != 1 || -z $ethif ]]; then echo "[Warning]: i3statusConfigInstaller couldn't find name of ETH IF!" sed -i '/__DEF__ETH_START__/,/__DEF__ETH_END__/d' $i3_status_conf else sed -i "s/__NIF_ETH__/$ethif/g" $i3_status_conf fi sed -i '/__DEF__.*__/d' $i3_status_conf return 0 } #}}} #{{{ i3blocksConfigInstaller function i3blocksConfigInstaller() { local i3_home=~/.i3 local i3_blocks_conf=$i3_home/i3blocks.conf mkdir $i3_home 2> /dev/null if [ -f $i3_blocks_conf ]; then return 1 fi cp i3blocks.conf $i3_blocks_conf return 0 } #}}} #{{{ termiteConfigInstaller function termiteConfigInstaller() { local tm_dir=~/.config/termite local tm_conf=$tm_dir/config [[ ! -d $tm_dir ]] && mkdir -p $tm_dir touch $tm_conf grep $gMagicNumber $tm_conf > /dev/null 2>&1 if [[ $? = 0 ]]; then return 1 fi echo -e "\n# $gMagicNumber - Auto generated, do not delete or modify!" >> $tm_conf echo -e "$(cat termite)" >> $tm_conf return 0 } #}}} #{{{ zshrcInstaller function zshrcInstaller() { local zshrc=~/.zshrc touch $zshrc grep $gMagicNumber $zshrc > /dev/null 2>&1 if [[ $? = 0 ]]; then return 1 fi echo -e "\n# $gMagicNumber - Auto generated, do not delete or modify!" >> $zshrc echo -e "source $ABS_BASE_DIR/zshrc" >> $zshrc return 0 } #}}} #{{{ Installer Main Loop function main() { # parse gInstallConfigFile to see what should be installed local configToInstall=() while read line; do if [[ ! $line =~ ^[yYnN][[:blank:]]?- ]]; then continue fi local flag=$(echo $line | cut -d '-' -f 1 | sed 's/ //g') if [[ $flag =~ ^[yY]$ ]]; then local config=$(echo $line | cut -d '-' -f 2 | sed 's/ //g') configToInstall+=("$config") fi done < $gInstallConfigFile echo "[Info]: List of tags found to install:" for conf in ${configToInstall[@]}; do echo -e "\t$conf" done echo "Install this configs? [yY/nN]" read go_install [[ $go_install =~ ^[^yY]$ ]] && exit 0 for conf in ${configToInstall[@]}; do installConfig $conf done } #}}} #{{{ Installer Core installConfig() { local config=$1 local binary=$(getDepenentBinaryName $config) isBinaryInstalled $binary if [[ $? -eq 1 ]]; then echo "[Warning]: Skipping $config... $binary is not installed!" return fi local installerFctPtr=$(getConfigInstallerFctPtr $config) if [[ -z $installerFctPtr ]]; then echo "[Warning]: Skipping $config... installer function pointer lookup error!" return fi isInstallerDefined $installerFctPtr if [[ $? -eq 1 ]]; then echo "[Warning]: Skipping $config... $installerFctPtr not defined!" return fi echo "[Info]: Intalling config for $binary using $installerFctPtr!" $installerFctPtr if [[ $? -eq 1 ]]; then echo "[Info]: $config already installed!" return fi echo "[Info]: $config sucessfully installed!" } getValue() { local search_key=$1 for k in ${gToolsConfig[@]}; do local key=$(echo $k | cut -d ':' -f 1) if [[ "$key" == "$search_key" ]]; then local entry=$(echo $k | cut -d ':' -f 2,3) echo ${entry} break fi done } getDepenentBinaryName() { local result=$(echo $(getValue $1) | cut -d ':' -f 1) echo $result } getConfigInstallerFctPtr() { local result=$(echo $(getValue $1) | cut -d ':' -f 2) echo $result } isBinaryInstalled() { local binary=$1 type $binary >/dev/null 2>&1 || { return 1; } return 0 } isInstallerDefined () { local func=$1 declare -F $func >/dev/null 2>&1 || { return 1; } return 0 } #}}} main