X Tutup
Skip to content

Commit 3a9692d

Browse files
committed
shell-completion: add homectl for bash
The difference between verbs that take one user and multiple users is not handled. I don't know how to do this.
1 parent 3ac33bc commit 3a9692d

File tree

2 files changed

+189
-1
lines changed

2 files changed

+189
-1
lines changed

shell-completion/bash/homectl

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
# hostctl(1) completion -*- shell-script -*-
2+
# SPDX-License-Identifier: LGPL-2.1+
3+
#
4+
# This file is part of systemd.
5+
#
6+
# systemd is free software; you can redistribute it and/or modify it
7+
# under the terms of the GNU Lesser General Public License as published by
8+
# the Free Software Foundation; either version 2.1 of the License, or
9+
# (at your option) any later version.
10+
#
11+
# systemd is distributed in the hope that it will be useful, but
12+
# WITHOUT ANY WARRANTY; without even the implied warranty of
13+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
# General Public License for more details.
15+
#
16+
# You should have received a copy of the GNU Lesser General Public License
17+
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
18+
19+
__contains_word () {
20+
local w word=$1; shift
21+
for w in "$@"; do
22+
[[ $w = "$word" ]] && return
23+
done
24+
}
25+
26+
__get_machines() {
27+
local a b
28+
machinectl list --full --no-legend --no-pager 2>/dev/null |
29+
{ while read a b; do echo " $a"; done; };
30+
}
31+
32+
__get_homes() {
33+
homectl --no-pager --no-legend list 2>/dev/null
34+
}
35+
36+
_homectl() {
37+
local i verb comps
38+
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
39+
40+
local -A OPTS=(
41+
[STANDALONE]='-h --help --version
42+
--no-pager --no-legend --no-ask-password
43+
-j -E -P'
44+
[ARG]=' -H --host
45+
-M --machine
46+
--identity
47+
--json
48+
--export-format
49+
-c --real-name
50+
--realm
51+
--email-address
52+
--location
53+
--icon-name
54+
-d --home-dir
55+
--uid
56+
-G --member-of
57+
--skel
58+
--shell
59+
--setenv
60+
--timezone
61+
--language
62+
--ssh-authorized-keys
63+
--pkcs11-token-uri
64+
--locked
65+
--not-before
66+
--not-after
67+
--rate-limit-interval
68+
--rate-limit-burst
69+
--password-hint
70+
--enforce-password-policy
71+
--password-change-now
72+
--password-change-min
73+
--password-change-max
74+
--password-change-warn
75+
--password-change-inactive
76+
--disk-size
77+
--access-mode
78+
--umask
79+
--nice
80+
--rlimit
81+
--tasks-max
82+
--memory-high
83+
--memory-max
84+
--cpu-weight
85+
--io-weight
86+
--storage
87+
--image-path
88+
--fs-type
89+
--luks-discard
90+
--luks-offline-discard
91+
--luks-cipher
92+
--luks-cipher-mode
93+
--luks-volume-key-size
94+
--luks-pbkdf-type
95+
--luks-pbkdf-hash-algorithm
96+
--luks-pbkdf-time-cost
97+
--luks-pbkdf-memory-cost
98+
--luks-pbkdf-parallel-threads
99+
--nosuid
100+
--nodev
101+
--noexec
102+
--cifs-domain
103+
--cifs-user-name
104+
--cifs-service
105+
--stop-delay
106+
--kill-processes
107+
--auto-login'
108+
)
109+
110+
if __contains_word "$prev" ${OPTS[ARG]}; then
111+
case $prev in
112+
--host|-H)
113+
comps=$(compgen -A hostname)
114+
;;
115+
--machine|-M)
116+
comps=$( __get_machines )
117+
;;
118+
--identity|--image-path)
119+
comps=$(compgen -A file -- "$cur" )
120+
compopt -o filenames
121+
;;
122+
--json)
123+
comps='pretty short off'
124+
;;
125+
--export-format)
126+
comps='full stripped minimal'
127+
;;
128+
--locked|--enforce-password-policy|--password-change-now|--luks-discard|--luks-offline-discard|--nosuid|--nodev|--noexec|--kill-processes|--auto-login)
129+
comps='yes no'
130+
;;
131+
-d|--home-dir|--skel)
132+
comps=$(compgen -A directory -- "$cur" )
133+
compopt -o dirnames
134+
;;
135+
-G|--member-of)
136+
comps=$(compgen -A group -- "$cur" )
137+
;;
138+
--shell)
139+
comps=$(cat /etc/shells)
140+
;;
141+
--fs-type)
142+
comps='ext4 xfs btrsf'
143+
;;
144+
--cifs-user-name)
145+
comps=$(compgen -A user -- "$cur" )
146+
;;
147+
esac
148+
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
149+
return 0
150+
fi
151+
152+
if [[ "$cur" = -* ]]; then
153+
COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
154+
return 0
155+
fi
156+
157+
local -A VERBS=(
158+
[STANDALONE]='list lock-all'
159+
[CREATE]='create'
160+
[NAMES]='activate deactivate inspect authenticate remove lock unlock'
161+
[NAME]='update passwd'
162+
[RESIZE]='resize'
163+
[WITH]='with'
164+
)
165+
166+
for ((i=0; i < COMP_CWORD; i++)); do
167+
if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
168+
verb=${COMP_WORDS[i]}
169+
break
170+
fi
171+
done
172+
173+
if [[ -z $verb ]]; then
174+
comps=${VERBS[*]}
175+
elif __contains_word "$verb" ${VERBS[NAME]}; then
176+
comps=$(__get_homes)
177+
elif __contains_word "$verb" ${VERBS[NAMES]}; then
178+
comps=$(__get_homes)
179+
elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[CREATE]} ${VERBS[RESIZE]}; then
180+
comps=$(__get_homes)
181+
elif __contains_word "$verb" ${VERBS[WITH]}; then
182+
comps=$(__get_homes)
183+
fi
184+
185+
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
186+
return 0
187+
}
188+
189+
complete -F _homectl homectl

shell-completion/bash/loginctl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ _loginctl () {
7272
return 0
7373
fi
7474

75-
7675
if [[ "$cur" = -* ]]; then
7776
COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
7877
return 0

0 commit comments

Comments
 (0)
X Tutup