25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-30 16:36:29 +01:00
xmpp.chapril.org-ejabberd/tools/ejabberdctl.bc
Badlop a33be2d67a ejabberdctl.bc: Improve caching of commands list
Improvements:
- Keep command cache for one hour
- Fix parsing command list with ECMA-48 SGR escape sequence for font attributes
2024-02-06 17:52:27 +01:00

112 lines
3.2 KiB
Bash

#
# bash completion for ejabberdctl
#
# For installation and details see:
# https://docs.ejabberd.im/admin/guide/managing/#bash-completion
#
get_help()
{
local CACHE_BASE=/tmp/ejabberd_bash_completion
local DATESTRING=`date +%F-%H`
local CACHE=$CACHE_BASE.$DATESTRING
local CACHE_COMS=$CACHE.coms
local CACHE_TAGS=$CACHE.tags
if [[ ! -f $CACHE_COMS ]] ; then
rm -f $CACHE_BASE.*
[ -f $CACHE_COMS ] || ejabberdctl $CTLARGS | sed "s|\x1B\[[0-9]*m||g" | grep "^ [a-z]" | awk '{print $1}' | xargs >$CACHE_COMS
[ -f $CACHE_TAGS ] || ejabberdctl $CTLARGS help tags | sed "s|\x1B\[[0-9]*m||g" | grep "^ [a-z]" | awk '{print $1}' | xargs >$CACHE_TAGS
fi
if [[ $? == 2 ]] || [[ -f $CACHE_COMS ]] ; then
ISRUNNING=1
runningcommands=`cat $CACHE_COMS`
runningtags=`cat $CACHE_TAGS`
fi
}
_ejabberdctl()
{
local cur prev
local ISRUNNING=0
local runningcommands
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
local startcoms="start foreground foreground-quiet live debug etop iexdebug iexlive ping started stopped"
local startpars="--config-dir --config --ctl-config --logs --node --spool"
local i=1
local CTLARGS=""
while [ $i -lt $COMP_CWORD ] ; do
local PARAM="${COMP_WORDS[i]}"
i=$((i+1))
case $PARAM in
--*)
CTLARGS="--node ${COMP_WORDS[i]}"
i=$((i+1)) ;;
*) break ;;
esac
done
case "${prev##*/}" in
ejabberdctl)
# This clause matches even when calling `/sbin/ejabberdctl` thanks to the ##*/ in the case
get_help
COMPREPLY=($(compgen -W "--node ${startpars} ${startcoms} ${runningcommands}" -- $cur))
return 0
;;
start|live)
COMPREPLY=($(compgen -W "--node ${startpars}" -- $cur))
return 0
;;
debug)
COMPREPLY=($(compgen -W "--node" -- $cur))
return 0
;;
help)
get_help
COMPREPLY=($(compgen -W "${runningcommands} ${runningtags}" -- $cur))
return 0
;;
--node)
RUNNINGNODES=`epmd -names | grep name | awk '{print $2"@localhost"}' | xargs`
COMPREPLY=($(compgen -W "$RUNNINGNODES" -- $cur))
return 0
;;
--config|--ctl-config)
_filedir '?(u)cfg'
return 0
;;
--config-dir|--logs|--spool)
_filedir
return 0
;;
*)
prev2="${COMP_WORDS[COMP_CWORD-2]}"
get_help
if [[ "$prev2" == --* ]]; then
COMPREPLY=($(compgen -W "--node ${startpars} ${startcoms} ${runningcommands}" -- $cur))
else
if [[ $ISRUNNING == 1 ]]; then
echo ""
ejabberdctl $CTLARGS help ${PARAM}
echo -n "${COMP_LINE}"
fi
fi
return 0
;;
esac
}
complete -F _ejabberdctl ejabberdctl
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh