File: loginctl

package info (click to toggle)
elogind 255.17-1debian3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 14,556 kB
  • sloc: ansic: 162,957; xml: 22,072; python: 1,158; sh: 314; makefile: 174; cpp: 51; awk: 29
file content (146 lines) | stat: -rw-r--r-- 5,195 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# loginctl(1) completion                                  -*- shell-script -*-
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# 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 elogind; If not, see <https://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; } ; }

__get_machines() {
    local a b
    { machinectl list --full --max-addresses=0 --no-legend --no-pager 2>/dev/null; echo ".host"; } | \
	{ while read a b; do echo " $a"; done; } | \
        sort -u
}

_loginctl () {
    local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
    local i verb comps

#if 0 /// elogind supports some more options
#     local -A OPTS=(
#         [STANDALONE]='--all -a --help -h --no-pager --version
#                       --no-legend --no-ask-password -l --full --value'
#         [ARG]='--host -H --kill-whom --property -p --signal -s -M --machine
#                       -n --lines -o --output -P'
#     )
#else // 0
    local -A OPTS=(
        [STANDALONE]='--all -a --help -h --no-pager --version
                      --no-legend --no-ask-password -l --full --value --no-wall
                      --dry-run -c -i --ignore-inhibitors --firmware-setup'
        [ARG]='--host -H --kill-whom --property -p --signal -s -M --machine
                      -n --lines -o --output -P'
    )
#endif // 0

    if __contains_word "$prev" ${OPTS[ARG]}; then
        case $prev in
            --signal|-s)
                _signals
                return
                ;;
            --kill-whom|--kill-who)
                comps='all leader'
                ;;
            --host|-H)
                comps=$(compgen -A hostname)
                ;;
            --machine|-M)
                comps=$( __get_machines )
                ;;
            --property|-p|-P)
                comps=''
                ;;
            --output|-o)
                comps=$( loginctl --output=help 2>/dev/null )
                ;;
        esac
        COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
        return 0
    fi

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

#if 0 /// elogind supports more commands
#     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'
#     )
#else // 0
    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
                      reload poweroff reboot suspend hibernate hybrid-sleep suspend-then-hibernate'
        [ATTACH]='attach'
    )
#endif // 0

    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