summaryrefslogtreecommitdiff
path: root/shell-completion/zsh/_systemd
blob: 7e23d783266087f15807b61ee78be0254a35c605 (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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
#compdef udevadm systemd-analyze systemd-cat systemd-ask-password systemd-cgls systemd-cgtop systemd-delta systemd-detect-virt systemd-inhibit systemd-machine-id-setup systemd-notify systemd-nspawn systemd-tmpfiles systemd-tty-ask-password-agent machinectl

_ctls()
{
    local curcontext="$curcontext" state lstate line
    case "$service" in
        udevadm)
            _arguments \
                '--debug[Print debug messages to stderr]' \
                '--version[Print version number]' \
                '--help[Print help text]' \
                '*::udevadm commands:_udevadm_command'
        ;;
        systemd-analyze)
            _arguments \
                {-h,--help}'[Show help text.]' \
                '--user[Shows performance data of user sessions instead of the system manager.]' \
                '--order[When generating graph for dot, show only order]' \
                '--require[When generating graph for dot, show only requirement]' \
                '*::systemd-analyze commands:_systemd_analyze_command'
        ;;
        systemd-ask-password)
            _arguments \
                {-h,--help}'[Show this help]' \
                '--icon=[Icon name]' \
                '--timeout=[Timeout in sec]' \
                '--no-tty[Ask question via agent even on TTY]' \
                '--accept-cached[Accept cached passwords]' \
                '--multiple[List multiple passwords if available]'
        ;;
        systemd-cat)
            _arguments \
                {-h,--help}'[Show this help]' \
                '--version[Show package version.]' \
                {-t,--identifier=}'[Set syslog identifier.]' \
                {-p,--priority=}'[Set priority value.]:value:({0..7})' \
                '--level-prefix=[Control whether level prefix shall be parsed.]:boolean:(1 0)' \
                ':Message'
        ;;
        systemd-cgls)
            _arguments \
                {-h,--help}'[Show this help]' \
                '--version[Show package version]' \
                '--no-pager[Do not pipe output into a pager]' \
                {-a,--all}'[Show all groups, including empty]' \
                '-k[Include kernel threads in output]' \
                ':cgroups:(cpuset cpu cpuacct memory devices freezer net_cls blkio)'
        ;;
        systemd-cgtop)
            _arguments \
                {-h,--help}'[Show this help]' \
                '--version[Print version and exit]' \
                '(-c -m -i -t)-p[Order by path]' \
                '(-c -p -m -i)-t[Order by number of tasks]' \
                '(-m -p -i -t)-c[Order by CPU load]' \
                '(-c -p -i -t)-m[Order by memory load]' \
                '(-c -m -p -t)-i[Order by IO load]' \
                {-d,--delay=}'[Specify delay]' \
                {-n,--iterations=}'[Run for N iterations before exiting]' \
                {-b,--batch}'[Run in batch mode, accepting no input]' \
                '--depth=[Maximum traversal depth]'
        ;;
        systemd-delta)
            _arguments \
                {-h,--help}'[Show this help]' \
                '--version[Show package version]' \
                '--no-pager[Do not pipe output into a pager]' \
                '--diff=[Show a diff when overridden files differ]:boolean:(1 0)' \
                {-t,--type=}'[Only display a selected set of override types]:types:(masked equivalent redirected overridden unchanged)' \
                ':SUFFIX:(tmpfiles.d sysctl.d systemd/system)'
        ;;
        systemd-detect-virt)
            _arguments \
                {-h,--help}'[Show this help]' \
                '--version[Show package version]' \
                {-c,--container}'[Only detect whether we are run in a container]' \
                {-v,--vm}'[Only detect whether we are run in a VM]' \
                {-q,--quiet}"[Don't output anything, just set return value]"
        ;;
        systemd-inhibit)
            _arguments \
                {-h,--help}'[Show this help]' \
                '--version[Show package version]' \
                '--what=[Operations to inhibit]:options:(shutdown sleep idle handle-power-key handle-suspend-key handle-hibernate-key handle-lid-switch)' \
                '--who=[A descriptive string who is inhibiting]' \
                '--why=[A descriptive string why is being inhibited]' \
                '--mode=[One of block or delay]' \
                '--list[List active inhibitors]' \
                '*:commands:_systemd_inhibit_command'
        ;;
        systemd-machine-id-setup)
            _arguments \
                {-h,--help}'[Show this help]' \
                '--version[Show package version]'
        ;;
        systemd-notify)
            _arguments \
                {-h,--help}'[Show this help]' \
                '--version[Show package version]' \
                '--ready[Inform the init system about service start-up completion.]' \
                '--pid=[Inform the init system about the main PID of the daemon]' \
                '--status=[Send a free-form status string for the daemon to the init systemd]' \
                '--booted[Returns 0 if the system was booted up with systemd]' \
                '--readahead=[Controls disk read-ahead operations]:arguments:(cancel done noreply)'
        ;;
        systemd-nspawn)
            _arguments \
                {-h,--help}'[Show this help]' \
                {--directory=,-D}'[Directory to use as file system root for the namespace container. If omitted the current directory will be used.]:directories:_directories' \
                {--boot,-b}'[Automatically search for an init binary and invoke it instead of a shell or a user supplied program.]' \
                {--user=,-u}'[Run the command under specified user, create home directory and cd into it.]' \
                '--uuid=[Set the specified uuid for the container.]' \
                {--controllers=,-C}'[Makes the container appear in other hierarchies than the name=systemd:/ one. Takes a comma-separated list of controllers.]' \
                '--private-network[Turn off networking in the container. This makes all network interfaces unavailable in the container, with the exception of the loopback device.]' \
                '--read-only[Mount the root file system read only for the container.]' \
                '--capability=[List one or more additional capabilities to grant the container.]:capabilities:_systemd-nspawn' \
                "--link-journal=[Control whether the container's journal shall be made visible to the host system.]:options:(no, host, guest, auto)" \
                '-j[Equivalent to --link-journal=guest.]'
        ;;
        systemd-tmpfiles)
            _arguments \
                '--create[Create, set ownership/permissions based on the config files.]' \
                '--clean[Clean up all files and directories with an age parameter configured.]' \
                '--remove[All files and directories marked with r, R in the configuration files are removed.]' \
                '--prefix=[Only apply rules that apply to paths with the specified prefix.]' \
                '--exclude-prefix=[Ignore rules that apply to paths with the specified prefix.]' \
                '--help[Prints a short help text and exits.]' \
                '*::files:_files'
        ;;
        systemd-tty-ask-password-agent)
            _arguments \
                {-h,--help}'[Prints a short help text and exits.]' \
                '--version[Prints a short version string and exits.]' \
                '--list[Lists all currently pending system password requests.]' \
                '--query[Process all currently pending system password requests by querying the user on the calling TTY.]' \
                '--watch[Continuously process password requests.]' \
                '--wall[Forward password requests to wall(1).]' \
                '--plymouth[Ask question with plymouth(8).]' \
                '--console[Ask question on /dev/console.]'
        ;;
        machinectl)
            _arguments \
                {-h,--help}'[Prints a short help text and exits.]' \
                '--version[Prints a short version string and exits.]' \
                {-p,--property=}'[Limit output to specified property.]:property:(Name Id Timestamp TimestampMonotonic Service Scope Leader Class State RootDirectory)' \
                {-a,--all}'[Show all proerties]' \
                (-l,--full)'[Do not ellipsize cgroup members]' \
                '--no-pager[Do not pipe output into a pager]' \
                '--no-ask-password[Do not ask for system passwords]' \
                '--kill-who=[Who to send signal to]:killwho:(leader all)' \
                {-s,--signal=}'[Which signal to send]:signal:_signals' \
                {-H,--host=}'[Show information for remote host]:userathost:_hosts_or_user_at_host' \
                {-P,--privileged}'[Acquire privileges before execution]' \
                '*::machinectl command:_machinectl_command'
        ;;
        *) _message 'eh?' ;;
    esac
}

