machinectl: add bash completion

This commit is contained in:
Thomas Hindoe Paaboel Andersen 2014-02-18 21:09:05 +01:00 committed by Lennart Poettering
parent 0f3e07b7cc
commit e56056e93d
4 changed files with 120 additions and 2 deletions

View file

@ -3951,6 +3951,9 @@ machinectl_LDADD = \
rootbin_PROGRAMS += \
machinectl
dist_bashcompletion_DATA += \
shell-completion/bash/machinectl
test_machine_tables_SOURCES = \
src/machine/test-machine-tables.c

View file

@ -94,6 +94,14 @@
pager.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--no-legend</option></term>
<listitem><para>Do not print the legend,
i.e. the column headers and the
footer.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--no-ask-password</option></term>

View file

@ -0,0 +1,97 @@
# machinectl(1) completion -*- shell-script -*-
#
# This file is part of systemd.
#
# Copyright 2014 Thomas H.P. Andersen
#
# 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 <http://www.gnu.org/licenses/>.
__contains_word() {
local w word=$1; shift
for w in "$@"; do
[[ $w = "$word" ]] && return
done
}
__get_machines() {
local a b
machinectl list --no-legend --no-pager | { while read a b; do echo " $a"; done; };
}
_machinectl() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
local i verb comps
local -A OPTS=(
[STANDALONE]='--all -a --full --help -h --no-ask-password --no-legend --no-pager --version'
[ARG]='--host -H --kill-who -M --machine --property -p --signal -s'
)
local -A VERBS=(
[STANDALONE]='list'
[MACHINES]='status show terminate kill reboot login'
)
_init_completion || return
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 __contains_word "$prev" ${OPTS[ARG]}; then
case $prev in
--signal|-s)
comps=$(compgen -A signal)
;;
--kill-who)
comps='all leader'
;;
--host|-H)
comps=$(compgen -A hostname)
;;
--machine|-M)
comps=$( __get_machines )
;;
--property|-p)
comps=''
;;
esac
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
return 0
fi
if [[ "$cur" = -* ]]; then
COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
return 0
fi
if [[ -z $verb ]]; then
comps=${VERBS[*]}
elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
comps=''
elif __contains_word "$verb" ${VERBS[MACHINES]}; then
comps=$( __get_machines )
fi
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
return 0
}
complete -F _machinectl machinectl

View file

@ -46,6 +46,7 @@ static char **arg_property = NULL;
static bool arg_all = false;
static bool arg_full = false;
static bool arg_no_pager = false;
static bool arg_legend = true;
static const char *arg_kill_who = NULL;
static int arg_signal = SIGTERM;
static bool arg_ask_password = true;
@ -84,7 +85,8 @@ static int list_machines(sd_bus *bus, char **args, unsigned n) {
return r;
}
printf("%-32s %-9s %-16s\n", "MACHINE", "CONTAINER", "SERVICE");
if (arg_legend)
printf("%-32s %-9s %-16s\n", "MACHINE", "CONTAINER", "SERVICE");
r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "(ssso)");
if (r < 0)
@ -102,7 +104,8 @@ static int list_machines(sd_bus *bus, char **args, unsigned n) {
if (r < 0)
return bus_log_parse_error(r);
printf("\n%u machines listed.\n", k);
if (arg_legend)
printf("\n%u machines listed.\n", k);
return 0;
}
@ -673,6 +676,7 @@ static int help(void) {
" -h --help Show this help\n"
" --version Show package version\n"
" --no-pager Do not pipe output into a pager\n"
" --no-legend Do not show the headers and footers\n"
" --no-ask-password Don't prompt for password\n"
" -H --host=[USER@]HOST Operate on remote host\n"
" -M --machine=CONTAINER Operate on local container\n"
@ -699,6 +703,7 @@ static int parse_argv(int argc, char *argv[]) {
enum {
ARG_VERSION = 0x100,
ARG_NO_PAGER,
ARG_NO_LEGEND,
ARG_KILL_WHO,
ARG_NO_ASK_PASSWORD,
};
@ -710,6 +715,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "all", no_argument, NULL, 'a' },
{ "full", no_argument, NULL, 'l' },
{ "no-pager", no_argument, NULL, ARG_NO_PAGER },
{ "no-legend", no_argument, NULL, ARG_NO_LEGEND },
{ "kill-who", required_argument, NULL, ARG_KILL_WHO },
{ "signal", required_argument, NULL, 's' },
{ "host", required_argument, NULL, 'H' },
@ -758,6 +764,10 @@ static int parse_argv(int argc, char *argv[]) {
arg_no_pager = true;
break;
case ARG_NO_LEGEND:
arg_legend = false;
break;
case ARG_NO_ASK_PASSWORD:
arg_ask_password = false;
break;