mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
49805b3d81
When dealing with a large number of template instances, for example when launching daemons per VRF, it is hard for operators to correlate log lines to arguments. Add a new with-unit mode which, if available, prefixes unit and user unit names when displaying its log messages instead of the syslog identifier. It will also use the full timestamp with timezones, like the short-full mode.
128 lines
5.8 KiB
Bash
128 lines
5.8 KiB
Bash
# journalctl(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_machines() {
|
|
local a b
|
|
(machinectl list-images --no-legend --no-pager; machinectl list --no-legend --no-pager; echo ".host") | \
|
|
{ while read a b; do echo " $a"; done; } | sort -u;
|
|
}
|
|
|
|
__syslog_priorities=(emerg alert crit err warning notice info debug)
|
|
|
|
_journalctl() {
|
|
local field_vals= cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
|
|
local -A OPTS=(
|
|
[STANDALONE]='-a --all --full --system --user
|
|
--disk-usage -f --follow --header
|
|
-h --help -l --local --new-id128 -m --merge --no-pager
|
|
--no-tail -q --quiet --setup-keys --verify
|
|
--version --list-catalog --update-catalog --list-boots
|
|
--show-cursor --dmesg -k --pager-end -e -r --reverse
|
|
--utc -x --catalog --no-full --force --dump-catalog
|
|
--flush --rotate --sync --no-hostname -N --fields'
|
|
[ARG]='-b --boot -D --directory --file -F --field -t --identifier
|
|
-M --machine -o --output -u --unit --user-unit -p --priority
|
|
--root'
|
|
[ARGUNKNOWN]='-c --cursor --interval -n --lines -S --since -U --until
|
|
--after-cursor --verify-key
|
|
--vacuum-size --vacuum-time --vacuum-files --output-fields'
|
|
)
|
|
|
|
if __contains_word "$prev" ${OPTS[ARG]} ${OPTS[ARGUNKNOWN]}; then
|
|
case $prev in
|
|
--boot|-b)
|
|
comps=$(journalctl -F '_BOOT_ID' 2>/dev/null)
|
|
;;
|
|
--directory|-D|--root)
|
|
comps=$(compgen -d -- "$cur")
|
|
compopt -o filenames
|
|
;;
|
|
--file)
|
|
comps=$(compgen -f -- "$cur")
|
|
compopt -o filenames
|
|
;;
|
|
--output|-o)
|
|
comps='short short-full short-iso short-iso-precise short-precise short-monotonic short-unix verbose export json json-pretty json-sse cat with-unit'
|
|
;;
|
|
--field|-F)
|
|
comps=$(journalctl --fields | sort 2>/dev/null)
|
|
;;
|
|
--machine|-M)
|
|
comps=$( __get_machines )
|
|
;;
|
|
--priority|-p)
|
|
comps=${__syslog_priorities[*]}
|
|
;;
|
|
--unit|-u)
|
|
comps=$(journalctl -F '_SYSTEMD_UNIT' 2>/dev/null)
|
|
;;
|
|
--user-unit)
|
|
comps=$(journalctl -F '_SYSTEMD_USER_UNIT' 2>/dev/null)
|
|
;;
|
|
--identifier|-t)
|
|
comps=$(journalctl -F 'SYSLOG_IDENTIFIER' 2>/dev/null)
|
|
;;
|
|
*)
|
|
return 0
|
|
;;
|
|
esac
|
|
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
|
|
return 0
|
|
fi
|
|
|
|
if [[ $cur = -* ]]; then
|
|
COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
|
|
return 0
|
|
elif [[ $cur = *=* ]]; then
|
|
mapfile -t field_vals < <(journalctl -F "${prev%=}" 2>/dev/null)
|
|
COMPREPLY=( $(compgen -W '${field_vals[*]}' -- "${cur#=}") )
|
|
elif [[ $cur = /dev* ]]; then
|
|
compopt -o filenames
|
|
COMPREPLY=( $(compgen -f -- "${cur}") )
|
|
elif [[ $cur = /* ]]; then
|
|
# Append /dev/ to the list of completions, so that
|
|
# after typing /<TAB><TAB> the user sees /dev/ as one
|
|
# of the alternatives. Later on the rule above will
|
|
# take care of showing device files in /dev/.
|
|
mapfile -t field_vals < <(journalctl -F "_EXE" 2>/dev/null; echo '/dev/')
|
|
COMPREPLY=( $(compgen -W '${field_vals[*]}' -- "${cur}") )
|
|
if [[ "${COMPREPLY[@]}" = '/dev/' ]]; then
|
|
compopt -o filenames
|
|
COMPREPLY=( $(compgen -f -- "${cur}") )
|
|
fi
|
|
elif [[ $prev = '=' ]]; then
|
|
mapfile -t field_vals < <(journalctl -F "${COMP_WORDS[COMP_CWORD-2]}" 2>/dev/null)
|
|
COMPREPLY=( $(compgen -W '${field_vals[*]}' -- "$cur") )
|
|
else
|
|
mapfile -t field_vals < <(journalctl --fields 2>/dev/null)
|
|
compopt -o nospace
|
|
COMPREPLY=( $(compgen -W '${field_vals[*]}' -S= -- "$cur") )
|
|
fi
|
|
}
|
|
|
|
complete -F _journalctl journalctl
|