_systemd-nspawn(){
    local -a _caps
    _caps=( CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH
            CAP_FOWNER CAP_FSETID CAP_IPC_OWNER CAP_KILL CAP_LEASE CAP_LINUX_IMMUTABLE
            CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_SETGID CAP_SETFCAP CAP_SETPCAP
            CAP_SETUID CAP_SYS_ADMIN CAP_SYS_CHROOT CAP_SYS_NICE CAP_SYS_PTRACE CAP_SYS_TTY_CONFIG
            CAP_SYS_RESOURCE CAP_SYS_BOOT )
    _values -s , 'capabilities' "$_caps[@]"
}

_systemd_inhibit_command(){
    if (( CURRENT == 1 )); then
        compset -q
        _normal
    else
        local n=${words[(b:2:i)[^-]*]}
        if (( n <= CURRENT )); then
            compset -n $n
            _alternative \
                'files:file:_files' \
                'commands:command:_normal' && return 0
        fi
        _default
    fi

}

_systemd_analyze_command(){
    local -a _systemd_analyze_cmds
    # Descriptions taken from systemd-analyze --help.
    _systemd_analyze_cmds=(
        'time:Print time spent in the kernel before reaching userspace'
        'blame:Print list of running units ordered by time to init'
        'critical-chain:Print a tree of the time critical chain of units'
        'plot:Output SVG graphic showing service initialization'
        'dot:Dump dependency graph (in dot(1) format)'
    )

    if (( CURRENT == 1 )); then
        _describe "options" _systemd_analyze_cmds
    else
        _message "no more options"
    fi
}

_hosts_or_user_at_host()
{
  _alternative \
    'users-hosts:: _user_at_host' \
    'hosts:: _hosts'
}

_outputmodes() {
    local -a _output_opts
    _output_opts=(short short-monotonic verbose export json json-pretty json-see cat)
    _describe -t output 'output mode' _output_opts || compadd "$@"
}

(( $+functions[_machinectl_command] )) || _machinectl_command()
{
  local -a _machinectl_cmds
  _machinectl_cmds=(
    "list:List currently running VMs/containers"
    "status:Show VM/container status"
    "show:Show properties of one or more VMs/containers"
    "terminate:Terminate one or more VMs/containers"
    "kill:Send signal to process or a VM/container"
  )
  if (( CURRENT == 1 )); then
    _describe -t commands 'machinectl command' _machinectl_cmds || compadd "$@"
  else
    local curcontext="$curcontext"
    cmd="${${_machinectl_cmds[(r)$words[1]:*]%%:*}}"
    if (( $#cmd )); then
      case $cmd in
        list) msg="no options" ;;
        *)
          _machines=( "${(foa)$(machinectl list | awk '{print $1}')}" )
          if [[ -n "$_machines" ]]; then
            _describe 'machines' _machines
          else
            _message 'no machines'
          fi
      esac
    else
      _message "no more options"
    fi
  fi
}

_udevadm_info(){
    _arguments \
        '--query=[Query the database for specified type of device data. It needs the --path or --name to identify the specified device.]:type:(name symlink path property all)' \
        '--path=[The devpath of the device to query.]:sys files:_files -P /sys/ -W /sys' \
        '--name=[The name of the device node or a symlink to query]:device files:_files -P /dev/ -W /dev' \
        '--root[Print absolute paths in name or symlink query.]' \
        '--attribute-walk[Print all sysfs properties of the specified device that can be used in udev rules to match the specified device]' \
        '--export[Print output as key/value pairs.]' \
        '--export-prefix=[Add a prefix to the key name of exported values.]:prefix' \
        '--device-id-of-file=[Print major/minor numbers of the underlying device, where the file lives on.]:files:_udevadm_mounts' \
        '--export-db[Export the content of the udev database.]' \
        '--cleanup-db[Cleanup the udev database.]'
}

_udevadm_trigger(){
    _arguments \
        '--verbose[Print the list of devices which will be triggered.]' \
        '--dry-run[Do not actually trigger the event.]' \
        '--type=[Trigger a specific type of devices.]:types:(devices subsystems failed)' \
        '--action=[Type of event to be triggered.]:actions:(add change remove)' \
        '--subsystem-match=[Trigger events for devices which belong to a matching subsystem.]' \
        '--subsystem-nomatch=[Do not trigger events for devices which belong to a matching subsystem.]' \
        '--attr-match=attribute=[Trigger events for devices with a matching sysfs attribute.]' \
        '--attr-nomatch=attribute=[Do not trigger events for devices with a matching sysfs attribute.]' \
        '--property-match=[Trigger events for devices with a matching property value.]' \
        '--tag-match=property[Trigger events for devices with a matching tag.]' \
        '--sysname-match=[Trigger events for devices with a matching sys device name.]' \
        '--parent-match=[Trigger events for all children of a given device.]'
}

