From 6dd328cf4840bb56a8cbb2eb42e23c7a466f4d99 Mon Sep 17 00:00:00 2001 From: jdholtz Date: Sat, 21 Dec 2024 14:56:29 -0600 Subject: [PATCH 1/3] shell-completion: add bash completion for userdbctl --- shell-completion/bash/userdbctl | 99 +++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 shell-completion/bash/userdbctl diff --git a/shell-completion/bash/userdbctl b/shell-completion/bash/userdbctl new file mode 100644 index 00000000000..da8e4ab35f4 --- /dev/null +++ b/shell-completion/bash/userdbctl @@ -0,0 +1,99 @@ +# shellcheck shell=bash +# userdbctl(1) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# This file is part of systemd. +# +# Copyright © 2010 Ran Benita +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# systemd is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with systemd; If not, see . + +__contains_word () { + local w word=$1; shift + for w in "$@"; do + [[ $w = "$word" ]] && return + done +} + +__get_all_users () { userdbctl user --no-legend -B | { while read -r a b; do printf "%s\n" "$a"; done; } ; } +__get_all_groups () { userdbctl group --no-legend -B | { while read -r a b; do printf "%s\n" "$a"; done; } ; } + +_userdbctl () { + local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} + local i verb comps + + local -A OPTS=( + [STANDALONE]='-h --help --version --no-pager --no-legend + -j -N --chain -z --fuzzy -I -S -R -B' + [ARG]='--output -s --service --with-nss --synthesize --with-dropin --with-varlink + --multiplexer --json --uid-min --uid-max --disposition --boundaries' + ) + + if __contains_word "$prev" ${OPTS[ARG]}; then + case $prev in + --output) + comps=$( userdbctl --output=help 2>/dev/null ) + ;; + -s|--service|--uid-min|--uid-max) + comps='' + ;; + --with-nss|--synthesize|--with-dropin|--with-varlink|--multiplexer|--boundaries) + comps='true false' + ;; + --json) + comps=$( userdbctl --json=help 2>/dev/null ) + ;; + --disposition) + comps='intrinsic system dynamic regular container reserved' + ;; + esac + COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) + return 0 + fi + + if [[ "$cur" = -* ]]; then + COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") ) + return 0 + fi + + local -A VERBS=( + [USERS]='ssh-authorized-keys user users-in-group' + [GROUPS]='group groups-of-user' + [STANDALONE]='services' + ) + + for ((i=0; i < COMP_CWORD; i++)); do + if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} && + ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then + verb=${COMP_WORDS[i]} + break + fi + done + + if [[ -z ${verb-} ]]; then + comps="${VERBS[*]}" + elif __contains_word "$verb" ${VERBS[USERS]}; then + comps=$( __get_all_users ) + elif __contains_word "$verb" ${VERBS[GROUPS]}; then + comps=$( __get_all_groups ) + elif __contains_word "$verb" ${VERBS[STANDALONE]}; then + comps='' + fi + + COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) + return 0 +} + + +complete -F _userdbctl userdbctl From 843407278f9616e585f0cdb68b0e97d56e5f68bc Mon Sep 17 00:00:00 2001 From: jdholtz Date: Sat, 21 Dec 2024 17:24:36 -0600 Subject: [PATCH 2/3] shell-completion: add userdbctl to build file --- shell-completion/bash/meson.build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shell-completion/bash/meson.build b/shell-completion/bash/meson.build index 59c2e2ef40c..2d895a10e47 100644 --- a/shell-completion/bash/meson.build +++ b/shell-completion/bash/meson.build @@ -53,7 +53,8 @@ items = [['busctl', ''], ['systemd-resolve', 'ENABLE_RESOLVE'], ['systemd-sysext', 'ENABLE_SYSEXT'], ['systemd-vmspawn', 'ENABLE_VMSPAWN'], - ['timedatectl', 'ENABLE_TIMEDATED']] + ['timedatectl', 'ENABLE_TIMEDATED'], + ['userdbctl', 'ENABLE_USERDB']] foreach item : items if bashcompletiondir != 'no' and (item[1] == '' or conf.get(item[1]) == 1) From 6c2f8ee2a07221aa676b88561ba8b5d3ad0d1b02 Mon Sep 17 00:00:00 2001 From: jdholtz Date: Sat, 21 Dec 2024 19:33:36 -0600 Subject: [PATCH 3/3] shell-completion: format userdbctl --- shell-completion/bash/userdbctl | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/shell-completion/bash/userdbctl b/shell-completion/bash/userdbctl index da8e4ab35f4..da1419b1753 100644 --- a/shell-completion/bash/userdbctl +++ b/shell-completion/bash/userdbctl @@ -26,8 +26,15 @@ __contains_word () { done } -__get_all_users () { userdbctl user --no-legend -B | { while read -r a b; do printf "%s\n" "$a"; done; } ; } -__get_all_groups () { userdbctl group --no-legend -B | { while read -r a b; do printf "%s\n" "$a"; done; } ; } +__get_all_users () { + local a b + userdbctl user --no-legend -B | { while read -r a b; do printf "%s\n" "$a"; done; } +} + +__get_all_groups () { + local a b + userdbctl group --no-legend -B | { while read -r a b; do printf "%s\n" "$a"; done; } +} _userdbctl () { local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} @@ -49,7 +56,7 @@ _userdbctl () { comps='' ;; --with-nss|--synthesize|--with-dropin|--with-varlink|--multiplexer|--boundaries) - comps='true false' + comps='yes no' ;; --json) comps=$( userdbctl --json=help 2>/dev/null ) @@ -95,5 +102,4 @@ _userdbctl () { return 0 } - complete -F _userdbctl userdbctl