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 147 148 149 150 151 152 153 154 155
|
#compdef journalctl
# SPDX-License-Identifier: LGPL-2.1-or-later
(( $+functions[_journalctl_fields] )) ||
_journalctl_fields() {
local -a journal_fields
journal_fields=(MESSAGE{,_ID} PRIORITY CODE_{FILE,LINE,FUNC}
ERRNO SYSLOG_{FACILITY,IDENTIFIER,PID}
_{P,U,G}ID _COMM _EXE _CMDLINE
_AUDIT_{SESSION,LOGINUID}
_SYSTEMD_{CGROUP,SESSION,UNIT,OWNER_UID}
_SYSTEMD_USER_UNIT USER_UNIT
_SELINUX_CONTEXT _SOURCE_REALTIME_TIMESTAMP
_{BOOT,MACHINE}_ID _HOSTNAME _TRANSPORT
_KERNEL_{DEVICE,SUBSYSTEM}
_UDEV_{SYSNAME,DEVNODE,DEVLINK}
__CURSOR __{REALTIME,MONOTONIC}_TIMESTAMP)
case $_jrnl_none in
yes) _values -s '=' 'possible fields' \
"${journal_fields[@]}:value:_journalctl_field_values ${words[CURRENT]%%=*}" ;;
*) _describe 'possible fields' journal_fields ;;
esac
}
(( $+functions[_journalctl_none] )) ||
_journalctl_none() {
local -a _commands _files _jrnl_none
# Setting use-cache will slow this down considerably
_commands=( ${(f)"$(_call_program commands "$service $_sys_service_mgr -F _EXE" 2>/dev/null)"} )
_jrnl_none='yes'
_alternative : \
'files:/dev files:_files -W /dev ' \
'commands:commands:compadd -a _commands' \
'fields:fields:_journalctl_fields'
}
(( $+functions[_journalctl_field_values] )) ||
_journalctl_field_values() {
local -a _fields cmd
cmd=("journalctl $_sys_service_mgr" "-F ${@[-1]}" "2>/dev/null" )
_fields=$(_call_program fields $cmd[@])
_fields=${_fields//'\'/'\\'}
_fields=${_fields//':'/'\:'}
_fields=( ${(f)_fields} )
typeset -U _fields
_describe 'possible values' _fields
}
(( $+functions[_journalctl_boots] )) ||
_journalctl_boots() {
local -a _bootid _previousboots
_bootid=( ${(f)"$(_call_program bootid "$service -F _BOOT_ID")"} )
_previousboots=( -{1..${#_bootid}} )
_alternative : \
"offsets:boot offsets:compadd -a '_previousboots[1,-2]'" \
"bootid:boot ids:compadd -a _bootid"
}
(( $+functions[_journalctl_facilities] )) ||
_journalctl_facilities() {
local -a _journalctl_facilities
_journalctl_facilities=(help kern user mail daemon auth syslog lpr news uucp cron authpriv ftp local0 local1 local2 local3 local4 local5 local6 local7)
_describe 'possible values' _journalctl_facilities
}
(( $+functions[_journalctl_namespaces] )) ||
_journalctl_namespaces() {
local -a _journalctl_namespaces
_journalctl_namespaces=( ${(f)"$(_call_program namespaces "$service --list-namespaces --output=cat" 2>/dev/null)"} )
_describe 'possible values' _journalctl_namespaces
}
# Build arguments for "journalctl" to be used in completion.
# Use both --user and --system modes, they are not exclusive.
local -a _modes; _modes=(--user --system)
local -a _modes_with_arg; _modes_with_arg=(--directory -D -i --file -M --machine --root)
typeset -a _sys_service_mgr
local w k v i=0 n=$#words
while (( i++ < n )); do
w=$words[$i]
if (( $_modes[(I)$w] )); then
_sys_service_mgr+=($w)
else
# Handle options with arguments. "--key=value" and "--key value".
k=${w%%=*}
if (( ${_modes_with_arg[(I)$k]} )); then
v=${w#*=}
if [[ "$k" != "$w" ]]; then
# "--key=value" style.
_sys_service_mgr+=($w)
else
# "--key value" style.
_sys_service_mgr+=($w ${words[((++i))]})
fi
fi
fi
done
_arguments -s \
'(- *)'{-h,--help}'[Show this help]' \
'(- *)--version[Show package version]' \
'--no-pager[Do not pipe output into a pager]' \
'(-W --no-hostname)'{-W,--no-hostname}"[Don't show the hostname of log messages]" \
'(-l --full)'{-l,--full}'[Show long fields in full]' \
'(-a --all)'{-a,--all}'[Show all fields, including long and unprintable]' \
'(-f --follow)'{-f,--follow}'[Follow journal]' \
'(-e --pager-end)'{-e,--pager-end}'[Jump to the end of the journal in the pager]' \
'(-n --lines)'{-n+,--lines=}'[Number of journal entries to show]:integer' \
'--no-tail[Show all lines, even in follow mode]' \
'(-r --reverse)'{-r,--reverse}'[Reverse output]' \
'(-o --output)'{-o+,--output=}'[Change journal output mode]:output modes:_sd_outputmodes' \
'(-x --catalog)'{-x,--catalog}'[Show explanatory texts with each log line]' \
'(-q --quiet)'{-q,--quiet}"[Don't show privilege warning]" \
'(-m --merge)'{-m,--merge}'[Show entries from all available journals]' \
'(-b --boot)'{-b+,--boot=}'[Show data only from the specified boot or offset]::boot id or offset:_journalctl_boots' \
'--list-boots[List boots ordered by time]' \
'(-k --dmesg)'{-k,--dmesg}'[Show only kernel messages from the current boot]' \
'(-u --unit)'{-u+,--unit=}'[Show data only from the specified unit]:units:_journalctl_field_values _SYSTEMD_UNIT' \
'--user-unit=[Show data only from the specified user session unit]:units:_journalctl_field_values USER_UNIT' \
'(-p --priority)'{-p+,--priority=}'[Show only messages within the specified priority range]:priority:_journalctl_field_values PRIORITY' \
'--facility=[Filter messages by facility]:facility:_journalctl_facilities' \
'(-t --identifier)'{-t+,--identifier=}'[Filter messages by syslog identifier]:identifier:_journalctl_field_values SYSLOG_IDENTIFIER' \
'(-c --cursor)'{-c+,--cursor=}'[Start showing entries from the specified cursor]:cursors:_journalctl_field_values __CURSORS' \
'--cursor-file=[Show entries using cursor stored in file]:file:_files' \
'--after-cursor=[Start showing entries from after the specified cursor]:cursors:_journalctl_field_values __CURSORS' \
'--since=[Start showing entries on or newer than the specified date]:YYYY-MM-DD HH\:MM\:SS' \
'--until=[Stop showing entries on or older than the specified date]:YYYY-MM-DD HH\:MM\:SS' \
'(-g --grep)'{-g+,--grep=}'[Show entries with MESSAGE field matching PCRE pattern]' \
'--case-sensitive=[Force case sensitive or insensitive matching]:boolean:(true false)' \
'(-F --field)'{-F,--field=}'[List all values a certain field takes]:Fields:_journalctl_fields' \
'--system[Show system and kernel messages]' \
'--user[Show messages from user services]' \
'(--directory -D -M --machine --root --file)'{-M+,--machine=}'[Operate on local container]:machines:_sd_machines' \
'(--directory -D -M --machine --root --file)'{-D+,--directory=}'[Show journal files from directory]:directories:_directories' \
'(--directory -D -M --machine --root --file)--root=[Operate on catalog hierarchy under specified directory]:directories:_directories' \
'(--directory -D -M --machine --root)*'{-i+,--file=}'[Operate on specified journal files]:file:_files' \
'--disk-usage[Show total disk usage]' \
'--dump-catalog[Dump messages in catalog]' \
'--flush[Flush all journal data from /run into /var]' \
'--force[Force recreation of the FSS keys]' \
'--header[Show journal header information]' \
'--interval=[Time interval for changing the FSS sealing key]:time interval' \
'--list-catalog[List messages in catalog]' \
'--list-namespaces[List available journal namespaces]' \
'--namespace[Show journal data from specified namespace]:namespace:_journalctl_namespaces' \
'--new-id128[Generate a new 128 Bit ID]' \
'--rotate[Request immediate rotation of the journal files]' \
'--setup-keys[Generate a new FSS key pair]' \
'--sync[Synchronize unwritten journal messages to disk]' \
'--update-catalog[Update binary catalog database]' \
'--vacuum-files=[Leave only the specified number of journal files]:integer' \
'--vacuum-size=[Reduce disk usage below specified size]:bytes' \
'--vacuum-time=[Remove journal files older than specified time]:time' \
'--verify-key=[Specify FSS verification key]:FSS key' \
'--verify[Verify journal file consistency]' \
'*::default: _journalctl_none'
|