summaryrefslogtreecommitdiffstats
path: root/completions/ip
diff options
context:
space:
mode:
Diffstat (limited to 'completions/ip')
-rw-r--r--completions/ip217
1 files changed, 122 insertions, 95 deletions
diff --git a/completions/ip b/completions/ip
index 12ad9aa..511f206 100644
--- a/completions/ip
+++ b/completions/ip
@@ -1,58 +1,78 @@
# ip(8) completion -*- shell-script -*-
-_iproute2_etc()
+_comp_cmd_ip__iproute2_etc()
{
- COMPREPLY+=($(compgen -W \
- "$(awk '!/#/ { print $2 }' /etc/iproute2/$1 2>/dev/null)" \
- -- "$cur"))
+ _comp_compgen -a split -- "$(_comp_awk '!/#/ { print $2 }' "/etc/iproute2/$1" \
+ 2>/dev/null)"
}
-_ip()
+_comp_cmd_ip__netns()
{
- local cur prev words cword
- _init_completion || return
+ _comp_compgen_split -- "$(
+ {
+ ${1-ip} -c=never netns list 2>/dev/null || ${1-ip} netns list
+ } | _comp_awk '{print $1}'
+ )"
+}
+
+_comp_cmd_ip()
+{
+ local cur prev words cword comp_args
+ _comp_initialize -- "$@" || return
case $prev in
- -V | -Version | -rc | -rcvbuf)
+ -V | -Version | -rc | -rcvbuf | -l | -loops)
return
;;
-f | -family)
- COMPREPLY=($(compgen -W 'inet inet6 ipx dnet link' -- "$cur"))
+ _comp_compgen -- -W 'inet inet6 ipx dnet link'
return
;;
-b | -batch)
- _filedir
+ _comp_compgen_filedir
+ return
+ ;;
+ -n | -netns)
+ _comp_cmd_ip__netns "$1"
return
;;
-force)
- COMPREPLY=($(compgen -W '-batch' -- "$cur"))
+ _comp_compgen -- -W '-batch'
return
;;
esac
- local subcword cmd subcmd=""
- for ((subcword = 1; subcword < ${#words[@]} - 1; subcword++)); do
+ local subcword cmd="" has_cmd="" subcmd=""
+ for ((subcword = 1; subcword < cword; subcword++)); do
[[ ${words[subcword]} == -b?(atch) ]] && return
- [[ -v cmd ]] && subcmd=${words[subcword]} && break
- [[ ${words[subcword]} != -* && \
- ${words[subcword - 1]} != -@(f?(amily)|rc?(vbuf)) ]] &&
- cmd=${words[subcword]}
+ [[ $has_cmd ]] && subcmd=${words[subcword]} && break
+ [[ ${words[subcword]} != -* &&
+ ${words[subcword - 1]} != -@(f?(amily)|rc?(vbuf)) ]] &&
+ cmd=${words[subcword]} has_cmd=set
done
- if [[ ! -v cmd ]]; then
+ if [[ ! $has_cmd ]]; then
case $cur in
-*)
- local c="-Version -statistics -details -resolve -family
- -oneline -timestamp -batch -rcvbuf"
- ((cword == 1)) && c+=" -force"
- COMPREPLY=($(compgen -W "$c" -- "$cur"))
+ _comp_compgen -a help - <<<"$(
+ ((cword == 1)) && printf '%s\n' -force
+ {
+ "$1" -c=never help || "$1" help
+ } 2>&1 | command sed -e \
+ 's/[{|}=]/\n/g' -e \
+ 's/\[\([^]]\{1,\}\)\]/\1/g'
+ )"
;;
*)
- COMPREPLY=($(compgen -W "help $($1 help 2>&1 | command sed -e \
- '/OBJECT := /,/}/!d' -e \
- 's/.*{//' -e \
- 's/}.*//' -e \
- 's/|//g')" -- "$cur"))
+ _comp_compgen_split -- "help $(
+ {
+ $1 -c=never help || $1 help
+ } 2>&1 | command sed -e \
+ '/OBJECT := /,/}/!d' -e \
+ 's/.*{//' -e \
+ 's/}.*//' -e \
+ 's/|//g'
+ )"
;;
esac
return
@@ -69,26 +89,26 @@ _ip()
delete)
case $((cword - subcword)) in
1)
- _available_interfaces
+ _comp_compgen_available_interfaces
;;
2)
- COMPREPLY=($(compgen -W 'type' -- "$cur"))
+ _comp_compgen -- -W 'type'
;;
3)
[[ $prev == type ]] &&
- COMPREPLY=($(compgen -W 'vlan veth vcan dummy
- ifb macvlan can' -- "$cur"))
+ _comp_compgen -- -W 'vlan veth vcan dummy ifb
+ macvlan can'
;;
esac
;;
set)
if ((cword - subcword == 1)); then
- _available_interfaces
+ _comp_compgen_available_interfaces
else
case $prev in
arp | dynamic | multicast | allmulticast | promisc | \
trailers)
- COMPREPLY=($(compgen -W 'on off' -- "$cur"))
+ _comp_compgen -- -W 'on off'
;;
txqueuelen | name | address | broadcast | mtu | netns | alias) ;;
@@ -97,25 +117,24 @@ _ip()
promisc trailers txqueuelen name address
broadcast mtu netns alias"
[[ $prev != @(up|down) ]] && c+=" up down"
- COMPREPLY=($(compgen -W "$c" -- "$cur"))
+ _comp_compgen -- -W "$c"
;;
esac
fi
;;
show)
if ((cword == subcword + 1)); then
- _available_interfaces
- COMPREPLY+=($(compgen -W 'dev group up' -- "$cur"))
+ _comp_compgen_available_interfaces
+ _comp_compgen -a -- -W 'dev group up'
elif [[ $prev == dev ]]; then
- _available_interfaces
+ _comp_compgen_available_interfaces
elif [[ $prev == group ]]; then
- _iproute2_etc group
+ _comp_cmd_ip__iproute2_etc group
fi
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help add delete set show' \
- -- "$cur"))
+ _comp_compgen -- -W 'help add delete set show'
;;
esac
;;
@@ -124,38 +143,38 @@ _ip()
case $subcmd in
add | change | replace)
if [[ $prev == dev ]]; then
- _available_interfaces
+ _comp_compgen_available_interfaces
elif [[ $prev == scope ]]; then
- _iproute2_etc rt_scopes
+ _comp_cmd_ip__iproute2_etc rt_scopes
else
: # TODO
fi
;;
del)
if [[ $prev == dev ]]; then
- _available_interfaces
+ _comp_compgen_available_interfaces
elif [[ $prev == scope ]]; then
- _iproute2_etc rt_scopes
+ _comp_cmd_ip__iproute2_etc rt_scopes
else
: # TODO
fi
;;
show | flush)
if ((cword == subcword + 1)); then
- _available_interfaces
- COMPREPLY+=($(compgen -W 'dev scope to label dynamic
+ _comp_compgen_available_interfaces
+ _comp_compgen -a -- -W 'dev scope to label dynamic
permanent tentative deprecated dadfailed temporary
- primary secondary up' -- "$cur"))
+ primary secondary up'
elif [[ $prev == dev ]]; then
- _available_interfaces
+ _comp_compgen_available_interfaces
elif [[ $prev == scope ]]; then
- _iproute2_etc rt_scopes
+ _comp_cmd_ip__iproute2_etc rt_scopes
fi
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help add change replace del
- show flush' -- "$cur"))
+ _comp_compgen -- -W 'help add change replace del show
+ flush'
;;
esac
;;
@@ -164,15 +183,14 @@ _ip()
case $subcmd in
list | add | del | flush)
if [[ $prev == dev ]]; then
- _available_interfaces
+ _comp_compgen_available_interfaces
else
: # TODO
fi
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help list add del flush' \
- -- "$cur"))
+ _comp_compgen -- -W 'help list add del flush'
;;
esac
;;
@@ -181,7 +199,7 @@ _ip()
case $subcmd in
list | flush)
if [[ $prev == proto ]]; then
- _iproute2_etc rt_protos
+ _comp_cmd_ip__iproute2_etc rt_protos
else
: # TODO
fi
@@ -189,25 +207,32 @@ _ip()
get)
# TODO
;;
- a | add | d | del | change | append | r | replace | monitor)
+ a | add | d | del | change | append | r | replace)
if [[ $prev == via ]]; then
- COMPREPLY=($(compgen -W "$($1 r | command sed -ne \
- 's/.*via \([0-9.]*\).*/\1/p')" -- "$cur"))
+ _comp_compgen_split -- "$(
+ {
+ $1 -c=never r 2>/dev/null || $1 r
+ } | command sed -ne \
+ 's/.*via \([0-9.]*\).*/\1/p'
+ )"
elif [[ $prev == "$subcmd" ]]; then
- COMPREPLY=($(compgen -W "table default \
- $($1 r | cut -d ' ' -f 1)" -- "$cur"))
+ _comp_compgen_split -- "table default $(
+ {
+ $1 -c=never r 2>/dev/null || $1 r
+ } | cut -d ' ' -f 1
+ )"
elif [[ $prev == dev ]]; then
- _available_interfaces -a
+ _comp_compgen_available_interfaces -a
elif [[ $prev == table ]]; then
- COMPREPLY=($(compgen -W 'local main default' -- "$cur"))
+ _comp_compgen -- -W 'local main default'
else
- COMPREPLY=($(compgen -W 'via dev weight' -- "$cur"))
+ _comp_compgen -- -W 'via dev weight'
fi
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help list flush get add del
- change append replace monitor' -- "$cur"))
+ _comp_compgen -- -W 'help list flush get add del change
+ append replace'
;;
esac
;;
@@ -221,16 +246,16 @@ _ip()
suppress_ifgroup | realms | nat | goto) ;;
iif | oif)
- _available_interfaces -a
+ _comp_compgen_available_interfaces -a
;;
table | lookup)
- COMPREPLY=($(compgen -W 'local main default' -- "$cur"))
+ _comp_compgen -- -W 'local main default'
;;
*)
- COMPREPLY=($(compgen -W 'from to tos dsfield fwmark
- uidrange ipproto sport dport priority table lookup
- protocol suppress_prefixlength suppress_ifgroup realms
- nat goto iif oif not' -- "$cur"))
+ _comp_compgen -- -W 'from to tos dsfield fwmark
+ uidrange ipproto sport dport priority table
+ lookup protocol suppress_prefixlength
+ suppress_ifgroup realms nat goto iif oif not'
;;
esac
;;
@@ -238,14 +263,14 @@ _ip()
if [[ $prev == protocol ]]; then
:
else
- COMPREPLY=($(compgen -W 'protocol' -- "$cur"))
+ _comp_compgen -- -W 'protocol'
fi
;;
restore | show) ;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help add del list flush save
- restore show' -- "$cur"))
+ _comp_compgen -- -W 'help add del list flush save
+ restore show'
;;
esac
;;
@@ -260,8 +285,8 @@ _ip()
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help add del change replace
- show flush' -- "$cur"))
+ _comp_compgen -- -W 'help add del change replace show
+ flush'
;;
esac
;;
@@ -276,8 +301,7 @@ _ip()
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help change show' \
- -- "$cur"))
+ _comp_compgen -- -W 'help change show'
;;
esac
;;
@@ -291,8 +315,7 @@ _ip()
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help add change del show prl
- 6rd' -- "$cur"))
+ _comp_compgen -- -W 'help add change del show prl 6rd'
;;
esac
;;
@@ -304,16 +327,15 @@ _ip()
;;
show)
if [[ $cword -eq $subcword+1 || $prev == dev ]]; then
- _available_interfaces
- [[ $prev != dev ]] &&
- COMPREPLY=($(compgen -W '${COMPREPLY[@]} dev' \
- -- "$cur"))
+ _comp_compgen_available_interfaces
+ if [[ $prev != dev ]]; then
+ _comp_compgen -a -W dev
+ fi
fi
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help add del show' \
- -- "$cur"))
+ _comp_compgen -- -W 'help add del show'
;;
esac
;;
@@ -325,7 +347,7 @@ _ip()
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help show' -- "$cur"))
+ _comp_compgen -- -W 'help show'
;;
esac
;;
@@ -335,7 +357,14 @@ _ip()
all) ;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help all' -- "$cur"))
+ _comp_compgen_split -- "help all $(
+ {
+ "$1" -c=never monitor help || "$1" monitor help
+ } 2>&1 | command sed -e \
+ '/OBJECTS := /,/[^|]$/!d' -e \
+ 's/OBJECTS := *//' -e \
+ 's/|//g'
+ )"
;;
esac
;;
@@ -348,13 +377,12 @@ _ip()
# TODO
;;
delete | exec | pids | set)
- [[ $prev == "$subcmd" ]] &&
- COMPREPLY=($(compgen -W "$($1 netns list)" -- "$cur"))
+ [[ $prev == "$subcmd" ]] && _comp_cmd_ip__netns "$1"
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'help add delete exec
- identify list list-id monitor pids set' -- "$cur"))
+ _comp_compgen -- -W 'help add delete exec identify list
+ list-id monitor pids set'
;;
esac
;;
@@ -366,13 +394,12 @@ _ip()
;;
*)
((cword == subcword)) &&
- COMPREPLY=($(compgen -W 'state policy monitor' \
- -- "$cur"))
+ _comp_compgen -- -W 'state policy monitor'
;;
esac
;;
esac
} &&
- complete -F _ip ip
+ complete -F _comp_cmd_ip ip
# ex: filetype=sh