diff --git a/shell-completion/bash/systemctl.in b/shell-completion/bash/systemctl.in index 03c3b70150..5c444b7fa4 100644 --- a/shell-completion/bash/systemctl.in +++ b/shell-completion/bash/systemctl.in @@ -62,6 +62,8 @@ __get_template_names () { __systemctl $1 list-unit-files "$2*" \ | { while read -r a b; do [[ $a =~ @\. ]] && echo " ${a%%@.*}@"; done; }; } __get_active_units () { __systemctl $1 list-units "$2*" \ | { while read -r a b; do echo " $a"; done; }; } +__get_active_services() { __systemctl $1 list-units "$2*.service" \ + | { while read -r a b; do echo " $a"; done; }; } __get_not_masked_unit_files() { # filter out masked, not-found, or template units. @@ -231,12 +233,15 @@ _systemctl () { list-timers list-units list-unit-files poweroff reboot rescue show-environment suspend get-default is-system-running preset-all list-automounts list-paths' - [FILE]='link switch-root bind mount-image' + [FILE]='link switch-root' [TARGETS]='set-default' [MACHINES]='list-machines' [LOG_LEVEL]='log-level' [LOG_TARGET]='log-target' + [SERVICE_LOG_LEVEL]='service-log-level' + [SERVICE_LOG_TARGET]='service-log-target' [SERVICE_WATCHDOGS]='service-watchdogs' + [MOUNT]='bind mount-image' ) for ((i=0; i < COMP_CWORD; i++)); do @@ -365,8 +370,33 @@ _systemctl () { comps='debug info notice warning err crit alert emerg' elif __contains_word "$verb" ${VERBS[LOG_TARGET]}; then comps='console journal kmsg journal-or-kmsg null' + elif __contains_word "$verb" ${VERBS[SERVICE_LOG_LEVEL]}; then + if __contains_word "$prev" ${VERBS[SERVICE_LOG_LEVEL]}; then + comps=$( __get_all_unit_files $mode "$cur" ) + elif __contains_word "$prev" debug info notice warning err crit alert emerg; then + return 0 + else + comps='debug info notice warning err crit alert emerg' + fi + elif __contains_word "$verb" ${VERBS[SERVICE_LOG_TARGET]}; then + if __contains_word "$prev" ${VERBS[SERVICE_LOG_TARGET]}; then + comps=$( __get_all_unit_files $mode "$cur" ) + elif __contains_word "$prev" console journal kmsg journal-or-kmsg null; then + return 0 + else + comps='console journal kmsg journal-or-kmsg null' + fi elif __contains_word "$verb" ${VERBS[SERVICE_WATCHDOGS]}; then comps='on off' + elif __contains_word "$verb" ${VERBS[MOUNT]}; then + if __contains_word "$prev" ${VERBS[MOUNT]}; then + comps=$( __get_active_services $mode "$cur" ) + elif [[ "$prev" =~ .service ]]; then + comps=$( compgen -A file -- "$cur" ) + compopt -o filenames + else + return 0 + fi fi COMPREPLY=( $(compgen -o filenames -W '$comps' -- "$cur_orig") ) diff --git a/shell-completion/bash/systemd-analyze b/shell-completion/bash/systemd-analyze index 8ecf993571..d27a642220 100644 --- a/shell-completion/bash/systemd-analyze +++ b/shell-completion/bash/systemd-analyze @@ -51,6 +51,10 @@ __get_syscall_sets() { done } +__get_architectures() { + systemd-analyze --no-legend --no-pager architectures | { while read -r a b; do echo " $a"; done } +} + _systemd_analyze() { local i verb comps mode local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} words cword @@ -73,6 +77,7 @@ _systemd_analyze() { [CONDITION]='condition' [INSPECT_ELF]='inspect-elf' [PLOT]='plot' + [ARCHITECTURES]='architectures' ) local CONFIGS='systemd/bootchart.conf systemd/coredump.conf systemd/journald.conf @@ -198,6 +203,13 @@ _systemd_analyze() { if [[ $cur = -* ]]; then comps='--help --version --system --user --global --no-pager --json=off --json=pretty --json=short --table --no-legend' fi + + elif __contains_word "$verb" ${VERBS[ARCHITECTURES]}; then + if [[ $cur = -* ]]; then + comps='--help --version --no-pager --json=off --json=pretty --json=short --no-legend' + else + comps=$( __get_architectures ) + fi fi COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index 005846fdee..6edc412e75 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -597,7 +597,7 @@ static int parse_argv(int argc, char *argv[]) { if (streq_ptr(argv[optind], "condition") && arg_unit && optind < argc - 1) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "No conditions can be passed if --unit= is used."); - if ((!arg_legend && !streq_ptr(argv[optind], "plot")) || + if ((!arg_legend && !STRPTR_IN_SET(argv[optind], "plot", "architectures")) || (streq_ptr(argv[optind], "plot") && !arg_legend && !arg_table && FLAGS_SET(arg_json_format_flags, JSON_FORMAT_OFF))) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Option --no-legend is only supported for plot with either --table or --json=.");