1 # bpftool(8) bash completion -*- shell-script -*-
3 # Copyright (C) 2017-2018 Netronome Systems, Inc.
5 # This software is dual licensed under the GNU General License
6 # Version 2, June 1991 as shown in the file COPYING in the top-level
7 # directory of this source tree or the BSD 2-Clause License provided
8 # below. You have the option to license this software under the
9 # complete terms of either license.
11 # The BSD 2-Clause License:
13 # Redistribution and use in source and binary forms, with or
14 # without modification, are permitted provided that the following
17 # 1. Redistributions of source code must retain the above
18 # copyright notice, this list of conditions and the following
21 # 2. Redistributions in binary form must reproduce the above
22 # copyright notice, this list of conditions and the following
23 # disclaimer in the documentation and/or other materials
24 # provided with the distribution.
26 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30 # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31 # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35 # Author: Quentin Monnet <quentin.monnet@netronome.com>
37 # Takes a list of words in argument; each one of them is added to COMPREPLY if
38 # it is not already present on the command line. Returns no value.
44 for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
45 if [[ $w == ${words[idx]} ]]; then
50 [[ $found -eq 0 ]] && \
51 COMPREPLY+=( $( compgen -W "$w" -- "$cur" ) )
55 # Takes a list of words as argument; if any of those words is present on the
56 # command line, return 0. Otherwise, return 1.
57 _bpftool_search_list()
61 for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
62 [[ $w == ${words[idx]} ]] && return 0
68 # Takes a list of words in argument; adds them all to COMPREPLY if none of them
69 # is already present on the command line. Returns no value.
70 _bpftool_one_of_list()
72 _bpftool_search_list $* && return 1
73 COMPREPLY+=( $( compgen -W "$*" -- "$cur" ) )
76 _bpftool_get_map_ids()
78 COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \
79 command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) )
82 _bpftool_get_perf_map_ids()
84 COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \
85 command grep -C2 perf_event_array | \
86 command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) )
90 _bpftool_get_prog_ids()
92 COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \
93 command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) )
96 _bpftool_get_prog_tags()
98 COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \
99 command sed -n 's/.*"tag": "\(.*\)",$/\1/p' )" -- "$cur" ) )
102 # For bpftool map update: retrieve type of the map to update.
103 _bpftool_map_update_map_type()
106 for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
107 if [[ ${words[$((idx-2))]} == "update" ]]; then
108 keyword=${words[$((idx-1))]}
109 ref=${words[$((idx))]}
112 [[ -z $ref ]] && return 0
115 type=$(bpftool -jp map show $keyword $ref | \
116 command sed -n 's/.*"type": "\(.*\)",$/\1/p')
120 _bpftool_map_update_get_id()
122 # Is it the map to update, or a map to insert into the map to update?
123 # Search for "value" keyword.
125 for (( idx=7; idx < ${#words[@]}-1; idx++ )); do
126 if [[ ${words[idx]} == "value" ]]; then
131 [[ $value -eq 0 ]] && _bpftool_get_map_ids && return 0
133 # Id to complete is for a value. It can be either prog id or map id. This
134 # depends on the type of the map to update.
135 local type=$(_bpftool_map_update_map_type)
137 array_of_maps|hash_of_maps)
142 _bpftool_get_prog_ids
153 local cur prev words objword
154 _init_completion || return
157 if [[ ${words[cword]} == -* ]]; then
158 local c='--version --json --pretty --bpffs'
159 COMPREPLY=( $( compgen -W "$c" -- "$cur" ) )
163 # Deal with simplest keywords
165 help|hex|opcodes|visual)
169 _bpftool_get_prog_tags
177 COMPREPLY=( $( compgen -W 'file' -- "$cur" ) )
182 # Remove all options so completions don't have to deal with them.
184 for (( i=1; i < ${#words[@]}; )); do
185 if [[ ${words[i]::1} == - ]]; then
186 words=( "${words[@]:0:i}" "${words[@]:i+1}" )
187 [[ $i -le $cword ]] && cword=$(( cword - 1 ))
193 prev=${words[cword - 1]}
195 local object=${words[1]} command=${words[2]}
197 if [[ -z $object || $cword -eq 1 ]]; then
200 COMPREPLY=( $( compgen -W "$( bpftool help 2>&1 | \
202 -e '/OBJECT := /!d' \
205 -e 's/|//g' )" -- "$cur" ) )
206 COMPREPLY+=( $( compgen -W 'batch help' -- "$cur" ) )
212 [[ $command == help ]] && return 0
214 # Completion depends on object and command in use
219 _bpftool_get_prog_ids
224 local PROG_TYPE='id pinned tag'
227 [[ $prev != "$command" ]] && return 0
228 COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
234 COMPREPLY+=( $( compgen -W "xlated jited" -- \
239 COMPREPLY=( $( compgen -W "$PROG_TYPE" -- \
244 _bpftool_once_attr 'file'
245 if _bpftool_search_list 'xlated'; then
246 COMPREPLY+=( $( compgen -W 'opcodes visual' -- \
249 COMPREPLY+=( $( compgen -W 'opcodes' -- \
257 if [[ $prev == "$command" ]]; then
258 COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
269 [[ $prev == $object ]] && \
270 COMPREPLY=( $( compgen -W 'dump help pin load \
271 show list' -- "$cur" ) )
276 local MAP_TYPE='id pinned'
281 COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
293 lookup|getnext|delete)
296 COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
304 COMPREPLY+=( $( compgen -W 'hex' -- "$cur" ) )
307 _bpftool_once_attr 'key'
315 COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
319 _bpftool_map_update_get_id
323 COMPREPLY+=( $( compgen -W 'hex' -- "$cur" ) )
326 # We can have bytes, or references to a prog or a
327 # map, depending on the type of the map to update.
328 case $(_bpftool_map_update_map_type) in
329 array_of_maps|hash_of_maps)
330 local MAP_TYPE='id pinned'
331 COMPREPLY+=( $( compgen -W "$MAP_TYPE" \
336 local PROG_TYPE='id pinned tag'
337 COMPREPLY+=( $( compgen -W "$PROG_TYPE" \
342 COMPREPLY+=( $( compgen -W 'hex' \
350 _bpftool_once_attr 'key'
351 local UPDATE_FLAGS='any exist noexist'
352 for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
353 if [[ ${words[idx]} == 'value' ]]; then
354 # 'value' is present, but is not the last
355 # word i.e. we can now have UPDATE_FLAGS.
356 _bpftool_one_of_list "$UPDATE_FLAGS"
360 for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
361 if [[ ${words[idx]} == 'key' ]]; then
362 # 'key' is present, but is not the last
363 # word i.e. we can now have 'value'.
364 _bpftool_once_attr 'value'
373 if [[ $prev == "$command" ]]; then
374 COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
383 COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
387 _bpftool_get_perf_map_ids
397 _bpftool_once_attr 'cpu'
398 _bpftool_once_attr 'index'
404 [[ $prev == $object ]] && \
405 COMPREPLY=( $( compgen -W 'delete dump getnext help \
406 lookup pin event_pipe show list update' -- \
418 local ATTACH_TYPES='ingress egress sock_create sock_ops \
419 device bind4 bind6 post_bind4 post_bind6 connect4 \
420 connect6 sendmsg4 sendmsg6'
421 local ATTACH_FLAGS='multi override'
422 local PROG_TYPE='id pinned tag'
428 ingress|egress|sock_create|sock_ops|device|bind4|bind6|\
429 post_bind4|post_bind6|connect4|connect6|sendmsg4|\
431 COMPREPLY=( $( compgen -W "$PROG_TYPE" -- \
436 _bpftool_get_prog_ids
440 if ! _bpftool_search_list "$ATTACH_TYPES"; then
441 COMPREPLY=( $( compgen -W "$ATTACH_TYPES" -- \
443 elif [[ "$command" == "attach" ]]; then
444 # We have an attach type on the command line,
445 # but it is not the previous word, or
446 # "id|pinned|tag" (we already checked for
447 # that). This should only leave the case when
448 # we need attach flags for "attach" commamnd.
449 _bpftool_one_of_list "$ATTACH_FLAGS"
456 [[ $prev == $object ]] && \
457 COMPREPLY=( $( compgen -W 'help attach detach \
458 show list' -- "$cur" ) )
465 [[ $prev == $object ]] && \
466 COMPREPLY=( $( compgen -W 'help \
467 show list' -- "$cur" ) )
473 complete -F _bpftool bpftool
475 # ex: ts=4 sw=4 et filetype=sh