]>
Commit | Line | Data |
---|---|---|
42bb3074 RB |
1 | # This file is part of systemd. |
2 | # | |
3 | # Copyright 2010 Ran Benita | |
4 | # | |
5 | # systemd is free software; you can redistribute it and/or modify it | |
6 | # under the terms of the GNU General Public License as published by | |
7 | # the Free Software Foundation; either version 2 of the License, or | |
8 | # (at your option) any later version. | |
9 | # | |
10 | # systemd is distributed in the hope that it will be useful, but | |
11 | # WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | # General Public License for more details. | |
14 | # | |
15 | # You should have received a copy of the GNU General Public License | |
16 | # along with systemd; If not, see <http://www.gnu.org/licenses/>. | |
17 | ||
18 | __contains_word () { | |
19 | local word=$1; shift | |
20 | for w in $*; do [[ $w = $word ]] && return 0; done | |
21 | return 1 | |
22 | } | |
23 | ||
24 | __filter_units_by_property () { | |
25 | local property=$1 value=$2 ; shift ; shift | |
26 | local -a units=( $* ) | |
27 | local -a props=( $(systemctl show --property "$property" -- ${units[*]} | grep -v ^$) ) | |
28 | for ((i=0; $i < ${#units[*]}; i++)); do | |
29 | if [[ "${props[i]}" = "$property=$value" ]]; then | |
30 | echo "${units[i]}" | |
31 | fi | |
32 | done | |
33 | } | |
34 | ||
35 | __get_all_units () { systemctl list-units --full --all | awk ' {print $1}' ; } | |
36 | __get_active_units () { systemctl list-units --full | awk ' {print $1}' ; } | |
37 | __get_inactive_units () { systemctl list-units --full --all | awk '$3 == "inactive" {print $1}' ; } | |
38 | __get_failed_units () { systemctl list-units --full | awk '$3 == "failed" {print $1}' ; } | |
39 | ||
40 | _systemctl () { | |
41 | local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} | |
42 | local verb comps | |
43 | ||
44 | local -A OPTS=( | |
e67c3609 | 45 | [STANDALONE]='--all -a --defaults --fail --ignore-dependencies --failed --force -f --full --global |
42bb3074 | 46 | --help -h --no-ask-password --no-block --no-reload --no-wall |
af2d49f7 | 47 | --order --require --quiet -q --system --user --version' |
42bb3074 RB |
48 | [ARG]='--kill-mode --kill-who --property -p --signal -s --type -t' |
49 | ) | |
50 | ||
51 | if __contains_word "$prev" ${OPTS[ARG]}; then | |
52 | case $prev in | |
53 | --signal|-s) | |
54 | comps=$(compgen -A signal | grep '^SIG' | grep -Ev 'RTMIN|RTMAX|JUNK') | |
55 | ;; | |
56 | --type|-t) | |
57 | comps='automount device mount path service snapshot socket swap target timer' | |
58 | ;; | |
59 | --kill-who) | |
60 | comps='all control main' | |
61 | ;; | |
62 | --kill-mode) | |
cd25cce9 | 63 | comps='control-group process' |
42bb3074 RB |
64 | ;; |
65 | --property|-p) | |
66 | comps='' | |
67 | ;; | |
68 | esac | |
69 | COMPREPLY=( $(compgen -W "$comps" -- "$cur") ) | |
70 | return 0 | |
71 | fi | |
72 | ||
73 | ||
74 | if [[ "$cur" = -* ]]; then | |
75 | COMPREPLY=( $(compgen -W "${OPTS[*]}" -- "$cur") ) | |
76 | return 0 | |
77 | fi | |
78 | ||
79 | local -A VERBS=( | |
80 | [ALL_UNITS]='enable disable is-active is-enabled status show' | |
81 | [FAILED_UNITS]='reset-failed' | |
82 | [STARTABLE_UNITS]='start restart reload-or-restart' | |
83 | [STOPPABLE_UNITS]='stop kill try-restart condrestart' | |
2dcd4d24 | 84 | [ISOLATABLE_UNITS]='isolate' |
42bb3074 RB |
85 | [RELOADABLE_UNITS]='reload reload-or-try-restart force-reload' |
86 | [JOBS]='cancel' | |
87 | [SNAPSHOTS]='delete' | |
88 | [ENVS]='set-environment unset-environment' | |
89 | [STANDALONE]='daemon-reexec daemon-reload default dot dump emergency exit halt kexec | |
90 | list-jobs list-units poweroff reboot rescue show-environment' | |
91 | [NAME]='snapshot load' | |
92 | ) | |
93 | ||
94 | local verb | |
95 | for ((i=0; $i <= $COMP_CWORD; i++)); do | |
96 | if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} && | |
97 | ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG}]}; then | |
98 | verb=${COMP_WORDS[i]} | |
99 | break | |
100 | fi | |
101 | done | |
102 | ||
103 | if [[ -z $verb ]]; then | |
104 | comps="${VERBS[*]}" | |
105 | ||
106 | elif __contains_word "$verb" ${VERBS[ALL_UNITS]}; then | |
107 | comps=$( __get_all_units ) | |
108 | ||
109 | elif __contains_word "$verb" ${VERBS[STARTABLE_UNITS]}; then | |
110 | comps=$( __filter_units_by_property CanStart yes \ | |
111 | $( __get_inactive_units | grep -Ev '\.(device|snapshot)$' )) | |
112 | ||
113 | elif __contains_word "$verb" ${VERBS[STOPPABLE_UNITS]}; then | |
114 | comps=$( __filter_units_by_property CanStop yes \ | |
115 | $( __get_active_units ) ) | |
116 | ||
117 | elif __contains_word "$verb" ${VERBS[RELOADABLE_UNITS]}; then | |
118 | comps=$( __filter_units_by_property CanReload yes \ | |
119 | $( __get_active_units ) ) | |
120 | ||
121 | elif __contains_word "$verb" ${VERBS[ISOLATABLE_UNITS]}; then | |
122 | comps=$( __filter_units_by_property AllowIsolate yes \ | |
123 | $( __get_all_units ) ) | |
124 | ||
125 | elif __contains_word "$verb" ${VERBS[FAILED_UNITS]}; then | |
126 | comps=$( __get_failed_units ) | |
127 | ||
128 | elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[NAME]}; then | |
129 | comps='' | |
130 | ||
131 | elif __contains_word "$verb" ${VERBS[JOBS]}; then | |
132 | comps=$( systemctl list-jobs | awk '{print $1}' ) | |
133 | ||
134 | elif __contains_word "$verb" ${VERBS[SNAPSHOTS]}; then | |
135 | comps=$( systemctl list-units --type snapshot --full --all | awk '{print $1}' ) | |
136 | ||
137 | elif __contains_word "$verb" ${VERBS[ENVS]}; then | |
138 | comps=$( systemctl show-environment | sed 's_\([^=]\+=\).*_\1_' ) | |
139 | compopt -o nospace | |
140 | fi | |
141 | ||
142 | COMPREPLY=( $(compgen -W "$comps" -- "$cur") ) | |
143 | return 0 | |
144 | } | |
145 | complete -F _systemctl systemctl |