1# hostnamectl(1) completion -*- shell-script -*- 2# SPDX-License-Identifier: LGPL-2.1-or-later 3# 4# This file is part of systemd. 5# 6# Copyright © 2010 Ran Benita 7# 8# systemd is free software; you can redistribute it and/or modify it 9# under the terms of the GNU Lesser General Public License as published by 10# the Free Software Foundation; either version 2.1 of the License, or 11# (at your option) any later version. 12# 13# systemd is distributed in the hope that it will be useful, but 14# WITHOUT ANY WARRANTY; without even the implied warranty of 15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16# General Public License for more details. 17# 18# You should have received a copy of the GNU Lesser General Public License 19# along with systemd; If not, see <http://www.gnu.org/licenses/>. 20 21__contains_word () { 22 local w word=$1; shift 23 for w in "$@"; do 24 [[ $w = "$word" ]] && return 25 done 26} 27 28__get_machines() { 29 local a b 30 machinectl list --full --no-legend --no-pager 2>/dev/null | 31 { while read a b; do echo " $a"; done; }; 32} 33 34_hostnamectl() { 35 local i verb comps 36 local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} 37 local -A OPTS=( 38 [STANDALONE]='-h --help --version --transient --static --pretty --no-ask-password' 39 [ARG]='-H --host -M --machine --json' 40 ) 41 42 if __contains_word "$prev" ${OPTS[ARG]}; then 43 case $prev in 44 --host|-H) 45 comps=$(compgen -A hostname) 46 ;; 47 --machine|-M) 48 comps=$( __get_machines ) 49 ;; 50 --json) 51 comps=$( hostnamectl --json=help 2>/dev/null ) 52 ;; 53 *) 54 return 0 55 ;; 56 esac 57 COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) 58 return 0 59 fi 60 61 if [[ $cur = -* ]]; then 62 COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") ) 63 return 0 64 fi 65 66 local -A VERBS=( 67 [STANDALONE]='status' 68 [ICONS]='icon-name' 69 [NAME]='hostname deployment location' 70 [CHASSIS]='chassis' 71 ) 72 73 for ((i=0; i < COMP_CWORD; i++)); do 74 if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then 75 verb=${COMP_WORDS[i]} 76 break 77 fi 78 done 79 80 if [[ -z ${verb-} ]]; then 81 comps=${VERBS[*]} 82 elif __contains_word "$verb" ${VERBS[CHASSIS]}; then 83 comps='desktop laptop convertible server tablet handset watch embedded vm container' 84 elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[ICONS]} ${VERBS[NAME]}; then 85 comps='' 86 fi 87 88 COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) 89 return 0 90} 91 92complete -F _hostnamectl hostnamectl 93