myshellconfig/functions.sh
Jakobus Schürz 66d7bf5263 fix sudo when sshs to other server
when myshellconfig is configured for root and you logged in via sshs,
sudo does not work correctly.

not it takes the temporary bashrc for sshs also for sudo
2022-11-16 11:36:09 +01:00

1293 lines
38 KiB
Bash
Executable file

# Initialize variables, if not set
[ -z ${TMUX_SESSION_DIRS+x} ] && TMUX_SESSION_DIRS=( ~/.config/tmux/sessions ~/.local/share/tmux/sessions ~/.tmux/sessions)
[ -z ${SETPROXY_CREDS_DIRS+x} ] && SETPROXY_CREDS_DIRS=(~/.config/proxycreds)
[ -z ${KERBEROS_CONFIG_DIRS+x} ] && KERBEROS_CONFIG_DIRS=(~/.config/kinit)
[ -z ${ENCFS_CONFIG_DIRS+x} ] && ENCFS_CONFIG_DIRS=(~/.config/encfs)
export TMUX_SESSION_DIRS SETPROXY_CREDS_DIRS KERBEROS_CONFIG_DIRS
promptcommandmunge () {
ENTRY
case ";${PROMPT_COMMAND};" in
"*;$1;*")
;;
*)
if [ "$2" = "after" ] ; then
PROMPT_COMMAND="${PROMPT_COMMAND};$1"
else
PROMPT_COMMAND="$1;${PROMPT_COMMAND}"
fi
esac
EXIT
}
## this function updates in combination with PROMPT_COMMAND the shell-environment-variables in tmux-sessions,
# every time prompt is called. It does it only, when called from tmux (Environment TMUX is set)
function _tmux_hook() {
# [ -z "${TMUX+x}" ] || eval "$(tmux show-environment -s)"
if [ -n "${TMUX}" ]; then
eval "$(tmux show-environment -s)"
fi
}
# To make the code more reliable on detecting the default umask
function _umask_hook {
# Record the default umask value on the 1st run
[[ -z $DEFAULT_UMASK ]] && export DEFAULT_UMASK="$(builtin umask)"
if [[ -n $UMASK ]]; then
umask "$UMASK"
else
umask "$DEFAULT_UMASK"
fi
}
function cpb() {
scp "$1" ${SSH_CLIENT%% *}:~/Work
}
function sudo() {
local SUDO
local BASH
# SUDO=$( if [ -e /bin/sudo ]; then echo /bin/sudo; else echo /usr/bin/sudo; fi )
SUDO=$(which sudo)
[ getbashrcfile ] && BASH="bash --rcfile $(getbashrcfile)" || unset BASH
$SUDO \
GIT_AUTHOR_EMAIL="$GIT_AUTHOR_EMAIL" \
GIT_AUTHOR_NAME="$GIT_AUTHOR_NAME" \
GIT_COMMITTER_EMAIL="$GIT_COMMITTER_EMAIL" \
GIT_COMMITTER_NAME="$GIT_COMMITTER_NAME" \
TMUX="$TMUX" \
SSHS="$SSHS" \
P11M="$P11M" \
SSH_TTY="$SSH_TTY" \
SSH_AUTH_SOCK="$SSH_AUTH_SOCK" \
http_proxy="$http_proxy" \
$BASH \
"$@"
}
create_symlinks() {
#echo MSC_BASE: $MSC_BASE
# MSC_BASEDIR="$1"
# DIR="$(basename ${MSC_BASEDIR})"
# cd "${MSC_BASEDIR}"
[ -z "${MSC_GIT+x}" ] && MSC_GIT=git
cd ${MSC_BASE}
#echo "DIR MSC_BASEDIR $DIR $MSC_BASEDIR"
git config credential.helper 'cache --timeout=300'
#Anlegen von Symlinks
rm -rf ~/.vimrc ~/.vim ~/bashrc_add ~/.gitconfig ~/.tmux.conf ~/.tmux
ln -sf "${MSC_BASE}/vimrc" ~/.vimrc
ln -sf "${MSC_BASE}/vim" ~/.vim
ln -sf "${MSC_BASE}/.gitconfig" ~/.gitconfig
ln -sf "${MSC_BASE}/.gitignore_global" ~/.gitignore_global
#ln -sf "${MSC_BASE}/bashrc_add" ~/bashrc_add
ln -sf "${MSC_BASE}/tmux" ~/.tmux
ln -sf "${MSC_BASE}/tmux/tmux.conf" ~/.tmux.conf
# Configure to use githooks in .githooks, not in standardlocation .git/hooks
$MSC_GIT config core.hooksPath .githooks
# remove all old symlinks in .githooks and relink files from .githooks to .git/hooks
# don't know, why i do it here. TODO: Check it
find .git/hooks -type l -exec rm {} \; && find .githooks -type f -exec ln -sf ../../{} .git/hooks/ \;
cd ~-
}
setproxy () {
# https://gist.github.com/yougg/5d2b3353fc5e197a0917aae0b3287d64
ENTRY
local CONFIG
case $# in
0)
logwarning "too few arguments"
return
;;
*)
if [ -z ${SETPROXY_CREDS_DIRS+x} ] ; then
logwarning "are you sure, SETPROXY_CREDS_DIRS is defined?"
return 1
else
CONFIG=$(find ${SETPROXY_CREDS_DIRS[*]} -mindepth 1 -name "$1.conf" -print -quit 2>/dev/null )
NO_PROXY=$(find ${SETPROXY_CREDS_DIRS[*]} -mindepth 1 -name "no_proxy.conf" -print -quit 2>/dev/null )
fi
;;
esac
logwarning "CONFIG: ${CONFIG}"
if [ -e ${CONFIG} ]; then
logdebug -n "${CONFIG} existing: "
source "${CONFIG}"
loginfo "read $CONFIG"
export PROXY_CREDS="$(urlencode ${PROXY_USER})${PROXY_PASS:+:}$(urlencode ${PROXY_PASS})"
else
loginfo "${CONFIG} not existing"
# export PROXY_CREDS=""
fi
export {http,https,ftp,rsync,all}_proxy="${PROXY_PROTO:-http}://${PROXY_CREDS}${PROXY_CREDS:+@}${PROXY_SERVER}${PROXY_PORT:+:}${PROXY_PORT}"
export {HTTP,HTTPS,FTP,RSYNC,ALL}_PROXY="${PROXY_PROTO:-http}://${PROXY_CREDS}${PROXY_CREDS:+@}${PROXY_SERVER}${PROXY_PORT:+:}${PROXY_PORT}"
no_proxy="127.0.0.1,localhost"
#no_proxy=$no_proxy,$(echo 10.{0..255}.{0..255}.{0..255}|tr ' ' ',')
#no_proxy=$no_proxy,$(echo 172.{16..31}.{0..255}.{0..255}|tr ' ' ',')
#no_proxy=$no_proxy,$(echo 192.168.{0..255}.{0..255}|tr ' ' ',')
# no_proxy=${no_proxy}${PROXY_IGNORE:+,}${PROXY_IGNORE}
# . $NO_PROXY
export no_proxy
git config -f ~/.gitconfig_local http.sslverify false
git config -f ~/.gitconfig_local http.proxy $http_proxy
git config -f ~/.gitconfig_local https.proxy $http_proxy
# only for 'github.com'
git config -f ~/.gitconfig_local http.https://github.com.proxy $http_proxy
EXIT
}
unsetproxy () {
ENTRY
unset {HTTP,HTTPS,FTP,RSYNC,ALL}_PROXY
unset PROXY_{CREDS,USER,PASS,SERVER,PORT,PROTO,IGNORE}
unset {http,https,ftp,rsync,all}_proxy
unset proxy_{creds,user,pass,server,port}
unset no_proxy NO_PROXY
git config -f ~/.gitconfig_local --unset http.proxy
git config -f ~/.gitconfig_local --unset http.sslverify false
git config -f ~/.gitconfig_local --unset https.proxy
# git config -f ~/.gitconfig_local --unset core.sshCommand
git config -f ~/.gitconfig_local --unset http.https://github.com.proxy
EXIT
}
mencfs () {
ENTRY
[ $# -eq 0 ] && { logwarning "too few arguments" >&2; return 1; }
local PKEY
local ENCDIR
local DESTDIR
local PASS=$(which pass 2>/dev/null || exit 127 )
local ENCFS=$(which encfs 2>/dev/null || exit 127 )
local CONFIG
if [ -z ${ENCFS_CONFIG_DIRS+x} ] ; then
logwarning "are you sure, ENCFS_CONFIG_DIRS is defined?"
EXIT
return 1
else
CONFIG=$(find ${ENCFS_CONFIG_DIRS[*]} -mindepth 1 -name "$1.conf" -print -quit 2>/dev/null )
fi
if [ -e ${CONFIG} ]; then
loginfo -n "${CONFIG} existing: "
source "${CONFIG}"
loginfo "sourced"
else
loginfo "${CONFIG} not existing"
EXIT
return 2
fi
logdebug "ENCDIR: $ENCDIR"
[ -z ${PKEY+x} ] && { EXIT; return 3; }
[ -z ${ENCDIR+x} ] && { EXIT; return 4; }
[ -z "${DESTDIR+x}" ] && [ -n "${XDG_RUNTIME_DIR}" ] && DESTDIR="${XDG_RUNTIME_DIR}/decrypted/$(basename $ENCDIR| tr '[:lower:]' '[:upper:]'| sed -e 's/^\.//')"
[ -z ${DESTDIR+x} ] && DESTDIR="$(dirname $ENCDIR)/$(basename $ENCDIR| tr '[:lower:]' '[:upper:]'| sed -e 's/^\.//')"
logdebug "DESTDIR: $DESTDIR"
[ -d "$DESTDIR" ] || mkdir -p "$DESTDIR"
$PASS "${PKEY}" 1>/dev/null 2>&1 || { logerr "entry $PKEY does not exist in passwordsotre"; return 5; }
local ENCFS_PASSWORD=$($PASS show "${PKEY}"|head -n1)
if [ -z ${ENCDIR+x} -a -d ${ENCDIR} ];then
logerr "no encrypted directory found -> exit"
EXIT
return 4
else
loginfo "mount encrypted directory $ENCDIR on $DESTDIR"
$ENCFS -S $ENCDIR $DESTDIR <<!
$ENCFS_PASSWORD
!
if [ $? ]; then
loginfo "open $DESTDIR"
xdg-open $DESTDIR
fi
fi
EXIT
}
uencfs () {
ENTRY
local FUSERMOUNT=$(which fusermount 2>/dev/null || exit 127 )
local i
[ -z ${FUSERMOUNT+x} ] && return 127
if [ $# -eq 1 ]; then
if [ ! -d ${1} ];then
logwarning "encrypted directory ${1} not found -> exit" >&2
EXIT
return 128
else
loginfo "umount encrypted directory" $1 >&2
sync
$FUSERMOUNT -z -u "$1"
fi
else
loginfo "no arguments given. Umount all mounted encfs-dirs" >&2
for i in $(mount|grep encfs|sed -e 's/^encfs on \(.*\)\ type.*$/\1/');do
loginfo "$FUSERMOUNT -u $i"
sync
$FUSERMOUNT -z -u "$i"
done
EXIT
return 1
fi
EXIT
}
kinit-custom () {
ENTRY
local PKEY
local REALM
local PASS=$(which pass 2>/dev/null || exit 127 )
local KINIT=$(which kinit 2>/dev/null || exit 127 )
local CONFIG
if [ -z ${KERBEROS_CONFIG_DIRS+x} ] ; then
logwarning "are you sure, KERBEROS_CONFIG_DIRS is defined?"
EXIT
return 1
else
CONFIG=$(find ${KERBEROS_CONFIG_DIRS[*]} -mindepth 1 -name "$1.conf" -print -quit 2>/dev/null )
fi
if [ -e ${CONFIG} ]; then
logdebug -n "${CONFIG} existing: "
source "${CONFIG}"
logdebug "sourced"
else
logwarning "${CONFIG} not existing"
EXIT
return 2
fi
[ -z ${PKEY+x} ] && return 3
$PASS "${PKEY}" 1>/dev/null 2>&1 || return 3
logtrace "PKEY: ${PKEY}"
local KERBEROS_PASSWORD="$($PASS show "${PKEY}"|head -n1)"
local KERBEROS_USER="$($PASS "${PKEY}" | grep login | sed -e 's/^login: //' )"
logdebug "$($PASS "${PKEY}" | grep login | sed -e 's/^login: //')"
logtrace "KERBEROS_PASSWORD: ${KERBEROS_PASSWORD}"
logdebug "KERBEROS_USER: ${KERBEROS_USER}"
loginfo "Get kerberos-ticket for: $KERBEROS_USER@$REALM"
if [ -z ${KERBEROS_USER:+x} ];then
logwarning "no kerberos user found -> exit"
EXIT
return 4
else
$KINIT -R "${KERBEROS_USER}@${REALM}" <<!
${KERBEROS_PASSWORD}
!
if [ $? -gt 0 ] ; then
loginfo renew kerberos-ticket failed. try to get a new one
$KINIT "${KERBEROS_USER}@${REALM}" <<!
${KERBEROS_PASSWORD}
!
fi
fi
EXIT
}
# transfered to bin
#git-mergedetachedheadtomaster () {
# ENTRY
# git checkout -b tmp
# git branch -f master tmp
# git checkout master
# git branch -d tmp
# git commit -m "Merged detached head into master" .
# #git push origin master
# EXIT
#}
pathmunge () {
ENTRY
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
EXIT
}
mkcd () {
mkdir -p "$1"
cd "$1"
}
sshmyshellconfig() {
ENTRY
[ -z "${MSC_SUBPATH+x}" ] && MSC_SUBPATH=".local/myshellconfig"
[ -z "${MSC_BASE+x}" ] && MSC_BASE="${HOME}/${MSC_SUBPATH}"
echo MSC_GIT_REMOTE_NAME: $MSC_GIT_REMOTE_NAME
MSC_GIT_REMOTE_NAME=$($MSC_GIT rev-parse --abbrev-ref @{u} 2>/dev/null | cut -d'/' -f1)
echo MSC_GIT_REMOTE_NAME: $MSC_GIT_REMOTE_NAME
MSC_BASE_PARENT="$(dirname $MSC_BASE)"
if [ $1 == "localhost" ]; then
CMD=""
else
local SSH="/usr/bin/ssh"
[ -e ${MSC_BASE}/bashrc_add ] && $SSH -T -o VisualHostKey=no $@ "mkdir -p ~/\$MSC_BASE_PARENT; cat > ~/bashrc_add" < "${MSC_BASE}/bashrc_add"
local CMD="$SSH -T $@"
fi
$CMD /bin/bash << EOF
set -x
[ -e /etc/bashrc ] && . /etc/bashrc
[ -e /etc/bash.bashrc ] && . /etc/bash.bashrc
echo "modify ~/.bashrc"
sed -i -e '/^\[ -f bashrc_add \] /d' ~/.bashrc
sed -i -e '/#MYSHELLCONFIG-start/,/#MYSHELLCONFIG-end/d' ~/.bashrc
echo
printf "%s\n" "#MYSHELLCONFIG-start" "[ -f \"\${HOME}/${MSC_SUBPATH}/bashrc_add\" ] && . \"\${HOME}/${MSC_SUBPATH}/bashrc_add\"" "#MYSHELLCONFIG-end"| tee -a ~/.bashrc
#printf "%s\n" "#MYSHELLCONFIG-start" "if [ -e \${HOME}/${MSC_SUBPATH}/bashrc_add ]; then" " . \${HOME}/${MSC_SUBPATH}/bashrc_add;" "else" " if [ -f ~/bashrc_add ] ;then" " . ~/bashrc_add;" " fi;" "fi" "#MYSHELLCONFIG-end" |tee -a ~/.bashrc
echo
echo cleanup from old config
rm -rf ~/server-config && echo rm -rf ~/server-config
echo mkdir -p ~/.local
mkdir -p ~/.local
echo git clone --recurse-submodules $(git remote get-url $MSC_GIT_REMOTE_NAME) \${HOME}/${MSC_SUBPATH}
git clone --recurse-submodules $(git remote get-url $MSC_GIT_REMOTE_NAME) \${HOME}/${MSC_SUBPATH}
date "+%s" > \${HOME}/${MSC_SUBPATH}/.last_update_submodules
# date "+%s" > \${HOME}/${MSC_SUBPATH}/.last_update_repo
EOF
EXIT
}
#sshs() {
# ENTRY
#
#
# local LOGLEVEL="WARN"
## MKTMPCMD='mktemp $(echo ${XDG_RUNTIME_DIR}/bashrc.XXXXXXXX.conf)'
## VIMMKTMPCMD="mktemp ${XDG_RUNTIME_DIR}/vimrc.XXXXXXXX.conf"
#
# local f
# local TMPBASHCONFIG=$(mktemp -p ${XDG_RUNTIME_DIR} -t bashrc.XXXXXXXX --suffix=.conf)
# local FILELIST=( "${MSC_BASE}/functions.sh" "${MSC_BASE}/logging" "${MSC_BASE}/myshell_load_fortmpconfig" $(getbashrcfile) ~/.aliases "${MSC_BASE}/aliases" "${MSC_BASE}/PS1" "${MSC_BASE}/bash_completion.d/*" )
#
# logdebug "FILELIST: ${FILELIST[@]}"
# if [ -e "${HOME}/.config/myshellconfig/sshs_addfiles.conf" ] ; then
# for f in $(cat "${HOME}/.config/myshellconfig/sshs_addfiles.conf");do
# [ -e "$f" ] && {\
# logdebug "add $f to FILELIST"; \
# FILELIST+=("$f"); }
# done
# fi
# logdebug "FILELIST1: ${FILELIST[@]}"
# local SSH_OPTS="-o VisualHostKey=no -o ControlMaster=auto -o ControlPersist=20s -o ControlPath=~/.ssh/master-%C"
# #local SSH_OPTS="-o VisualHostKey=no -o ControlMaster=yes -o ControlPersist=10s -o ControlPath=~/.ssh/ssh-%C"
# # Read /etc/bashrc or /etc/bash.bashrc (depending on distribution) and /etc/profile.d/*.sh first
# #ssh -T ${SSH_OPTS} $@ "pwd" >/dev/null 2>/dev/null || { logerr "Server $@ not reachable -> exit"; return 1; }
# cat << EOF >> "${TMPBASHCONFIG}"
#[ -e /etc/bashrc ] && BASHRC=/etc/bashrc
#[ -e /etc/bash.bashrc ] && BASHRC=/etc/bash.bashrc
#. \$BASHRC
#
#export USERNAME="${USERNAME}"
#export FULLNAME="${FULLNAME}"
#export USEREMAIL="${USEREMAIL}"
#export SCRIPT_LOG="\$(cat /proc/\$$/cmdline | xargs -0 echo|awk '{print \$3}' |sed 's/.conf$/.log/')"
#export LOGLEVEL_DEFAULT="${LOGLEVEL_DEFAULT}"
#export FILELOGLEVEL_DEFAULT="${FILELOGLEVEL_DEFAULT}"
#
#for i in /etc/profile.d/*.sh; do
# if [ -r "$i" ];then
# if [ "$PS1" ]; then
# . "$i"
# else
# . "$i" >/dev/null
# fi
# fi
#done
#unset i
#EOF
#
# for f in ${FILELIST[*]}; do
# if [ -e $f ]; then
# logdebug "add $f to tmpconfig"
# cat "$f" >> "${TMPBASHCONFIG}";
# fi
# done
#
# if [ $# -ge 1 ]; then
# if [ -e "${TMPBASHCONFIG}" ] ; then
# logdebug "create remote bashrc"
# logdebug "SSH_OPTS: $SSH_OPTS"
#
# sshcmd=$(cat << _remote_commands
#mktemp -p \${XDG_RUNTIME_DIR-~} -t bashrc.XXXXXXXX --suffix=.conf | tr -d '[:space:]'
#echo " "
#mktemp -p \${XDG_RUNTIME_DIR-~} -t vimrc.XXXXXXXX --suffix=.conf | tr -d '[:space:]'
#echo " "
#mktemp -p \${XDG_RUNTIME_DIR-~} -t tst.XXXXXXXX --suffix=.conf | tr -d '[:space:]'
#echo " "
#_remote_commands
#)
# local REMOTETMPCONFIGS=($(ssh -T ${SSH_OPTS} $@ "$sshcmd") )
## local REMOTETMPCONFIGS=($(ssh -T ${SSH_OPTS} $@ "mktemp -p \${XDG_RUNTIME_DIR-~} -t bashrc.XXXXXXXX --suffix=.conf" | tr -d '[:space:]' ) $(ssh -T ${SSH_OPTS} $@ "mktemp -p \${XDG_RUNTIME_DIR-~} -t vimrc.XXXXXXXX --suffix=.conf" | tr -d '[:space:]' ))
# logdebug remote tmp bashrc ${REMOTETMPCONFIGS[0]}
# logdebug remote tmp vimrc ${REMOTETMPCONFIGS[1]}
# #local REMOTETMPBASHCONFIG=$(ssh -T ${SSH_OPTS} $@ "mktemp -p \${XDG_RUNTIME_DIR-~} -t bashrc.XXXXXXXX --suffix=.conf" | tr -d '[:space:]' )
# #logdebug "REMOTETMPBASHCONFIG: $REMOTETMPBASHCONFIG"
## logdebug $(ssh -T ${SSH_OPTS} $@ "stat ${REMOTETMPBASHCONFIG}")
## logdebug $(ssh -T ${SSH_OPTS} $@ "hostnamectl")
# #logdebug "create remote vimrc"
# #local REMOTETMPVIMCONFIG=$(ssh -T ${SSH_OPTS} $@ "mktemp -p \${XDG_RUNTIME_DIR-~} -t vimrc.XXXXXXXX --suffix=.conf" | tr -d '[:space:]' )
# #logdebug "REMOTETMPVIMCONFIG: $REMOTETMPVIMCONFIG"
#
# # Add additional aliases to bashrc for remote-machine
# cat << EOF >> "${TMPBASHCONFIG}"
#alias vi='vim -u ${REMOTETMPCONFIGS[1]}'
#alias vim='vim -u ${REMOTETMPCONFIGS[1]}'
#alias vimdiff='vimdiff -u ${REMOTETMPCONFIGS[1]}'
#export LS_OPTIONS="${LS_OPTIONS}"
#export VIMRC="${REMOTETMPCONFIGS[1]}"
#export BASHRC="${REMOTETMPCONFIGS[0]}"
#title "\$USER@\$HOSTNAME: \$PWD"
#loginfo "This bash runs with temporary config from \$BASHRC"
#EOF
#
# logdebug "create fill remote bashrc"
# local TESTFILE=/tmp/bla
# cat << EOF3 > "${TESTFILE}"
#ich bin ein testfile
#zweite zeile
#EOF3
#
#ssh -T ${SSH_OPTs} $@ << _remote_cmd
#stat "${REMOTETMPCONFIGS[2]}"
#echo BLA
#cat <<- 'eof2' > ${REMOTETMPCONFIGS[2]}
#$(cat ${TMPBASHCONFIG})
#eof2
#echo BLA2
#_remote_cmd
#echo BLA3
# #ssh -T ${SSH_OPTS} $@ "cat > ${REMOTETMPBASHCONFIG}" < "${TMPBASHCONFIG}"
# #ssh -T ${SSH_OPTS} $@ "cat > ${REMOTETMPCONFIGS[0]}" < "${TMPBASHCONFIG}"
# # logtrace $(ssh -T ${SSH_OPTS} $@ "stat ${REMOTETMPBASHCONFIG}")
# logdebug "create file remote vimrc"
# #ssh -T ${SSH_OPTS} $@ "cat > ${REMOTETMPVIMCONFIG}" < "${MSC_BASE}/vimrc"
# ssh -T ${SSH_OPTS} $@ "cat > ${REMOTETMPCONFIGS[1]}" < "${MSC_BASE}/vimrc"
# local RCMD="/bin/bash --noprofile --norc -c "
# RCMD="
# trap \"rm -f ${REMOTETMPCONFIGS[0]} ${REMOTETMPCONFIGS[1]}\" EXIT " ;
# logdebug "run remote shell with temporary config"
# #ssh -t ${SSH_OPTS} $@ "$RCMD; SSHS=true bash -c \"function bash () { /bin/bash --rcfile ${REMOTETMPBASHCONFIG} -i ; } ; export -f bash; exec bash --rcfile ${REMOTETMPBASHCONFIG}\""
# ssh -t ${SSH_OPTS} $@ "$RCMD; SSHS=true bash -c \"function bash () { /bin/bash --rcfile ${REMOTETMPCONFIGS[0]} -i ; } ; export -f bash; exec bash --rcfile ${REMOTETMPCONFIGS[0]}\""
# rm "${TMPBASHCONFIG}"
# else
# logwarning "${TMPBASHCONFIG} does not exist. Using »ssh -t $@«"
# ssh -t "$@"
# fi
# else
# logwarning "too few arguments for sshs" >&2
# ssh
# fi
#
# EXIT
#}
[ -e ${MSC_BASE}/sshs ] && source ${MSC_BASE}/sshs
[ -z ${VIMRC+x} ] &&VIMRC="${MSC_BASE}/vimrc"
svi () {
ENTRY
if [ -f ${VIMRC} ]; then
sudo vim -u "${VIMRC}" $@;
else
sudo vim $@
fi
EXIT
}
#vim-plugins-update () {
# ENTRY
# vim -c "PluginUpdate" -c ":qa!"
# EXIT
#
#}
#
#vim-plugins-install () {
# ENTRY
# vim -c "PluginInstall" -c ":qa!"
# EXIT
#
#}
vim-repair-vundle () {
ENTRY
if [ -z ${MSC_BASE+x} ]; then
echo "MSC_BASE nicht gesetzt. Eventuell noch einmal ausloggen und wieder einloggen"
else
cd $MSC_BASE
cd vim/bundle
rm -rf Vundle.vim
echo git clone "${MSC_GIT_SUBMODULES_SERVER-$MSC_GIT_SUBMODULES_SERVER_DEFAULT}gmarik/Vundle.vim.git"
git clone "${MSC_GIT_SUBMODULES_SERVER-$MSC_GIT_SUBMODULES_SERVER_DEFAULT}gmarik/Vundle.vim.git"
cd ~-
fi
EXIT
}
getbashrcfile () {
ENTRY
if [ -z ${BASHRC+x} ] ; then
loginfo "bash uses default"
return 1
else
cat /proc/$$/cmdline | xargs -0 echo|awk '{print $3}'
fi
EXIT
}
catbashrcfile () {
ENTRY
if [ -z ${BASHRC+x} ] ; then
loginfo "bash uses default"
return 1
else
#cat $(cat /proc/$$/cmdline | xargs -0 echo|awk '{print $3}')
cat $(getbashrcfile)
fi
EXIT
}
getvimrcfile () {
ENTRY
if [ -z ${VIMRC+x} ] ; then
echo "vim uses default" >&2
else
echo $VIMRC
fi
EXIT
}
catvimrcfile () {
ENTRY
if [ -z ${VIMRC+x} ] ; then
echo "vim uses default" >&2
else
#cat $VIMRC
cat $(getvimrcfile)
fi
EXIT
}
# Functions to set the correct title of the terminal
function title()
{
ENTRY
# change the title of the current window or tab
echo -ne "\033]0;$*\007"
EXIT
}
function sshx()
{
/usr/bin/ssh "$@"
# revert the window title after the ssh command
title $USER@$HOST
}
function su()
{
/bin/su "$@"
# revert the window title after the su command
title $USER@$HOST
}
function usage()
{
cat << EOF
Keyboard-shortcuts:
# tmux:
C+Cursor tmux window change size
M+[hjkl] tmux change splitted windows
# vim:
C+[hjkl] vim change splitted windows
EOF
}
function update-hetzner-serverlist()
{
for i in basic-services sc xe tu; do
curl -s -H "Authorization: Bearer $(pass show hetzner.com/projects/${i}/api-token)" \
https://api.hetzner.cloud/v1/servers \
| /usr/bin/jq '.servers[].public_net.ipv4.ip'|sed -e 's/\"//g' \
|while read i; do
dig -x $i | awk '$0 !~ /^;/ && $4 == "PTR" {print $5}'
done |sed -s -e 's/\.$//' > ~/.dsh/group/hetzner-servers-${i}
done
cat ~/.dsh/group/hetzner-servers-* > ~/.dsh/group/hetzner-servers
}
function tmuxx() {
ENTRY
case $# in
1)
SESS=($(find ${TMUX_SESSION_DIRS[*]} -mindepth 1 -name "$1.session" 2>/dev/null ))
;;
*)
logwarning no session specified return
;;
esac
TMUX_BIN='/usr/bin/tmux'
$TMUX_BIN -f ~/.tmux.conf new-session -d
[ -e ${SESS[0]} ] && $TMUX_BIN source-file ${SESS[0]}
$TMUX_BIN attach-session -d
EXIT
}
function checkbkp() {
ENTRY
if ping -c 3 backup.vpn >/dev/null 2>&1 ; then
local SSH="/usr/bin/ssh"
local CMD="$SSH -T root@backup.vpn"
$CMD /bin/bash << EOF
sudo find /srv/nfs/backup -mindepth 1 -maxdepth 1|grep -v -e "git$\|git-backup-repos"|while read i;do printf "%-30s%s\\n" "\$i" \$(ls \$i|tail -n1);done|sort -k 2.1 -r
EOF
else
echo "backup.vpn is not reachable -> exit"
return 1
fi
EXIT
}
function checkbkp-full() {
ENTRY
if ping -c 3 backup.vpn >/dev/null 2>&1 ; then
local SSH="/usr/bin/ssh"
local CMD="$SSH -T root@backup.vpn"
$CMD /bin/bash << EOF
sudo find /srv/nfs/backup -mindepth 1 -maxdepth 1|grep -v -e "git$\|git-backup-repos"|while read i;do printf "%-30s%s\\n" "\$i" \$(ls \$i|tail -n1);done|sort -k 2.1 -r
EOF
which pdsh 1>/dev/null 2>&1 && pdsh -g vpn sudo systemctl status backup.service
else
logwarning "backup.vpn is not reachable -> exit"
return 1
fi
EXIT
}
turnoffbeep() {
ENTRY
changebeep none
EXIT
}
changebeep() {
ENTRY
local style
case $1 in
none)
style=none
;;
visible)
style=visible
;;
audible)
style=audible
;;
*)
logwarning "usage: changebeep [none|visible|audible]"
EXIT
return 1
;;
esac
local line='set bell-style'
local file=~/.inputrc
if [ -e "${file}" ] ; then
sed -i -e "/$line/d" "${file}"
fi
echo "${line} ${style}" >> "${file}"
return 0
EXIT
}
turnoffconfigsync() {
ENTRY
local line='MSC_GIT_SYNC='
local file=~/.bashrc
if [ -e "${file}" ] ; then
sed -i -e "/${line}/d" "${file}"
fi
sed -i -e "/#MYSHELLCONFIG-start/i${line}false" "${file}"
EXIT
}
turnonconfigsync() {
ENTRY
local line='MSC_GIT_SYNC='
local file=~/.bashrc
if [ -e "${file}" ] ; then
sed -i -e "/${line}/d" "${file}"
fi
sed -i "/#MYSHELLCONFIG-start/i${line}true" "${file}"
EXIT
}
function gnome-shell-extensions-enable-defaults() {
ENTRY
local i
if [ -f ~/.config/gnome-shell-extensions-default.list ]; then
for i in $(cat ~/.config/gnome-shell-extensions-default.list); do
#gnome-shell-extension-tool -e $i;
gnome-extensions enable $i;
done;
fi
EXIT
}
gnome-shell-extensions-make-actual-permanent() {
ENTRY
file="${HOME}/.config/gnome-shell-extensions-default.list"
local EXTENSIONS=$(gsettings get org.gnome.shell enabled-extensions)
line="[org/gnome/shell]"
for line in ${EXTENSIONS[@]}; do
loginfo "add $line to $file"
grep -xqF -- ${line} ${file} || echo $line >> $file
done
EXIT
}
gnome-shell-extensions-make-actual-permanent-systemwide() {
ENTRY
# https://people.gnome.org/~pmkovar/system-admin-guide/extensions-enable.html
# https://askubuntu.com/questions/359958/extensions-are-turned-off-after-reboot
local file="/etc/dconf/profile/user"
sudo mkdir -p "/etc/dconf/profile/"
local line='user-db:user'
if [ -e "${file}" ] ; then
command="grep -xqF -- ${line} ${file} || echo $line >> $file"
logtrace "$command"
sudo sh -c "$command"
fi
local line='system-db:local'
if [ -e "${file}" ] ; then
command="grep -xqF -- ${line} ${file} || echo $line >> $file"
logtrace "$command"
sudo sh -c "$command"
fi
local line='enabled-extensions='
local file='/etc/dconf/db/local.d/00-extensions'
sudo mkdir -p '/etc/dconf/db/local.d'
if [ -e "${file}" ] ; then
sudo sed -i -e "/${line}/d" "${file}"
#sudo sed -i -e "/\[org\/gnome\/shell\]/d" "${file}"
fi
local EXTENSIONS=$(gsettings get org.gnome.shell enabled-extensions)
line="[org/gnome/shell]"
command="grep -xqF -- ${line} ${file} || echo $line >> $file"
sudo sh -c "$command"
local line='enabled-extensions='
loginfo "Update or add extensions"
#echo "${line}${EXTENSIONS}" | sudo tee -a "${file}"
sudo sed -i "/\[org\/gnome\/shell\]/a${line}${EXTENSIONS}" "${file}"
sudo dconf update
EXIT
}
reachable-default () {
local SERVER=$1
local PORT=${2:-22}
local res=3
if which nc >/dev/null; then
if nc -w 2 -z $SERVER $PORT 2>/dev/null; then
res=0
fi
else
res=2
fi
return $res
}
reachable () {
ENTRY
# returncodes:
# 1: servername not resolveable
# 2: command nc not found
# 3: server:port not reachable
# 999999: something went wrong
# 0: server was resolve- and reachable
GETENTHOSTS=ahosts
local SERVER=$1
# dig does not consult /etc/hosts, so use getent hosts instead
#local IP=$(dig +nocmd $SERVER a +noall +answer|tail -n 1 |awk '{print $5}')
# getent ahostsv4 returns only ipv4 addresses
loginfo -n "Try to resolve $SERVER: "
local IP=$(getent $GETENTHOSTS $SERVER|awk '$0 ~ /STREAM/ {print $1}'|uniq|head -n1)
if [ -z ${IP-x} ]; then
logwarning "not resolvable -> exit"
return 1
else
loginfo $IP
fi
local PORT=${2:-22}
local SEC=${3:-1}
local res=999
local i
loginfo -n "Try to connect to ${SERVER} (${IP}):${PORT} " >&2
for i in $(seq 1 $SEC); do
loginfo -n "." >&2
if reachable-default ${IP} ${PORT} 2>/dev/null; then
res=0
break
else
res=$?
fi
[ ${SEC} -gt 1 -a $i -lt ${SEC} ] && sleep 1
done
[ ${res} -gt 0 ] && loginfo " not reachable" >&2 || loginfo " success" >&2;
EXIT
return $res
}
utoken () {
ENTRY
ssh_identity=$1
[ -z "${P11M+x}" ] && { P11M=$PKCS11_MODULE; export P11M; }
if [ -n "${ssh_identity+x}" ]; then
agentfile="${HOME}/.ssh/agents/agent-${ssh_identity}-$(hostname)"
if [ -e "$agentfile" ]; then
local SSH_AUTH_SOCK
local SSH_AGENT_PID
/bin/sh -c ". $agentfile >/dev/null 2>/dev/null; ssh-add -l; ssh-add -e $P11M; ssh-add -l"
fi
fi
EXIT
}
token(){
[ -z "${P11M:+x}" ] && { P11M=$PKCS11_MODULE; export P11M; }
# If DISPLAY is set, ssh-add calls ssh-askpass, and if its in remote-terminal, it wont work
# So remember and unset DISPLAY, and set it at the end again, if it was set before
[ $DISPLAY ] && local DISPLAY_ORIG=$DISPLAY
[ $DISPLAY ] && logtrace "unset DISPLAY: $DISPLAY"
[ $DISPLAY ] && unset DISPLAY
# Write public keys of all in agent stored keys to a temporary file
local tmppubkey="$(mktemp -p ${XDG_RUNTIME_DIR} pubkey.XXXXXX.pub)"
logtrace "tmppubkey: $tmppubkey"
loginfo "$(ssh-add -L > $tmppubkey)"
# Check if public-keys in tmppubkey are working. They are not working, if you removed and add back hardware-token.
loginfo "$(ssh-add -T ${tmppubkey}|| { ssh-add -e $P11M; ssh-add -s $P11M; } )"
logdebug "$(rm "${tmppubkey}")"
logdebug "$(ssh-add -l )"
[ $DISPLAY_ORIG ] && logtrace "reset DISPLAY=$DISPLAY_ORIG"
[ $DISPLAY_ORIG ] && export DISPLAY=$DISPLAY_ORIG
}
token-extract-pubkey() {
if pkcs11-tool --module $P11M --list-token-slots >&2 ;then
ssh-keygen -i -m pkcs8 -f <(pkcs11-tool --module $P11M -r --type pubkey ${1:+--label} ${1} |openssl rsa -pubin -inform DER )
if [ $? -gt 0 ] ; then
token-list-objects >&2
fi
else
echo "Please insert token. Exit" >&2
return 1
fi
}
token-list-objects() {
case $1 in
--login|-l)
pkcs11-tool --module $P11M --login --list-objects
;;
*)
pkcs11-tool --module $P11M --list-objects
;;
esac
}
loadagent() {
ENTRY
local af
af=$(startagent --create-only $1 )
loginfo "Load agent from $af"
unset SSH_AUTH_SOCKET SSH_AGENT_PID
[ -n "${af+x}" ] && eval $(<$af)
logdebug "SSH_AUTH_SOCK: ${SSH_AUTH_SOCK-not set}"
logdebug "SSH_AGENT_PID: ${SSH_AGENT_PID-not set}"
loginfo "currently loaded keys in agent:
$(ssh-add -l)"
EXIT
}
setloglevel () {
ENTRY
local loglevels
local oldloglevel=${LOGLEVEL-$LOGLEVEL_DEFAULT}
declare -a loglevels
loglevels=("ERROR" "WARN" "INFO" "DEBUG" "TRACE")
if [[ ${loglevels[*]} =~ "${1^^}" ]]; then
export LOGLEVEL=${1^^}
else
logerr "LOGLEVEL must be one of ERROR, WARN, INFO, DEBUG or TRACE"
fi
logerr "change LOGLEVEL from $oldloglevel -> $LOGLEVEL"
EXIT
}
setfileloglevel () {
ENTRY
local loglevels
local oldloglevel=${FILELOGLEVEL-${FILELOGLEVEL_DEFAULT}}
declare -a loglevels
loglevels=("ERROR" "WARN" "INFO" "DEBUG" "TRACE")
if [[ ${loglevels[*]} =~ "$1" ]]; then
export FILELOGLEVEL=$1
else
logerr "FILELOGLEVEL must be one of ERROR, WARN, INFO, DEBUG or TRACE"
fi
logerr "change FILELOGLEVEL from $oldloglevel -> $FILELOGLEVEL"
EXIT
}
getloglevels () {
ENTRY
cat << EOF |tee -a $SCRIPT_LOG
LOGLEVEL: ${LOGLEVEL-${LOGLEVEL_DEFAULT}}
FILELOGLEVEL: ${FILELOGLEVEL-${FILELOGLEVEL_DEFAULT}}
change LOGLEVEL: \$ setloglevel [ERROR|WARN|INFO|DEBUG|TRACE]
change FILELOGLEVEL: \$ setfileloglevel [ERROR|WARN|INFO|DEBUG|TRACE]
EOF
}
rescan_scsi () {
echo "- - -" > /sys/class/scsi_host/host0/scan
}
get_crtime() {
for target in "${@}"; do
inode=$(stat -c %i "${target}")
fs=$(df --output=source "${target}" | tail -1)
crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null |
grep -oP 'crtime.*--\s*\K.*')
printf "%s\t%s\n" "${target}" "${crtime}"
done
}
is_btrfs_subvolume() {
sudo btrfs subvolume show "$1" >/dev/null
}
convert_to_subvolume () {
local XSUDO
local DIR
case $1 in
--sudo|-s)
XSUDO=sudo
shift
;;
esac
DIR="${1}"
[ -d "${DIR}" ] || return 1
is_btrfs_subvolume "${DIR}" && return 0
set -x
#btrfs subvolume create "${DIR}".new && \
${XSUDO:+sudo} btrfs subvolume create "${DIR}.new" && \
/bin/cp -aTr --reflink=always "${DIR}" "${DIR}".new && \
mv "${DIR}" "${DIR}".orig && \
mv "${DIR}".new "${DIR}" || return 2
set +x
return 0
}
cporig () {
cp -b -i "${1}" "${1}.orig"
}
vgrename_full () {
altevolumegroup="$1"
neuevolumegroup="$2"
vgrename ${altevolumegroup} ${neuevolumegroup}
sed -i "s/${altevolumegroup}/${neuevolumegroup}/g" /etc/fstab
sed -i "s/${altevolumegroup}/${neuevolumegroup}/g" /boot/grub/grub.cfg
sed -i "s/${altevolumegroup}/${neuevolumegroup}/g" /boot/grub/menu.lst
sed -i "s/${altevolumegroup}/${neuevolumegroup}/g" /etc/initramfs-tools/conf.d/resume
update-initramfs -c -k all
}
getfreeip () {
local N=$1
sudo nmap -v -sn -n $1 -oG - | awk '/Status: Down/{print $2}'
}
getusedip () {
local N=$1
local DNS=$2
sudo nmap -v -sn -n $1 -oG - | awk '!/Status: Down/{print $2}'|while read i;do
echo "$i: $(dig "${DNS:+@}${DNS}" -x $i +short +search)"
done
}
function getdbcreds_jra () {
local APP_INST=/opt/atlassian/jira
local JRA_HOME=$(awk -F "=" '/jira.home/ {gsub(/ /, "", $0); print $2}' "${APP_INST}/atlassian-jira/WEB-INF/classes/jira-application.properties")
local DB_FILE="${JRA_HOME}/dbconfig.xml"
if xmllint --version >/dev/null 2>&1; then
DB_URL="$(xmllint --xpath "jira-database-config/jdbc-datasource/url/text()" ${DB_FILE})"
DB_USER="$(xmllint --xpath "jira-database-config/jdbc-datasource/username/text()" ${DB_FILE})"
DB_PWD="$(xmllint --xpath "jira-database-config/jdbc-datasource/password/text()" ${DB_FILE})"
else
echo "please install xmllint »apt install libxml2-utils«"
DB_URL="$(grep -oPm1 "(?<=<url>)[^<]+" ${DB_FILE})"
DB_USER="$(grep -oPm1 "(?<=<username>)[^<]+" ${DB_FILE})"
DB_PWD="$(grep -oPm1 "(?<=<password>)[^<]+" ${DB_FILE})"
fi
DB_HOST="$(echo $DB_URL|sed 's@^.*//@@;s@\(^.*\):\(.*\)/\(.*\)$@\1@')"
DB_PORT="$(echo $DB_URL|sed 's@^.*//@@;s@\(^.*\):\(.*\)/\(.*\)$@\2@')"
DB_NAME="$(echo $DB_URL|sed 's@^.*//@@;s@\(^.*\):\(.*\)/\(.*\)$@\3@')"
return 0
}
function getdbcreds_cnf () {
local APP_INST=/opt/atlassian/confluence
local CNF_HOME=$(awk -F "=" '/confluence.home/ {gsub(/ /, "", $0); print $2}' "${APP_INST}/confluence/WEB-INF/classes/confluence-init.properties")
local DB_FILE="${CNF_HOME}/confluence.cfg.xml"
if xmllint --version >/dev/null 2>&1; then
DB_URL="$(xmllint --xpath "confluence-configuration/properties/property[@name='hibernate.connection.url']/text()" ${DB_FILE})"
DB_USER="$(xmllint --xpath "confluence-configuration/properties/property[@name='hibernate.connection.username']/text()" ${DB_FILE})"
DB_PWD="$(xmllint --xpath "confluence-configuration/properties/property[@name='hibernate.connection.password']/text()" ${DB_FILE})"
else
echo "please install xmllint »apt install libxml2-utils«"
DB_URL="$(grep -oPm1 "(?<=<property name=\"hibernate.connection.url\">)[^<]+" ${DB_FILE})"
DB_USER="$(grep -oPm1 "(?<=<property name=\"hibernate.connection.username\">)[^<]+" ${DB_FILE})"
DB_PWD="$(grep -oPm1 "(?<=<property name=\"hibernate.connection.password\">)[^<]+" ${DB_FILE})"
fi
DB_HOST="$(echo $DB_URL|sed 's@^.*//@@;s@\(^.*\):\(.*\)/\(.*\)$@\1@')"
DB_PORT="$(echo $DB_URL|sed 's@^.*//@@;s@\(^.*\):\(.*\)/\(.*\)$@\2@')"
DB_NAME="$(echo $DB_URL|sed 's@^.*//@@;s@\(^.*\):\(.*\)/\(.*\)$@\3@')"
#cd -
return 0
}
function connectdb () {
case $HOSTNAME in
*jra*|*jira*)
getdbcreds_jra $2
;;
*cnf*|*confapp*)
getdbcreds_cnf $2
;;
# case $1 in
# jra|jira)
# getdbcreds_jra $2
# ;;
# cnf|conf|confluence)
# getdbcreds_cnf $2
# ;;
*)
echo "wrong argument"
return 1
;;
esac
cat << EOF
connect to ${DB_HOST}:${DB_PORT}/${DB_NAME}
with user: ${DB_USER}
and passwd: ${DB_PWD}
EOF
PGPASSWORD=$DB_PWD psql -h $DB_HOST -p $DB_PORT -U $DB_USER $DB_NAME
}
urlencode() {
# urlencode <string>
local LANG=C
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
}
urldecode() {
# urldecode <string>
local url_encoded="${1//+/ }"
printf '%b' "${url_encoded//%/\\x}"
}
findlocallogins() {
last -F -a $(for i in $(find /var/log -maxdepth 1 -name "wtmp*"|sort -h);do echo -n "-f $i ";done)|grep -v "pts/\|reboot\|wtmp"|awk '{print $4,$5,$7}'|uniq
}
getjrahomes() {
local APP_INST=/opt/atlassian/jira
APP_HOME=$(awk -F "=" '/^jira.home/ {gsub(/ /, "", $0); print $2}' "${APP_INST}/atlassian-jira/WEB-INF/classes/jira-application.properties")
[ -e "${APP_HOME}/cluster.properties" ] \
&& APP_SHARED_HOME=$(awk -F "=" '/^jira.shared.home/ {gsub(/ /, "", $0); print $2}' "${APP_HOME}/cluster.properties")
}
getcnfhomes() {
xmllint --version >/dev/null 2>&1 || { echo "please install xmllint »apt install libxml2-utils«" >&2; return 1; }
local APP_INST=/opt/atlassian/confluence
APP_HOME="$(awk -F "=" '/^confluence.home/ {gsub(/ /, "", $0); print $2}' "${APP_INST}/confluence/WEB-INF/classes/confluence-init.properties" )"
[ -e "${APP_HOME}/confluence.cfg.xml" ] \
&& APP_SHARED_HOME="$(xmllint --xpath "confluence-configuration/properties/property[@name='confluence.cluster.home']/text()" "${APP_HOME}/confluence.cfg.xml" 2>/dev/null)"
}
getatsvc() {
case $HOSTNAME in
*jra*|*jira*)
export SVC=jra;
export APP_NAME=jira
export APP_INST_NAME=atlassian-jira
export APP_LOG_DIR=log
getjrahomes
;;
*cnf*|*confapp*)
export SVC=cnf;
export APP_NAME=confluence
export APP_INST_NAME=confluence
export APP_LOG_DIR=logs
getcnfhomes
;;
esac
case ${HOSTNAME} in
sl[etp]*)
export PTE=${HOSTNAME:2:1}
;;
esac
}
goathome() {
getatsvc
[ "${APP_HOME:-x}" == "x" ] && { echo no $SVC home configured >&2; return 127; }
cd "${APP_HOME}"
}
goatshome() {
getatsvc
[ "${APP_SHARED_HOME:-x}" == "x" ] && { echo no $SVC home configured >&2; return 127; }
cd "${APP_SHARED_HOME}"
}
gojrahome() {
getjrahomes
[ "${APP_HOME:-x}" == "x" ] && { echo no jira home configured >&2; return 127; }
cd "${APP_HOME}"
}
gojrashome() {
getjrahomes
[ "${APP_SHARED_HOME:-x}" == "x" ] && { echo no jira shared-home configured >&2; return 127; }
cd "${APP_SHARED_HOME}"
}
gocnfhome() {
getcnfhomes
[ "${APP_HOME:-x}" == "x" ] && { echo no confluence home configured >&2; return 127; }
cd "${APP_HOME}"
}
gocnfshome() {
getcnfhomes
[ "${APP_SHARED_HOME:-x}" == "x" ] && { echo no confluence shared-home configured >&2; return 127; }
cd "${APP_SHARED_HOME}"
}
setserver() {
export sshcon="$@"
if [ -n "${TMUX}" ]; then
tmux set-environment sshcon "$@"
fi
}
setgitremote() {
cd ~/.local/myshellconfig
git checkout master
git remote set-url origin https://gitea.schuerz.at/jakob/myshellconfig.git
git remote set-url origin --push git@gitea.schuerz.at:jakob/myshellconfig.git
git fetch -p
git merge FETCH_HEAD
git submodule sync
git submodule update --init --recursive
}
#EOF