summaryrefslogtreecommitdiffstats
path: root/shell-completion/zsh/_journalctl
blob: b77bf3fa1bbe526a5f8eaffc95db5fd19298738b (plain)
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
#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 -P /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
}

# 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 --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]' \
    --no-hostname"[Don't show the hostname of local log messages]" \
    {-l,--full}'[Show long fields in full]' \
    {-a,--all}'[Show all fields, including long and unprintable]' \
    {-f,--follow}'[Follow journal]' \
    {-e,--pager-end}'[Jump to the end of the journal in the pager]' \
    {-n+,--lines=}'[Number of journal entries to show]:integer' \
    '--no-tail[Show all lines, even in follow mode]' \
    {-r,--reverse}'[Reverse output]' \
    {-o+,--output=}'[Change journal output mode]:output modes:_sd_outputmodes' \
    {-x,--catalog}'[Show explanatory texts with each log line]' \
    {-q,--quiet}"[Don't show privilege warning]" \
    {-m,--merge}'[Show entries from all available journals]' \
    {-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}'[Show only kernel messages from the current boot]' \
    {-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=}'[Show only messages within the specified priority range]:priority:_journalctl_field_values PRIORITY' \
    '--facility=[Filter messages by facility]:facility:_journalctl_facilities' \
    {-t+,--identifier=}'[Filter messages by syslog identifier]:identifier:_journalctl_field_values SYSLOG_IDENTIFIER' \
    {-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=}'[Show entries with MESSAGE field matching PCRE pattern]' \
    '--case-sensitive=[Force case sensitive or insensitive matching]:boolean:(true false)' \
    {-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)*--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]' \
    '--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'