_udevadm_settle(){
    _arguments \
       '--timeout=[Maximum number of seconds to wait for the event queue to become empty.]' \
       '--seq-start=[Wait only for events after the given sequence number.]' \
       '--seq-end=[Wait only for events before the given sequence number.]' \
       '--exit-if-exists=[Stop waiting if file exists.]:files:_files' \
       '--quiet[Do not print any output, like the remaining queue entries when reaching the timeout.]' \
       '--help[Print help text.]'
}

_udevadm_control(){
    _arguments \
        '--exit[Signal and wait for systemd-udevd to exit.]' \
        '--log-priority=[Set the internal log level of systemd-udevd.]:priorities:(err info debug)' \
        '--stop-exec-queue[Signal systemd-udevd to stop executing new events. Incoming events will be queued.]' \
        '--start-exec-queue[Signal systemd-udevd to enable the execution of events.]' \
        '--reload[Signal systemd-udevd to reload the rules files and other databases like the kernel module index.]' \
        '--property=[Set a global property for all events.]' \
        '--children-max=[Set the maximum number of events.]' \
        '--timeout=[The maximum number of seconds to wait for a reply from systemd-udevd.]' \
        '--help[Print help text.]'
}

_udevadm_monitor(){
    _arguments \
        '--kernel[Print the kernel uevents.]' \
        '--udev[Print the udev event after the rule processing.]' \
        '--property[Also print the properties of the event.]' \
        '--subsystem-match=[Filter events by subsystem/\[devtype\].]' \
        '--tag-match=[Filter events by property.]' \
        '--help[Print help text.]'
}

_udevadm_test(){
    _arguments \
        '--action=[The action string.]:actions:(add change remove)' \
        '--subsystem=[The subsystem string.]' \
        '--help[Print help text.]' \
        '*::devpath:_files -P /sys/ -W /sys'
}

_udevadm_test-builtin(){
    if (( CURRENT == 2 )); then
    _arguments \
        '--help[Print help text]' \
        '*::builtins:(blkid btrfs hwdb input_id kmod path_id usb_id uaccess)'
    elif  (( CURRENT == 3 )); then
        _arguments \
            '--help[Print help text]' \
            '*::syspath:_files -P /sys -W /sys'
    else
        _arguments \
            '--help[Print help text]'
    fi
}

_udevadm_mounts(){
  local dev_tmp dpath_tmp mp_tmp mline

    tmp=( "${(@f)$(< /etc/mtab)}" )
    dev_tmp=( "${(@)${(@)tmp%% *}:#none}" )
    mp_tmp=( "${(@)${(@)tmp#* }%% *}" )

  local MATCH
  mp_tmp=("${(@q)mp_tmp//(#m)\\[0-7](#c3)/${(#)$(( 8#${MATCH[2,-1]} ))}}")
  dpath_tmp=( "${(@Mq)dev_tmp:#/*}" )
  dev_tmp=( "${(@q)dev_tmp:#/*}" )

  _alternative \
    'device-paths: device path:compadd -a dpath_tmp' \
    'directories:mount point:compadd -a mp_tmp'
}


_udevadm_command(){
    local -a _udevadm_cmds
    _udevadm_cmds=(
        'info:query sysfs or the udev database'
        'trigger:request events from the kernel'
        'settle:wait for the event queue to finish'
        'control:control the udev daemon'
        'monitor:listen to kernel and udev events'
        'test:test an event run'
        'test-builtin:test a built-in command'
    )

    if ((CURRENT == 1)); then
        _describe -t commands 'udevadm commands' _udevadm_cmds
    else
        local curcontext="$curcontext"
        cmd="${${_udevadm_cmds[(r)$words[1]:*]%%:*}}"
        if (($#cmd)); then
            if (( $+functions[_udevadm_$cmd] )); then
                _udevadm_$cmd
            else
                _message "no options for $cmd"
            fi
        else
            _message "no more options"
        fi
    fi
}

_ctls "$@"

#vim: set ft=zsh sw=4 ts=4 et