cli: use --complete-args for connection add completion

And make it incredibly slow at the same time.
This commit is contained in:
Lubomir Rintel 2016-06-21 12:16:32 +02:00
parent c3422e917d
commit 8b39090597

View file

@ -993,240 +993,8 @@ _nmcli()
fi
;;
a|ad|add)
if [[ ${#words[@]} -eq 3 ]]; then
_nmcli_compl_COMMAND "${words[2]}" type ifname con-name autoconnect master slave-type
elif [[ ${#words[@]} -gt 3 ]]; then
_nmcli_array_delete_at words 0 1
LONG_OPTIONS=(help)
HELP_ONLY_AS_FIRST=1
_nmcli_compl_OPTIONS
case $? in
0)
return 0
;;
1)
if [[ "$HELP_ONLY_AS_FIRST" == 1 ]]; then
_nmcli_compl_COMMAND "${words[2]}" type ifname con-name autoconnect master slave-type
fi
return 0
;;
esac
OPTIONS_TYPE=
OPTIONS=(type ifname con-name autoconnect save master slave-type)
OPTIONS_MANDATORY=(type ifname)
COMMAND_ARGS_WAIT_OPTIONS=1
OPTIONS_MANDATORY_IFNAME=1
_nmcli_compl_ARGS && return 0
OPTIONS_MANDATORY_IFNAME=
if _nmcli_array_has_value OPTIONS "${OPTIONS_MANDATORY[@]}"; then
# we still have some missing mandatory options...
if [[ "$OPTIONS_UNKNOWN_OPTION" != '' ]]; then
if ! _nmcli_array_has_value OPTIONS "${OPTIONS_UNKNOWN_OPTION:1}"; then
# if we encountered an unknown option while having mandatory
# options, just return.
return 0
fi
fi
_nmcli_list "$(echo "${OPTIONS[@]}")"
return 0
fi
OPTIONS_IP=(ip4 ip6 gw4 gw6)
OPTIONS_SEP=(--)
OPTIONS_MANDATORY=()
case "$OPTIONS_TYPE" in
802-3|802-3-|802-3-e|802-3-et|802-3-eth|802-3-ethe|802-3-ether|802-3-ethern|802-3-etherne|802-3-ethernet| \
e|et|eth|ethe|ether|ethern|etherne|ethernet)
OPTIONS_TYPE=ethernet
OPTIONS_TYPED=(mac cloned-mac mtu)
;;
802-11-w|802-11-wi|802-11-wir|802-11-wire|802-11-wirel|802-11-wirele|802-11-wireles|802-11-wireless| \
wif|wifi)
OPTIONS_TYPE=wifi
OPTIONS_TYPED=(ssid mac cloned-mac mtu mode)
OPTIONS_MANDATORY=(ssid)
;;
wim|wima|wimax)
OPTIONS_TYPE=wimax
OPTIONS_TYPED=(mac nsp)
;;
g|gs|gsm)
OPTIONS_TYPE=gsm
OPTIONS_TYPED=(apn user password)
OPTIONS_MANDATORY=(apn)
;;
c|cd|cdm|cdma)
OPTIONS_TYPE=cdma
OPTIONS_TYPED=(user password)
;;
i|in|inf|infi|infin|infini|infinib|infiniba|infiniban|infiniband)
OPTIONS_TYPE=infiniband
OPTIONS_TYPED=(mac mtu transport-mode parent p-key)
;;
bl|blu|blue|bluet|blueto|bluetoo|bluetoot|bluetooth)
OPTIONS_TYPE=bluetooth
OPTIONS_TYPED=(addr bt-type)
;;
vl|vla|vlan)
OPTIONS_TYPE=vlan
OPTIONS_TYPED=(dev id flags ingress egress mtu)
OPTIONS_MANDATORY=(dev)
;;
bond)
OPTIONS_TYPE=bond
OPTIONS_TYPED=(mode miimon downdelay updelay arp-interval arp-ip-target primary lacp-rate)
;;
team)
OPTIONS_TYPE=team
OPTIONS_TYPED=(config)
;;
bridge)
OPTIONS_TYPE=bridge
OPTIONS_TYPED=(stp priority forward-delay hello-time max-age ageing-time mac)
;;
vp|vpn)
OPTIONS_TYPE=vpn
OPTIONS_TYPED=(vpn-type user)
OPTIONS_MANDATORY=(vpn-type)
;;
802-11-o|802-11-ol|802-11-olp|802-11-olpc|802-11-olpc-|802-11-olpc-m|802-11-olpc-me|802-11-olpc-mes|802-11-olpc-mesh| \
o|ol|olp|olpc|olpc-|olpc-m|olpc-me|olpc-mes|olpc-mesh)
OPTIONS_TYPE=olpc-mesh
OPTIONS_TYPED=(ssid channel dhcp-anycast)
OPTIONS_MANDATORY=(ssid)
;;
p|pp|ppp|pppo|pppoe)
OPTIONS_TYPE=pppoe
OPTIONS_TYPED=(username password service mtu mac)
OPTIONS_MANDATORY=(username)
;;
a|ad|ads|adsl)
OPTIONS_TYPE=adsl
OPTIONS_TYPED=(username password protocol encapsulation)
OPTIONS_MANDATORY=(username protocol)
;;
tu|tun)
OPTIONS_TYPE=tun
OPTIONS_TYPED=(mode owner group pi vnet-hdr multi-queue)
OPTIONS_MANDATORY=(mode)
;;
ip|ip-|ip-t|ip-tu|ip-tun|ip-tunn|ip-tunne|ip-tunnel)
OPTIONS_TYPE=ip-tunnel
OPTIONS_TYPED=(mode remote local dev)
OPTIONS_MANDATORY=(mode remote)
;;
m|ma|mac|macv|macvl|macvla|macvlan)
OPTIONS_TYPE=macvlan
OPTIONS_TYPED=(dev mode tap)
OPTIONS_MANDATORY=(dev mode)
;;
vx|vxl|vxla|vxlan)
OPTIONS_TYPE=vxlan
OPTIONS_TYPED=(id remote local dev source-port-min source-port-max destination-port)
OPTIONS_MANDATORY=(id remote)
;;
*)
# for an unknown connection type, we stop completion here
return 0
;;
esac
if [[ "$COMMAND_ARGS_WAIT_OPTIONS" -ne 1 ]]; then
# means, we are at the end of options. Nothing more to parse, just show
# what are the options now.
if [[ "${#OPTIONS_MANDATORY[@]}" -gt 0 ]]; then
_nmcli_list "$(echo "${OPTIONS[@]}") $(echo "${OPTIONS_TYPED[@]}")"
else
_nmcli_list "$(echo "${OPTIONS[@]}") $(echo "${OPTIONS_TYPED[@]}") $(echo "${OPTIONS_IP[@]}") $(echo "${OPTIONS_SEP[@]}")"
fi
return 0
fi
if [[ "${#OPTIONS[@]}" -gt 0 ]]; then
# we still have some options from before, but no mandatory ones. Mix them with OPTIONS_TYPED
# and continue parsing the options...
OPTIONS=("${OPTIONS[@]}" "${OPTIONS_TYPED[@]}")
OPTIONS_NEXT_GROUP=("${OPTIONS_TYPED[@]}")
_nmcli_compl_ARGS && return 0
if [[ "$COMMAND_ARGS_WAIT_OPTIONS" -ne 1 ]]; then
# means, we are at the end of options. Nothing more to parse, just show
# what are the options now.
if [[ "${#OPTIONS_MANDATORY[@]}" -gt 0 ]]; then
_nmcli_list "$(echo "${OPTIONS[@]}")"
else
_nmcli_list "$(echo "${OPTIONS[@]}") $(echo "${OPTIONS_IP[@]}") $(echo "${OPTIONS_SEP[@]}")"
fi
return 0
fi
if [[ "$OPTIONS_UNKNOWN_OPTION" != "" ]]; then
# there was an unknown option specified. Maybe we have to stop with the completion.
if [[ "${#OPTIONS_MANDATORY[@]}" -gt 0 ]]; then
# we have an unknown option, but still mandatory ones that must be fullfiled first.
return 0
fi
if ! (_nmcli_array_has_value OPTIONS_IP "${OPTIONS_UNKNOWN_OPTION:1}" ||
_nmcli_array_has_value OPTIONS_SEP "${OPTIONS_UNKNOWN_OPTION:1}"); then
# the unknown option is neither an IP option nor a separator.
return 0
fi
# The unknown option is an IP option or a separator, which is fine... continue...
fi
fi
OPTIONS=("${OPTIONS_TYPED[@]}")
OPTIONS_NEXT_GROUP=()
if [[ "${#OPTIONS_MANDATORY[@]}" -ge 1 ]]; then
# we have some mandatory options... don't check for IP options yet...
_nmcli_compl_ARGS && return 0
if _nmcli_array_has_value OPTIONS "${OPTIONS_MANDATORY[@]}"; then
_nmcli_list "$(echo "${OPTIONS[@]}")"
return 0
fi
if [[ "$OPTIONS_UNKNOWN_OPTION" != "" ]]; then
if ! (_nmcli_array_has_value OPTIONS_IP "${OPTIONS_UNKNOWN_OPTION:1}" ||
_nmcli_array_has_value OPTIONS_SEP "${OPTIONS_UNKNOWN_OPTION:1}"); then
# the unknown option is neither an IP option nor a separator.
return 0
fi
fi
fi
# no mandatory options... do final completion including IP options
OPTIONS=("${OPTIONS[@]}" "${OPTIONS_IP[@]}" "${OPTIONS_SEP[@]}")
OPTIONS_NEXT_GROUP=("${OPTIONS_IP[@]}" "${OPTIONS_SEP[@]}")
_nmcli_compl_ARGS && return 0
if [[ "$OPTIONS_UNKNOWN_OPTION" != "" ]]; then
return 0
fi
if [[ "$COMMAND_ARGS_WAIT_OPTIONS" -ne 1 ]]; then
# means, we are at the end of options. Nothing more to parse, just show
# what are the options now.
_nmcli_list "$(echo "${OPTIONS[@]}")"
return 0
fi
# process the last group of options, as the OPTIONS_TYPED are already handled...
OPTIONS=("${OPTIONS_IP[@]}" "${OPTIONS_SEP[@]}")
OPTIONS_NEXT_GROUP=("${OPTIONS_SEP[@]}")
COMMAND_ARGS_WAIT_OPTIONS=0
_nmcli_compl_ARGS && return 0
_nmcli_array_delete_at words 0
_nmcli_compl_PROPERTIES type "$OPTIONS_TYPE"
return 0
fi
_nmcli_array_delete_at words 0 1
_nmcli_list_nl "$(nmcli --complete-args connection add "${words[@]}" 2>/dev/null)"
;;
e|ed|edi|edit)
if [[ ${#words[@]} -eq 3 ]]; then