]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
bash completion: make systemctl mount-image/bind autocomplete on active services
authorLuca Boccassi <bluca@debian.org>
Wed, 27 Dec 2023 16:48:05 +0000 (17:48 +0100)
committerLuca Boccassi <bluca@debian.org>
Wed, 27 Dec 2023 16:48:05 +0000 (17:48 +0100)
The verb works only on running service units, so complete on that as the first
parameter, and a local file as the second. The other parameters are inside the
service namespace so we can't autocomplete from the outside, return early.

shell-completion/bash/systemctl.in

index ef8cd8f4be2dc658bf2fa268663a47f3c47ee602..5c444b7fa4a7eebfa4280b136435579b5e6f449f 100644 (file)
@@ -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,7 +233,7 @@ _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'
@@ -239,6 +241,7 @@ _systemctl () {
         [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
@@ -385,6 +388,15 @@ _systemctl () {
         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") )