# tipc(8) completion -*- shell-script -*- _tipc_media() { local optind=$1 if [[ $cword -eq $optind ]]; then COMPREPLY=( $(compgen -W 'media' -- $cur) ) return 0 elif [[ $cword -eq $optind+1 ]]; then COMPREPLY=( $(compgen -W 'udp eth ib' -- $cur) ) return 0 fi return 1 } _tipc_bearer() { local optind=$1 local media i if _tipc_media $optind; then return fi for ((i = 0; i < $cword; i++)); do if [[ ${words[$i]} == 'media' ]]; then media=${words[$(($i + 1))]} fi done if [[ $cword -eq $optind+2 ]]; then case "$media" in "udp") COMPREPLY=( $(compgen -W 'name' -- $cur) ) ;; "eth" | "ib") COMPREPLY=( $(compgen -W 'device' -- $cur) ) ;; esac elif [[ $cword -eq $optind+3 ]]; then case "$media" in "udp") local names=$(tipc bearer list 2>/dev/null | awk -F: '/^udp:/ {print $2}') COMPREPLY=( $(compgen -W '$names' -- $cur) ) ;; "eth") local interfaces=$(command ls /sys/class/net/) COMPREPLY=( $(compgen -W '$interfaces' -- $cur) ) ;; esac fi } _tipc_link_opts() { COMPREPLY=( $(compgen -W 'priority tolerance window' -- $cur) ) } _tipc_link() { local optind=$1 local filter=$2 if [[ $cword -eq $optind ]]; then COMPREPLY=( $(compgen -W 'link' -- $cur) ) elif [[ $cword -eq $optind+1 ]]; then # awk drops link state and last trailing : local links=$(tipc link list 2>/dev/null | \ awk '{print substr($1, 0, length($1))}') local -a exclude [[ $filter == peers ]] && exclude=( -X broadcast-link ) COMPREPLY=( $(compgen "${exclude[@]}" -W '$links' -- $cur) ) fi } _tipc() { local cur prev words cword optind i p _init_completion || return optind=1 COMPREPLY=() # Flags can be placed anywhere in the commandline case "$cur" in -*) COMPREPLY=( $(compgen -W '-h --help' -- $cur) ) return ;; esac if [[ $cword -eq 1 ]]; then COMPREPLY=( $(compgen -W 'bearer link media nametable node socket' -- $cur) ) return fi case "${words[$optind]}" in bearer) (( optind++ )) if [[ $cword -eq $optind ]]; then COMPREPLY=( $(compgen -W 'enable disable set get list' -- $cur) ) return fi case "${words[$optind]}" in enable) local media params (( optind++ )) if [[ $cword -lt $optind+4 ]]; then _tipc_bearer $optind return fi for ((i = 0; i < $cword; i++)); do if [[ ${words[$i]} == 'media' ]]; then media=${words[$(($i + 1))]} fi done case "$media" in "udp") declare -a params=("localip" "localport" "remoteip" "remoteport" "domain" "priority") ;; "eth" | "ib") declare -a params=("domain" "priority") ;; *) return ;; esac # If the previous word was a known paramater we assume a value for # that key Note that this would break if the user attempts to use a # kown key as value for i in "${params[@]}"; do if [[ $prev == $i ]]; then return fi done # In order not to print already used options we remove them for p in "${words[@]}"; do for i in "${params[@]}"; do if [[ $p == $i ]]; then params=( "${params[@]/$i}" ) fi done done COMPREPLY=( $(compgen -W '${params[@]}' -- $cur) ) ;; disable) (( optind++ )) _tipc_bearer $optind ;; get) (( optind++ )) if [[ $cword -eq $optind ]]; then _tipc_link_opts elif [[ $cword -ge $optind+1 ]]; then _tipc_bearer $(($optind + 1)) fi ;; set) (( optind++ )) if [[ $cword -eq $optind ]]; then _tipc_link_opts elif [[ $cword -ge $optind+2 ]]; then _tipc_bearer $(($optind + 2)) fi ;; esac ;; link) (( optind++ )) if [[ $cword -eq $optind ]]; then COMPREPLY=( $(compgen -W 'get set list statistics' -- $cur) ) return fi case "${words[$optind]}" in get) (( optind++ )) if [[ $cword -eq $optind ]]; then _tipc_link_opts elif [[ $cword -ge $optind+1 ]]; then _tipc_link $(($optind + 1)) "peers" fi ;; set) (( optind++ )) if [[ $cword -eq $optind ]]; then _tipc_link_opts elif [[ $cword -ge $optind+2 ]]; then _tipc_link $(($optind + 2)) "peers" fi ;; statistics) (( optind++ )) if [[ $cword -eq $optind ]]; then COMPREPLY=( $(compgen -W 'show reset' -- $cur) ) return fi case "${words[$optind]}" in show|reset) _tipc_link $(($optind + 1)) ;; esac ;; esac ;; media) (( optind++ )) if [[ $cword -eq $optind ]]; then COMPREPLY=( $(compgen -W 'get set list' -- $cur) ) return fi case "${words[$optind]}" in get) (( optind++ )) if [[ $cword -eq $optind ]]; then _tipc_link_opts elif [[ $cword -ge $optind+1 ]]; then _tipc_media $(($optind + 1)) fi ;; set) (( optind++ )) if [[ $cword -eq $optind ]]; then _tipc_link_opts elif [[ $cword -ge $optind+2 ]]; then _tipc_media $(($optind + 2)) fi ;; esac ;; nametable) (( optind++ )) if [[ $cword -eq $optind ]]; then COMPREPLY=( $(compgen -W 'show' -- $cur) ) fi ;; node) (( optind++ )) if [[ $cword -eq $optind ]]; then COMPREPLY=( $(compgen -W 'list get set' -- $cur) ) return fi case "${words[$optind]}" in get|set) (( optind++ )) if [[ $cword -eq $optind ]]; then COMPREPLY=( $(compgen -W 'address netid' -- $cur) ) fi esac ;; socket) (( optind++ )) if [[ $cword -eq $optind ]]; then COMPREPLY=( $(compgen -W 'list' -- $cur) ) fi ;; esac } && complete -F _tipc tipc # ex: filetype=sh