myshellconfig/bashrc_add

225 lines
7.6 KiB
Bash
Executable file

#!/bin/bash
#debug
#failure() {
# local lineno=$1
# local msg=$2
# echo "Failed at $lineno: $msg"
#}
#trap 'failure ${LINENO} "$BASH_COMMAND"' ERR
# set some variables to defaults, if not set in .bashrc
[ -z ${SSHS+x} ] && export SSHS=false
[ -z ${STARTTMUX+x} ] && export STARTTMUX=false
# check if we are a interactive shell
# https://guide.bash.academy/expansions/
# https://www.tldp.org/LDP/abs/html/refcards.html#AEN22473
if [[ $- = *i* ]] ; then
#echo "interactive shell" >&2
# define variables
# Base Path
[ -z "${MSC_SUBPATH+x}" ] && export MSC_SUBPATH=".local/myshellconfig"
[ -z "${MSC_BASE+x}" ] && export MSC_BASE="${HOME}/${MSC_SUBPATH}"
# hardcoded paths
export MSC_BASE_PARENT="$(dirname $MSC_BASE)"
export MSC_BASH_COMPLETION="${HOME}/${MSC_SUBPATH}/bash_completion.d"
export MSC_GIT_UPD_SUBMOD_STATFILE="${MSC_BASE%/}${MSC_BASE:+/}.last_update_submodules"
export MSC_GIT_UPD_REPO_STATFILE="${MSC_BASE%/}${MSC_BASE:+/}.last_update_repo"
# Load DEFAULTS
[ -e ${MSC_BASE}/defaults.conf ] && . ${MSC_BASE}/defaults.conf
# Userdata
[ -z "${USERNAME+x}" ] && export USERNAME="$USER"
[ -z "${USEREMAIL+x}" ] && export USEREMAIL="$USER@$(domainname -d)"
[ -z "${FULLNAME+x}" ] && export FULLNAME="$(getent passwd $USER | cut -d ":" -f 5 | cut -d ',' -f 1)"
# GIT
[ -z "${GIT_AUTHOR_NAME+x}" ] && export GIT_AUTHOR_NAME=$FULLNAME
[ -z "${GIT_AUTHOR_EMAIL+x}" ] && export GIT_AUTHOR_EMAIL=$USEREMAIL
[ -z "${GIT_COMMITTER_NAME+x}" ] && export GIT_COMMITTER_NAME=$FULLNAME
[ -z "${GIT_COMMITTER_EMAIL+x}" ] && export GIT_COMMITTER_EMAIL=$USEREMAIL
# [ -z "${MSC_GIT_TIMEOUT+x}" ] && export MSC_GIT_TIMEOUT=5s
[ -z "${MSC_GIT_CHECKOUT_TIMEOUT+x}" ] && export MSC_GIT_CHECKOUT_TIMEOUT=20s
[ -z "${MSC_GIT_SYNC+x}" ] && export MSC_GIT_SYNC=true
# hardcoded git
export SGIT="git -C ${MSC_BASE}"
# git-repo-url for vim plugin
# TODO: check how to use
export MSC_VIM_PLUGINS
# Logging
[ -z "${MSC_LOGDIR+x}" ] && export MSC_LOGDIR="${HOME}/logs"
[ -z "${MSC_LOGFILE+x}" ] && export MSC_LOGFILE="${MSC_LOGDIR}/myshellconfig.log"
[ -z "${SCRIPT_LOG+x}" ] && export SCRIPT_LOG="${MSC_LOGFILE}"
# Create necessary directories for logging
[ -n "${MSC_LOGDIR-x}" ] && mkdir -p "$MSC_LOGDIR"
# load logging functions
. ${MSC_BASE}/logging
# PKCS11_MODULE for etoken/smartcard authentification
[ -n "$(whereis p11-kit-proxy.so|awk '{print $2}')" ] && PKCS11_MODULE=$(whereis p11-kit-proxy.so|awk '{print $2}')
# Basics
[ -z "${VISUAL+x}" ] && export VISUAL=vim
[ -z "${EDITOR+x}" ] && export EDITOR=vim
cat << EOF >> "${MSC_LOGFILE}"
==8<=== start configure new shell ============== $(date) ===============8<==
EOF
SCRIPTENTRY
# define functions
ckrepo () {
# check if remote repo is reachable
if ${MSC_GIT_SYNC-$MSC_GIT_REPO_UPDATE}; then
if [ $(stat --printf %Y ${MSC_GIT_UPD_REPO_STATFILE} 2>/dev/null || echo 0 ) \
-lt $(date --date="${MSC_GIT_REPO_UPDATE_INTERVALL-${MSC_GIT_REPO_UPDATE_INTERVALL_DEFAULT}} hours ago" "+%s") ]; then
logwarn "check if reachable"
if $( timeout --foreground "${MSC_GIT_TIMEOUT-$MSC_GIT_TIMEOUT_DEFAULT}" $SGIT ls-remote >/dev/null 2>&1) ;then
logwarn "reachable"
return 0
else
logwarn "not reachable"
return 3
fi
else
local seconds=$(( $(date "+%s") - $(date --date="${MSC_GIT_REPO_UPDATE_INTERVALL-${MSC_GIT_REPO_UPDATE_INTERVALL_DEFAULT}} hours ago" "+%s") ))
logwarn "sync-intervall (${MSC_GIT_REPO_UPDATE_INTERVALL-${MSC_GIT_REPO_UPDATE_INTERVALL_DEFAULT}} hours, $((seconds/86400)) days $(date -d "1970-01-01 + $seconds seconds" "+%H hours %M minutes %S seconds") left ) not reached"
return 2
fi
else
logwarn "no sync allowed from config" >&2
return 1
fi
}
lastupdatesubmodules () {
#date "+%s" > ${MSC_GIT_UPD_SUBMOD_STATFILE}
touch ${MSC_GIT_UPD_REPO_STATFILE}
}
export -f lastupdatesubmodules
lastupdaterepo () {
#date "+%s" > ${MSC_GIT_UPD_REPO_STATFILE}
touch ${MSC_GIT_UPD_REPO_STATFILE}
}
export -f lastupdaterepo
sync_config () {
if $MSC_GIT_SYNC; then
local nok=""
local gco=""
if which git >/dev/null; then
loginfo -n "Sync config with ${MSC_GIT_SERVER}: "
# MSC_GITCHECKOUTSCRIPT_OPTIONS are options for bin/git-myshellconfig-checkout
${MSC_BASE}/bin/git-myshellconfig-checkout ${MSC_GIT_CHECKOUTSCRIPT_OPTIONS:=${MSC_GIT_CHECKOUTSCRIPT_OPTIONS_DEFAULT}}|| nok="not " 1>>"${MSC_LOGFILE}" 2>&1
loginfo "$(printf '%s\n' "${nok}synced" )"
[ -z "$nok" ] && mkdir -pv "${MSC_LOGDIR}"
else
logwarn "git not installed, no configuration possible, please install git" >&2
fi
else
logwarn "Not syncing profile in case of configuration"
fi
}
pathmunge () {
ENTRY
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
EXIT
}
if [ -d "${MSC_BASE}/bin" ] ; then
pathmunge "${MSC_BASE}/bin"
export PATH
fi
if [ -d "${HOME}/.local/bin" ] ; then
pathmunge "${HOME}/.local/bin"
export PATH
fi
# Check for interactive bash and that we haven't already been sourced.
if [ -n "${BASH_VERSION-}" -a -n "${PS1-}" -a -z "${BASH_COMPLETION_VERSINFO-}" ]; then
# Check for recent enough version of bash.
if [ ${BASH_VERSINFO[0]} -gt 4 ] || \
[ ${BASH_VERSINFO[0]} -eq 4 -a ${BASH_VERSINFO[1]} -ge 1 ]; then
[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" ] && \
. "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion"
if shopt -q progcomp && [ -r /usr/share/bash-completion/bash_completion ]; then
# Source completion code.
logdebug "Source bash-completion"
. /usr/share/bash-completion/bash_completion
fi
fi
fi
# source git-sync part of myshellconfig
. "${MSC_BASE}/myshell_git_sync"
# source loading defaults part of myshellconfig
. "${MSC_BASE}/myshell_load_defaults"
# source loading workaround for x2go to forward local etoken to remote machine with forwardagent
. "${MSC_BASE}/myshell_load_x2go_tokenforward"
promptcommandmunge "_tmux_hook"
promptcommandmunge "_umask_hook"
which direnv >/dev/null && eval "$(direnv hook bash)"
cat << EOF >> "${MSC_LOGFILE}"
==8<=== finished configure new shell ================ $(date) ===============8<==
EOF
#else
# echo "non-interactive shell" >&2
SCRIPTEXIT
# Start tmux if not defined as STARTTMUX in bashrc
logdebug "start tmux ${STARTTMUXDEFAULT} - ${STARTTMUXDEFAULT-$STARTTMUX}"
if ${STARTTMUXDEFAULT-$STARTTMUX} ; then
cat << EOF
"User: $USER - $UID"
Starting or resuming screen session
Press CTRL+C to cancel screen startup
EOF
sleep 1
#screen -UxR
tmux attach-session
logdebug "started tmux"
fi
logdebug "after"
fi