mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-04 07:10:33 +01:00
cli: use --complete-args for connection add completion
And make it incredibly slow at the same time.
This commit is contained in:
parent
c3422e917d
commit
8b39090597
1 changed files with 2 additions and 234 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue