1 # bpftool(8) bash completion -*- shell-script -*-
3 # Copyright (C) 2017 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_prog_ids()
84 COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \
85 command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) )
88 _bpftool_get_prog_tags()
90 COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \
91 command sed -n 's/.*"tag": "\(.*\)",$/\1/p' )" -- "$cur" ) )
94 # For bpftool map update: retrieve type of the map to update.
95 _bpftool_map_update_map_type()
98 for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
99 if [[ ${words[$((idx-2))]} == "update" ]]; then
100 keyword=${words[$((idx-1))]}
101 ref=${words[$((idx))]}
104 [[ -z $ref ]] && return 0
107 type=$(bpftool -jp map show $keyword $ref | \
108 command sed -n 's/.*"type": "\(.*\)",$/\1/p')
112 _bpftool_map_update_get_id()
114 # Is it the map to update, or a map to insert into the map to update?
115 # Search for "value" keyword.
117 for (( idx=7; idx < ${#words[@]}-1; idx++ )); do
118 if [[ ${words[idx]} == "value" ]]; then
123 [[ $value -eq 0 ]] && _bpftool_get_map_ids && return 0
125 # Id to complete is for a value. It can be either prog id or map id. This
126 # depends on the type of the map to update.
127 local type=$(_bpftool_map_update_map_type)
129 array_of_maps|hash_of_maps)
134 _bpftool_get_prog_ids
145 local cur prev words objword
146 _init_completion || return
148 # Deal with simplest keywords
150 help|key|opcodes|visual)
154 _bpftool_get_prog_tags
162 COMPREPLY=( $( compgen -W 'file' -- "$cur" ) )
167 # Search for object and command
168 local object command cmdword
169 for (( cmdword=1; cmdword < ${#words[@]}-1; cmdword++ )); do
170 [[ -n $object ]] && command=${words[cmdword]} && break
171 [[ ${words[cmdword]} != -* ]] && object=${words[cmdword]}
174 if [[ -z $object ]]; then
177 local c='--version --json --pretty'
178 COMPREPLY=( $( compgen -W "$c" -- "$cur" ) )
182 COMPREPLY=( $( compgen -W "$( bpftool help 2>&1 | \
184 -e '/OBJECT := /!d' \
187 -e 's/|//g' )" -- "$cur" ) )
188 COMPREPLY+=( $( compgen -W 'batch help' -- "$cur" ) )
194 [[ $command == help ]] && return 0
196 # Completion depends on object and command in use
201 _bpftool_get_prog_ids
206 local PROG_TYPE='id pinned tag'
209 [[ $prev != "$command" ]] && return 0
210 COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
216 COMPREPLY+=( $( compgen -W "xlated jited" -- \
221 COMPREPLY=( $( compgen -W "$PROG_TYPE" -- \
226 _bpftool_once_attr 'file'
227 if _bpftool_search_list 'xlated'; then
228 COMPREPLY+=( $( compgen -W 'opcodes visual' -- \
231 COMPREPLY+=( $( compgen -W 'opcodes' -- \
239 if [[ $prev == "$command" ]]; then
240 COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
251 [[ $prev == $object ]] && \
252 COMPREPLY=( $( compgen -W 'dump help pin load \
253 show list' -- "$cur" ) )
258 local MAP_TYPE='id pinned'
263 COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
275 lookup|getnext|delete)
278 COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
289 _bpftool_once_attr 'key'
297 COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
301 _bpftool_map_update_get_id
308 # We can have bytes, or references to a prog or a
309 # map, depending on the type of the map to update.
310 case $(_bpftool_map_update_map_type) in
311 array_of_maps|hash_of_maps)
312 local MAP_TYPE='id pinned'
313 COMPREPLY+=( $( compgen -W "$MAP_TYPE" \
318 local PROG_TYPE='id pinned tag'
319 COMPREPLY+=( $( compgen -W "$PROG_TYPE" \
330 _bpftool_once_attr 'key'
331 local UPDATE_FLAGS='any exist noexist'
332 for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
333 if [[ ${words[idx]} == 'value' ]]; then
334 # 'value' is present, but is not the last
335 # word i.e. we can now have UPDATE_FLAGS.
336 _bpftool_one_of_list "$UPDATE_FLAGS"
340 for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
341 if [[ ${words[idx]} == 'key' ]]; then
342 # 'key' is present, but is not the last
343 # word i.e. we can now have 'value'.
344 _bpftool_once_attr 'value'
353 if [[ $prev == "$command" ]]; then
354 COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
361 [[ $prev == $object ]] && \
362 COMPREPLY=( $( compgen -W 'delete dump getnext help \
363 lookup pin show list update' -- "$cur" ) )
374 local ATTACH_TYPES='ingress egress sock_create sock_ops \
375 device bind4 bind6 post_bind4 post_bind6 connect4 \
377 local ATTACH_FLAGS='multi override'
378 local PROG_TYPE='id pinned tag'
384 ingress|egress|sock_create|sock_ops|device|bind4|bind6|\
385 post_bind4|post_bind6|connect4|connect6)
386 COMPREPLY=( $( compgen -W "$PROG_TYPE" -- \
391 _bpftool_get_prog_ids
395 if ! _bpftool_search_list "$ATTACH_TYPES"; then
396 COMPREPLY=( $( compgen -W "$ATTACH_TYPES" -- \
398 elif [[ "$command" == "attach" ]]; then
399 # We have an attach type on the command line,
400 # but it is not the previous word, or
401 # "id|pinned|tag" (we already checked for
402 # that). This should only leave the case when
403 # we need attach flags for "attach" commamnd.
404 _bpftool_one_of_list "$ATTACH_FLAGS"
411 [[ $prev == $object ]] && \
412 COMPREPLY=( $( compgen -W 'help attach detach \
413 show list' -- "$cur" ) )
419 complete -F _bpftool bpftool
421 # ex: ts=4 sw=4 et filetype=sh