_setpriv_module() { local cur prev OPTS COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" case $prev in '--inh-caps'|'--bounding-set') # FIXME: how to append to a string with compgen? local INHERIT INHERIT=$($1 --list-caps| awk '{print $1, "-" $1}') compopt -o nospace COMPREPLY=( $(compgen -W "all $INHERIT" -S ',' -- $cur) ) return 0 ;; '--ruid'|'--euid'|'--reuid') local UIDS UIDS=$(getent passwd | awk -F: '{print $3}') COMPREPLY=( $(compgen -W "$UIDS" -- $cur) ) return 0 ;; '--rgid'|'--egid'|'--regid') local GIDS GIDS=$(getent group | awk -F: '{print $3}') COMPREPLY=( $(compgen -W "$GIDS" -- $cur) ) return 0 ;; '--groups') # FIXME: how to append to a string with compgen? local GIDS GIDS=$(getent group | awk -F: '{print $3}') compopt -o nospace COMPREPLY=( $(compgen -W "$GIDS" -S ',' -- $cur) ) return 0 ;; '--securebits') local SBITS SBITS="noroot noroot_locked no_setuid_fixup no_setuid_fixup_locked keep_caps_locked -noroot -noroot_locked -no_setuid_fixup -no_setuid_fixup_locked -keep_caps_locked" COMPREPLY=( $(compgen -W "$SBITS" -- $cur) ) return 0 ;; '--selinux-label') # FIXME: how to list selinux labels? COMPREPLY=( $(compgen -W "label" -- $cur) ) return 0 ;; '--apparmor-profile') # FIXME: how to list apparmor profiles? COMPREPLY=( $(compgen -W "profile" -- $cur) ) return 0 ;; '-h'|'--help'|'-V'|'--version') return 0 ;; esac case $cur in -*) OPTS="--dump --no-new-privs --inh-caps --bounding-set --ruid --euid --rgid --egid --reuid --regid --clear-groupsclear --keep-groupskeep --groups --securebits --selinux-label --apparmor-profile --help --version" COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) ) return 0 ;; esac compopt -o bashdefault COMPREPLY=( $(compgen -c -- $cur) ) return 0 } complete -F _setpriv_module setpriv