mirror of
				https://git.proxmox.com/git/systemd
				synced 2025-10-31 06:45:26 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			114 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| # loginctl(1) completion                                  -*- shell-script -*-
 | |
| # SPDX-License-Identifier: LGPL-2.1+
 | |
| #
 | |
| # This file is part of systemd.
 | |
| #
 | |
| # Copyright © 2010 Ran Benita
 | |
| #
 | |
| # systemd is free software; you can redistribute it and/or modify it
 | |
| # under the terms of the GNU Lesser General Public License as published by
 | |
| # the Free Software Foundation; either version 2.1 of the License, or
 | |
| # (at your option) any later version.
 | |
| #
 | |
| # systemd is distributed in the hope that it will be useful, but
 | |
| # WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | |
| # General Public License for more details.
 | |
| #
 | |
| # You should have received a copy of the GNU Lesser General Public License
 | |
| # along with systemd; If not, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
| __contains_word () {
 | |
|         local w word=$1; shift
 | |
|         for w in "$@"; do
 | |
|                 [[ $w = "$word" ]] && return
 | |
|         done
 | |
| }
 | |
| 
 | |
| __get_all_sessions () { loginctl --no-legend list-sessions | { while read -r a b; do printf "%s\n" "$a"; done; } ; }
 | |
| __get_all_users    () { loginctl --no-legend list-users    | { while read -r a b; do printf "%s\n" "$b"; done; } ; }
 | |
| __get_all_seats    () { loginctl --no-legend list-seats    | { while read -r a b; do printf "%s\n" "$a"; done; } ; }
 | |
| 
 | |
| _loginctl () {
 | |
|         local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
 | |
|         local i verb comps
 | |
| 
 | |
|         local -A OPTS=(
 | |
|                [STANDALONE]='--all -a --help -h --no-pager --version
 | |
|                              --no-legend --no-ask-password -l --full --value'
 | |
|                       [ARG]='--host -H --kill-who --property -p --signal -s -M --machine
 | |
|                              -n --lines -o --output'
 | |
|         )
 | |
| 
 | |
|         if __contains_word "$prev" ${OPTS[ARG]}; then
 | |
|                 case $prev in
 | |
|                         --signal|-s)
 | |
|                                 _signals
 | |
|                                 return
 | |
|                         ;;
 | |
|                         --kill-who)
 | |
|                                 comps='all leader'
 | |
|                         ;;
 | |
|                         --host|-H)
 | |
|                                 comps=$(compgen -A hostname)
 | |
|                         ;;
 | |
|                         --property|-p)
 | |
|                                 comps=''
 | |
|                         ;;
 | |
|                 esac
 | |
|                 COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
 | |
|                 return 0
 | |
|         fi
 | |
| 
 | |
| 
 | |
|         if [[ "$cur" = -* ]]; then
 | |
|                 COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
 | |
|                 return 0
 | |
|         fi
 | |
| 
 | |
|         local -A VERBS=(
 | |
|                 [SESSIONS]='session-status show-session activate lock-session unlock-session terminate-session kill-session'
 | |
|                 [USERS]='user-status show-user enable-linger disable-linger terminate-user kill-user'
 | |
|                 [SEATS]='seat-status show-seat terminate-seat'
 | |
|                 [STANDALONE]='list-sessions lock-sessions unlock-sessions list-users list-seats flush-devices'
 | |
|                 [ATTACH]='attach'
 | |
|         )
 | |
| 
 | |
|         for ((i=0; i < COMP_CWORD; i++)); do
 | |
|                 if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
 | |
|                  ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
 | |
|                         verb=${COMP_WORDS[i]}
 | |
|                         break
 | |
|                 fi
 | |
|         done
 | |
| 
 | |
|         if   [[ -z $verb ]]; then
 | |
|                 comps="${VERBS[*]}"
 | |
| 
 | |
|         elif __contains_word "$verb" ${VERBS[SESSIONS]}; then
 | |
|                 comps=$( __get_all_sessions )
 | |
| 
 | |
|         elif __contains_word "$verb" ${VERBS[USERS]}; then
 | |
|                 comps=$( __get_all_users )
 | |
| 
 | |
|         elif __contains_word "$verb" ${VERBS[SEATS]}; then
 | |
|                 comps=$( __get_all_seats )
 | |
| 
 | |
|         elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
 | |
|                 comps=''
 | |
| 
 | |
|         elif __contains_word "$verb" ${VERBS[ATTACH]}; then
 | |
|                 if [[ $prev = $verb ]]; then
 | |
|                         comps=$( __get_all_seats )
 | |
|                 else
 | |
|                         comps=$(compgen -A file -- "$cur" )
 | |
|                         compopt -o filenames
 | |
|                 fi
 | |
|         fi
 | |
| 
 | |
|         COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
 | |
|         return 0
 | |
| }
 | |
| 
 | |
| complete -F _loginctl loginctl
 | 
