From: Thomas Hindoe Paaboel Andersen <pho...@gmail.com> --- Makefile.am | 3 ++ man/machinectl.xml | 8 ++++ shell-completion/bash/machinectl | 97 ++++++++++++++++++++++++++++++++++++++++ src/machine/machinectl.c | 14 +++++- 4 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 shell-completion/bash/machinectl
diff --git a/Makefile.am b/Makefile.am index 18df645..83c70a6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/man/machinectl.xml b/man/machinectl.xml index ca4d52b..9eb45dc 100644 --- a/man/machinectl.xml +++ b/man/machinectl.xml @@ -95,6 +95,14 @@ </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> <listitem><para>Do not query the user diff --git a/shell-completion/bash/machinectl b/shell-completion/bash/machinectl new file mode 100644 index 0000000..3789492 --- /dev/null +++ b/shell-completion/bash/machinectl @@ -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 diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index 3f4f8ac..912cffd 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -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; -- 1.8.5.3 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel