mirror of
https://github.com/systemd/systemd.git
synced 2024-10-31 07:51:21 +03:00
f34173a048
The words and cword variables are not localized in all Bash completion scripts that call _init_completion. cur, prev, words, and cword (and split if using the -s flag) are all variables that should be localized in Bash completion scripts before calling _init_completion (even if they don't otherwise appear in the calling script). This is done for cur and prev, but not for words and cword. Letting words and cword remain unlocalized may clobber variables the user is using for other purposes, which is bad. This issue can be resolved by declaring words and cword as local variables. Resolves #19188.
163 lines
5.2 KiB
Bash
163 lines
5.2 KiB
Bash
# systemd-analyze(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 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_machines() {
|
|
local a b
|
|
machinectl list --full --no-legend --no-pager | { while read a b; do echo " $a"; done; };
|
|
}
|
|
|
|
__get_services() {
|
|
systemctl list-units --no-legend --no-pager --plain -t service --all $1 | \
|
|
{ while read -r a b c; do [[ $b == "loaded" ]]; echo " $a"; done }
|
|
}
|
|
|
|
__get_syscall_sets() {
|
|
local line
|
|
systemd-analyze syscall-filter --no-pager | while IFS= read -r line; do
|
|
if [[ $line == @* ]]; then
|
|
printf '%s\n' "$line"
|
|
fi
|
|
done
|
|
}
|
|
|
|
_systemd_analyze() {
|
|
local i verb comps mode
|
|
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} words cword
|
|
|
|
local -A OPTS=(
|
|
[STANDALONE]='-h --help --version --system --user --global --order --require --no-pager
|
|
--man=no --generators=yes'
|
|
[ARG]='-H --host -M --machine --fuzz --from-pattern --to-pattern --root'
|
|
)
|
|
|
|
local -A VERBS=(
|
|
[STANDALONE]='time blame plot dump unit-paths exit-status condition calendar timestamp timespan'
|
|
[CRITICAL_CHAIN]='critical-chain'
|
|
[DOT]='dot'
|
|
[VERIFY]='verify'
|
|
[SECCOMP_FILTER]='syscall-filter'
|
|
[CAT_CONFIG]='cat-config'
|
|
[SECURITY]='security'
|
|
)
|
|
|
|
local CONFIGS='systemd/bootchart.conf systemd/coredump.conf systemd/journald.conf
|
|
systemd/journal-remote.conf systemd/journal-upload.conf systemd/logind.conf
|
|
systemd/resolved.conf systemd/networkd.conf systemd/resolved.conf
|
|
systemd/sleep.conf systemd/system.conf systemd/timedated.conf
|
|
systemd/timesyncd.conf systemd/user.conf udev/udev.conf'
|
|
|
|
_init_completion || return
|
|
|
|
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 __contains_word "$prev" ${OPTS[ARG]}; then
|
|
case $prev in
|
|
--host|-H)
|
|
comps=$(compgen -A hostname)
|
|
;;
|
|
--machine|-M)
|
|
comps=$( __get_machines )
|
|
;;
|
|
esac
|
|
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
|
|
return 0
|
|
fi
|
|
|
|
if [[ -z $verb && $cur = -* ]]; then
|
|
COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
|
|
return 0
|
|
fi
|
|
|
|
if [[ -z $verb ]]; then
|
|
comps=${VERBS[*]}
|
|
|
|
elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
|
|
if [[ $cur = -* ]]; then
|
|
comps='--help --version --system --user --global --no-pager'
|
|
fi
|
|
|
|
elif __contains_word "$verb" ${VERBS[CRITICAL_CHAIN]}; then
|
|
if [[ $cur = -* ]]; then
|
|
comps='--help --version --system --user --fuzz --no-pager'
|
|
fi
|
|
|
|
elif __contains_word "$verb" ${VERBS[DOT]}; then
|
|
if [[ $cur = -* ]]; then
|
|
comps='--help --version --system --user --global --from-pattern --to-pattern --order --require'
|
|
fi
|
|
|
|
elif __contains_word "$verb" ${VERBS[SECCOMP_FILTER]}; then
|
|
if [[ $cur = -* ]]; then
|
|
comps='--help --version --no-pager'
|
|
else
|
|
comps=$( __get_syscall_sets )
|
|
fi
|
|
|
|
elif __contains_word "$verb" ${VERBS[VERIFY]}; then
|
|
if [[ $cur = -* ]]; then
|
|
comps='--help --version --system --user --global --man=no --generators=yes'
|
|
else
|
|
comps=$( compgen -A file -- "$cur" )
|
|
compopt -o filenames
|
|
fi
|
|
|
|
elif __contains_word "$verb" ${VERBS[CAT_CONFIG]}; then
|
|
if [[ $cur = -* ]]; then
|
|
comps='--help --version --root --no-pager'
|
|
elif [[ -z $cur ]]; then
|
|
comps="$CONFIGS"
|
|
compopt -o filenames
|
|
else
|
|
comps="$CONFIGS $( compgen -A file -- "$cur" )"
|
|
compopt -o filenames
|
|
fi
|
|
|
|
elif __contains_word "$verb" ${VERBS[SECURITY]}; then
|
|
if [[ $cur = -* ]]; then
|
|
comps='--help --version --no-pager --system --user -H --host -M --machine'
|
|
else
|
|
if __contains_word "--user" ${COMP_WORDS[*]}; then
|
|
mode=--user
|
|
else
|
|
mode=--system
|
|
fi
|
|
comps=$( __get_services $mode )
|
|
fi
|
|
fi
|
|
|
|
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
|
|
return 0
|
|
}
|
|
|
|
complete -F _systemd_analyze systemd-analyze
|