summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciek Makowski <maciek@mmakowski.com>2017-12-31 21:44:21 +0000
committerOliver Kiddle <opk@zsh.org>2018-01-04 11:40:03 +0100
commitc789efbaf0db016256d58c685c5586d7a684170d (patch)
tree27c80ffef58028c0d9f5d02cbf65ca77a54b49a8
parent1c4e7601c4b83322e8702954c2c3b8e4672026a3 (diff)
downloadzsh-c789efbaf0db016256d58c685c5586d7a684170d.tar.gz
zsh-c789efbaf0db016256d58c685c5586d7a684170d.zip
github #21: update nmcli completions to be compatible with recent version 1.8.4
-rw-r--r--ChangeLog6
-rw-r--r--Completion/Linux/Command/_networkmanager373
-rw-r--r--Completion/Linux/Command/_nmcli244
3 files changed, 379 insertions, 244 deletions
diff --git a/ChangeLog b/ChangeLog
index 911218299..3d51ad842 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-01-04 Oliver Kiddle <okiddle@yahoo.co.uk>
+
+ * github #21: Maciek Makowski:
+ Completion/Linux/Command/_networkmanager: update nmcli
+ completions to be compatible with recent version 1.8.4
+
2018-01-03 Oliver Kiddle <okiddle@yahoo.co.uk>
* dana: 42210: Completion/BSD/Command/_chflags,
diff --git a/Completion/Linux/Command/_networkmanager b/Completion/Linux/Command/_networkmanager
new file mode 100644
index 000000000..881445abb
--- /dev/null
+++ b/Completion/Linux/Command/_networkmanager
@@ -0,0 +1,373 @@
+#compdef nmcli
+
+# compatible with NetworkManager 1.8.4
+
+_networkmanager() {
+ local curcontext="$curcontext" state line
+
+ _arguments -C \
+ '(-p -pretty -t -terse)-t'{,erse}'[terse output]' \
+ '(-p -pretty -t -terse)-p'{,retty}'[pretty output]' \
+ '(-m -mode)-m'{,ode}'[output mode]:mode:(tabular multiline)' \
+ '(-c -colors)-c'{,olors}'[whether to use colors in output]:value:(auto yes no)' \
+ '(-f -fields)-f'{,ields}'[specify fields to output]:field:_nm_fields' \
+ '(-f -fields -g -get-values -m -mode -p -pretty -t -terse)-g'{,et-values}'[shortcut for -m tabular -t -f]:field:_nm_fields' \
+ '(-e -escape)-e'{,scape}'[escape column separators in values]:value:(yes no)' \
+ '(-a -ask)-a'{,sk}'[ask for missing parameters]' \
+ '(-s -show-secrets)-s'{,how-secrets}'[allow passwords to be displayed]' \
+ '(-w -wait)-w'{,ait}'[set time limit on wait for operations to finish]:timeout (seconds)' \
+ '(- *)-v'{,ersion}'[show program version]' \
+ '(- *)-h'{,elp}'[print help]' \
+ '1:command:(general networking radio connection device agent monitor help)' \
+ '*::arg:->args'
+
+ case $line[1] in
+ g*) _nm_general ;;
+ n*) _nm_networking ;;
+ r*) _nm_radio ;;
+ c*) _nm_connection ;;
+ d*) _nm_device ;;
+ a*) _nm_agent ;;
+ esac
+}
+
+_nm_fields() {
+ _values -s , 'field to output' \
+ all common \
+ RUNNING VERSION STATE STARTUP CONNECTIVITY NETWORKING WIFI-HW WIFI WWAN-HW WWAN \
+ NAME UUID TYPE TIMESTAMP TIMESTAMP-REAL AUTOCONNECT AUTOCONNECT-PRIORITY READONLY DBUS-PATH ACTIVE DEVICE STATE ACTIVE-PATH SLAVE \
+ DEVICE CONNECTION CON-UUID CON-PATH BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
+}
+
+_nm_general() {
+ _arguments "1:command:(status hostname permissions logging help)"
+ # TODO: provide completions for logging
+}
+
+_nm_networking() {
+ local curcontext="$curcontext" state line
+
+ _arguments -C \
+ "1:command:(on off connectivity help)" \
+ "*::arg:->args"
+
+ case $line[1] in
+ c*) _nm_networking_connectivity ;;
+ esac
+}
+
+_nm_networking_connectivity() {
+ _arguments "1:flag:(check)"
+}
+
+_nm_radio() {
+ _arguments \
+ "1:type:(all wifi wwan help)" \
+ "2:switch:(on off)"
+}
+
+_nm_connection() {
+ local curcontext="$curcontext" state line
+
+ _arguments -C \
+ "1:command:(show up down add modify clone edit delete monitor reload load import export help)" \
+ "*::arg:->args"
+
+ case $line[1] in
+ s*) _nm_connection_show ;;
+ u*) _nm_connection_up ;;
+ d*) _nm_connection_down ;;
+ # TODO: a*) _nm_connection_add ;;
+ m*) _nm_connection_modify ;;
+ c*) _nm_connection_clone ;;
+ e*) _nm_connection_edit ;;
+ de*) _nm_connection_delete ;;
+ mon*) _nm_connection_monitor ;;
+ l*) _nm_connection_load ;;
+ i*) _nm_connection_import ;;
+ ex*) _nm_connection_export ;;
+ esac
+}
+
+_nm_connection_show() {
+ # TODO: add support for --order
+ _arguments \
+ "--active" \
+ "1:connection:_nm_connection_specs"
+}
+
+_nm_connection_up() {
+ # TODO: add support for ifname, ap and passwd-file parameters
+ _arguments "1:connection:_nm_connection_specs"
+}
+
+_nm_connection_down() {
+ _arguments "1:connection:_nm_connection_specs"
+}
+
+_nm_connection_modify() {
+ # TODO: add support for options and properties
+ _arguments \
+ "--temporary" \
+ "1:connection:_nm_connection_specs"
+}
+
+_nm_connection_clone() {
+ _arguments \
+ "--temporary" \
+ "1:connection:_nm_connection_specs" \
+ "2:new name"
+}
+
+_nm_connection_edit() {
+ # TODO: add support for adding new connections (type and con-name parameters)
+ _arguments "1:connection:_nm_connection_specs"
+}
+
+_nm_connection_delete() {
+ _arguments "*:connection:_nm_connection_specs"
+}
+
+_nm_connection_monitor() {
+ _arguments "*:connection:_nm_connection_specs"
+}
+
+_nm_connection_load() {
+ _files
+}
+
+_nm_connection_import() {
+ _arguments \
+ "--temporary" \
+ "1: :(type)" \
+ "2:type:(vpnc openvpn pptp openconnect openswan libreswan ssh l2tp iodine)" \
+ "3: :(file)" \
+ "4:file:_files"
+}
+
+_nm_connection_export() {
+ _arguments \
+ "1:connection:_nm_connection_specs" \
+ "2:file:_files"
+}
+
+_nm_connection_specs() {
+ # TODO: add support for uuids and D-Bus paths
+ _nm_connection_ids
+}
+
+_nm_connection_ids() {
+ local -a con_ids
+ con_ids=(${(f)"$(_call_program nmcli nmcli -t -f name connection)"})
+ _describe 'select connection' con_ids
+}
+
+_nm_device() {
+ local curcontext="$curcontext" state line
+
+ _arguments -C \
+ "1:command:(status show set connect reapply modify disconnect delete monitor wifi lldp help)" \
+ "*::arg:->args"
+
+ case $line[1] in
+ sh*) _nm_device_show ;;
+ se*) _nm_device_set ;;
+ c*) _nm_device_connect ;;
+ r*) _nm_device_reapply ;;
+ mod*) _nm_device_modify ;;
+ d*) _nm_device_disconnect ;;
+ de*) _nm_device_delete ;;
+ m*) _nm_device_monitor ;;
+ w*) _nm_device_wifi ;;
+ l*) _nm_device_lldp ;;
+ esac
+}
+
+_nm_device_show() {
+ _arguments "1:interface:_nm_device_ifnames"
+}
+
+_nm_device_set() {
+ # TODO: allow specifying both options, and in any order
+ _arguments \
+ "1:interface:_nm_device_ifnames" \
+ "2:property:(autoconnect managed)" \
+ "3:switch:(yes no)"
+}
+
+_nm_device_connect() {
+ _arguments "1:interface:_nm_device_ifnames"
+}
+
+_nm_device_reapply() {
+ _arguments "1:interface:_nm_device_ifnames"
+}
+
+_nm_device_modify() {
+ # TODO: add support for settings
+ _arguments "1:interface:_nm_device_ifnames"
+}
+
+_nm_device_disconnect() {
+ _arguments "*:interface:_nm_device_ifnames"
+}
+
+_nm_device_delete() {
+ _arguments "*:interface:_nm_device_ifnames"
+}
+
+_nm_device_monitor() {
+ _arguments "*:interface:_nm_device_ifnames"
+}
+
+_nm_device_wifi() {
+ local curcontext="$curcontext" state line
+
+ _arguments -C \
+ "1:command:(list connect hotspot rescan)" \
+ "*::arg:->args"
+
+ case $line[1] in
+ l*) _nm_device_wifi_list ;;
+ c*) _nm_device_wifi_connect ;;
+ ho*) _nm_device_wifi_hotspot ;;
+ r*) _nm_device_wifi_rescan ;;
+ esac
+}
+
+_nm_device_wifi_list() {
+ # TODO: support bssid on its own
+ _arguments \
+ "1: :(ifname)" \
+ "2:interface:_nm_device_ifnames" \
+ "3: :(bssid)" \
+ "4:bssid:_nm_device_wifi_bssids"
+}
+
+_nm_device_wifi_connect() {
+ local curcontext="$curcontext" state line
+
+ _arguments -C \
+ "1:ssid:_nm_device_wifi_ssids" \
+ "*::arg:->args"
+
+ if [[ -n $line[1] ]]; then
+ _nm_device_wifi_connect_opts
+ fi
+}
+
+_nm_device_wifi_connect_opts() {
+ # TODO: there must be a cleaner way to implement this
+ local curcontext="$curcontext" state line
+
+ _arguments -C \
+ "1:property:(password wep-key-type ifname bssid name private hidden)" \
+ "*::arg:->args"
+
+ local min_line_len=2
+ case $line[-2] in
+ password)
+ _arguments -C "1:password" "*::arg:->args"
+ ;;
+ wep-key-type)
+ _arguments -C "1:wep key type:(key phrase)" "*::arg:->args"
+ ;;
+ ifname)
+ _arguments -C "1:device:_nm_device_ifnames" "*::arg:->args"
+ ;;
+ bssid)
+ _arguments -C "1:bssid:_nm_device_wifi_bssids" "*::arg:->args"
+ ;;
+ name)
+ _arguments -C "1:name" "*::arg:->args"
+ ;;
+ private)
+ _arguments -C "1:private:(yes no)" "*::arg:->args"
+ ;;
+ hidden)
+ _arguments -C "1:hidden:(yes no)" "*::arg:->args"
+ ;;
+ *)
+ min_line_len=1
+ ;;
+ esac
+ if [[ $#line > $min_line_len ]]; then
+ _nm_device_wifi_connect_opts
+ fi
+}
+
+_nm_device_wifi_hotspot() {
+ local curcontext="$curcontext" state line
+
+ _arguments -C \
+ "1:property:(ifname con-name ssid band channel password)" \
+ "*::arg:->args"
+
+ local min_line_len=2
+ case $line[-2] in
+ ifname)
+ _arguments -C "1:device:_nm_device_ifnames" "*::arg:->args"
+ ;;
+ con-name)
+ _arguments -C "1:connection name" "*::arg:->args"
+ ;;
+ ssid)
+ _arguments -C "1:ssid" "*::arg:->args"
+ ;;
+ band)
+ _arguments -C "1:band:(a bg)" "*::arg:->args"
+ ;;
+ channel)
+ _arguments -C "1:channel" "*::arg:->args"
+ ;;
+ password)
+ _arguments -C "1:password" "*::arg:->args"
+ ;;
+ *)
+ min_line_len=1
+ ;;
+ esac
+ if [[ $#line > $min_line_len ]]; then
+ _nm_device_wifi_hotspot
+ fi
+}
+
+_nm_device_wifi_rescan() {
+ # TODO: support ssid on its own and multiple ssids
+ _arguments \
+ "1: :(ifname)" \
+ "2:interface:_nm_device_ifnames" \
+ "3: :(ssid)" \
+ "4:ssid:_nm_device_wifi_ssids"
+}
+
+_nm_device_wifi_bssids() {
+ local -a bssids
+ bssids=(${(f)"$(_call_program nmcli nmcli -t -f bssid device wifi list)"})
+ _describe 'select network' bssids
+}
+
+_nm_device_wifi_ssids() {
+ local -a ssids
+ ssids=(${(f)"$(_call_program nmcli nmcli -t -f ssid device wifi list)"})
+ _describe 'select network' ssids
+}
+
+_nm_device_lldp() {
+ _arguments \
+ "1: :(list)" \
+ "2: :(ifname)" \
+ "3:interface:_nm_device_ifnames"
+}
+
+_nm_device_ifnames() {
+ local -a ifnames
+ ifnames=(${(f)"$(_call_program nmcli nmcli -t -f device device)"})
+ _describe 'select device' ifnames
+}
+
+_nm_agent() {
+ _arguments "1:type:(secret polkit all help)"
+}
+
+_networkmanager "$@"
diff --git a/Completion/Linux/Command/_nmcli b/Completion/Linux/Command/_nmcli
deleted file mode 100644
index a6b97a36c..000000000
--- a/Completion/Linux/Command/_nmcli
+++ /dev/null
@@ -1,244 +0,0 @@
-#compdef nmcli
-
-local context state line expl
-typeset -A opt_args
-
-if [[ -z $_nmcli_version ]]; then
- _nmcli_version="${"$(_call_program nmcli $words[1] --version)"##*version }"
-fi
-
-(( $+functions[_nmcli_is_running] )) || _nmcli_is_running() {
- [[ $(_call_program nmcli $words[1] -f running nm) != *'not running'* ]]
-}
-
-(( $+functions[_nmcli_con_ids] )) || _nmcli_con_ids() {
- _nmcli_is_running || return
- local -a con_ids
- con_ids=(${(f)"$(_call_program nmcli $words[1] -f name con)"})
- con_ids=(${con_ids[2,-2]})
- con_ids=(${con_ids[@]%%\ ##})
- _describe 'select connection' con_ids
-}
-
-(( $+functions[_nmcli_con_uuids] )) || _nmcli_con_uuids() {
- _nmcli_is_running || return
- local -a con_uuids
- con_uuids=(${(f)"$(_call_program nmcli $words[1] -f uuid con)"})
- con_uuids=(${con_uuids[2,-2]})
- con_uuids=(${con_uuids[@]%%\ ##})
- _describe 'select connection' con_uuids
-}
-
-(( $+functions[_nmcli_objects] )) || _nmcli_objects() {
- local -a objects_array
- objects_array=(
- 'nm:NetworkManager status'
- 'con:NetworkManager connections'
- 'dev:devices managed by NetworkManager'
- )
- _describe 'nmcli object' objects_array
-}
-
-(( $+functions[_nmcli_nm] )) || _nmcli_nm() {
- local -a nm_array
- nm_array=(
- 'status:show overall status of NetworkManager'
- 'enable:get status or enable/disable networking'
- 'sleep:get sleep status or put to sleep/awake NetworkManager'
- 'wifi:inquire or set status of WiFi in NetworkManager'
- 'wwan:inquire or set status of WWAN in NetworkManager'
- )
- _describe 'inquire and change state of NetworkManager' nm_array
-}
-
-(( $+functions[_nmcli_con] )) || _nmcli_con() {
- local -a con_array
- con_array=(
- 'list:list configured connections'
- 'status:print status of active connections'
- 'up:activate a connection'
- 'down:deactivate a connection'
- )
- if [[ $_nmcli_version == 0.9.[1-9]* ]]; then
- con_array[5]="delete:delete a connection"
- fi
- _describe "get information about NetworkManager's connections" con_array
-}
-
-(( $+functions[_nmcli_con_list] )) || _nmcli_con_list() {
- local -a con_list_array
- con_list_array=(
- 'id:get details on connection specified by id'
- 'uuid:get details on connection specified by uuid'
- )
- if [[ $_nmcli_version == 0.8* ]]; then
- con_list_array[3]='system:only list system connections'
- con_list_array[4]='user:only list user connections'
- fi
- _describe 'list configured connections' con_list_array
-}
-
-(( $+functions[_nmcli_con_up] )) || _nmcli_con_up() {
- local -a con_up_array
- con_up_array=(
- 'id:activate connection specified by id'
- 'uuid:activate connection specified by uuid'
- )
- _describe 'activate connection by id or uuid' con_up_array
-}
-
-(( $+functions[_nmcli_con_down] )) || _nmcli_con_down() {
- local -a con_down_array
- con_down_array=(
- 'id:deactivate connection specified by id'
- 'uuid:deactivate connection specified by uuid'
- )
- _describe 'deactivate connection by id or uuid' con_down_array
-}
-
-(( $+functions[_nmcli_con_delete] )) || _nmcli_con_delete() {
- local -a con_delete_array
- con_delete_array=(
- 'id:delete connection specified by id'
- 'uuid:delete connection specified by uuid'
- )
- _describe 'delete connection by id or uuid' con_delete_array
-}
-
-(( $+functions[_nmcli_con_up_extraargs] )) || _nmcli_con_up_extraargs() {
- local -a con_up_extraargs_array
- con_up_extraargs_array=(
- 'iface:require a particular interface'
- 'ap:require a specific access point'
- '--nowait:don''t wait for command completion'
- '--timeout:specify how long to wait for operation to complete'
- )
- _describe 'extra options for "con up"' con_up_extraargs_array
-}
-
-(( $+functions[_nmcli_dev_disconnect_extraargs] )) || _nmcli_dev_disconnect_extraargs() {
- local -a dev_disconnect_extraargs_array
- dev_disconnect_extraargs_array=(
- '--nowait:don''t wait for command completion'
- '--timeout:specify how long to wait for operation to complete'
- )
- _describe 'extra options for "dev disconnect"' dev_disconnect_extraargs_array
-}
-
-(( $+functions[_nmcli_dev_wifi_list] )) || _nmcli_dev_wifi_list() {
- local -a dev_wifi_list_array
- dev_wifi_list_array=(
- 'iface:list APs for a particular interface'
- )
- if [[ $_nmcli_version == 0.8* || $_nmcli_version == 0.9.0* ]]; then
- dev_wifi_list_array[2] = 'hwaddr:list a specific AP by MAC address'
- elif [[ $_nmcli_version == 0.9.[1-9]* ]]; then
- dev_wifi_list_array[2] = 'bssid:list a specific AP by BSSID'
- fi
- _describe 'options for specifying the AP to list' dev_wifi_list_array
-}
-
-(( $+functions[_nmcli_dev] )) || _nmcli_dev() {
- local -a dev_array
- dev_array=(
- 'status:print status of devices'
- 'list:get detailed information about devices'
- 'disconnect:disconnect device and prevent it from automatically activating'
- 'wifi:list available WiFi access points'
- )
- _describe "get information about devices" dev_array
-}
-
-(( $+functions[_nmcli_truefalse] )) || _nmcli_truefalse() {
- _wanted boolean expl 'use true/false to modify (nothing = query status)' compadd true false
-}
-
-(( $+functions[_nmcli_onoff] )) || _nmcli_onoff() {
- _wanted onoff expl 'use on/off to modify (nothing = query status)' compadd on off
-}
-
-local w1="${words[$#words - 1]}"
-local w2="${words[$#words - 2]}"
-local w3="${words[$#words - 3]}"
-local w4="${words[$#words - 4]}"
-
-if [[ $w2 == nm && $w1 == (sleep|enable) ]]; then
- _nmcli_truefalse && return
-elif [[ $w2 == nm && $w1 == (wifi|wwan) ]]; then
- _nmcli_onoff && return
-elif [[ $w1 == nm ]]; then
- _nmcli_nm && return
-elif [[ $w3 == con && $w2 == list && $w1 == id ]]; then
- _nmcli_con_ids && return
-elif [[ $w3 == con && $w2 == list && $w1 == uuid ]]; then
- _nmcli_con_uuids && return
-elif [[ $w2 == con && $w1 == list ]]; then
- _nmcli_con_list && return
-elif [[ $w3 == con && $w2 == (up|down) && $w1 == id ]]; then
- _nmcli_con_ids && return
-elif [[ $_nmcli_version == 0.9.[1-9]* && $w3 == con && $w2 == delete && $w1 == id ]]; then
- _nmcli_con_ids && return
-elif [[ $w3 == con && $w2 == (up|down) && $w1 == uuid ]]; then
- _nmcli_con_uuids && return
-elif [[ $_nmcli_version == 0.9.[1-9]* && $w3 == con && $w2 == delete && $w1 == uuid ]]; then
- _nmcli_con_uuids && return
-elif [[ ${(pj:\0:)words} == *$'\0con\0up\0'(id|uuid)$'\0'* ]]; then
- if [[ $w1 == iface ]]; then
- _net_interfaces && return
- elif [[ $w1 == ap ]]; then
- _message -e descriptions 'enter MAC address' && return
- elif [[ $w1 == --timeout ]]; then
- _message -e descriptions 'enter timeout' && return
- else
- _nmcli_con_up_extraargs && return
- fi
-elif [[ $w2 == con && $w1 == up ]]; then
- _nmcli_con_up && return
-elif [[ $w2 == con && $w1 == down ]]; then
- _nmcli_con_down && return
-elif [[ $_nmcli_version == 0.9.[1-9]* && $w2 == con && $w1 == delete ]]; then
- _nmcli_con_delete && return
-elif [[ $w1 == con ]]; then
- _nmcli_con && return
-elif [[ $w3 == dev && $w2 == (list|disconnect) && $w1 == iface ]]; then
- _net_interfaces && return
-elif [[ ${(pj:\0:)words} == *$'\0dev\0disconnect\0iface\0'* ]]; then
- if [[ $w1 == --timeout ]]; then
- _message -e descriptions 'enter timeout' && return
- else
- _nmcli_dev_disconnect_extraargs && return
- fi
-elif [[ $w2 == dev && $w1 == list ]]; then
- compadd iface && return
-elif [[ $w2 == dev && $w1 == disconnect ]]; then
- compadd iface && return
-elif [[ $w4 == dev && $w3 == wifi && $w2 == list && $w1 == iface ]]; then
- _net_interfaces && return
-elif [[ $w4 == dev && $w3 == wifi && $w2 == list && $w1 == hwaddr ]]; then
- _message -e descriptions 'enter MAC address' && return
-elif [[ $w3 == dev && $w2 == wifi && $w1 == list ]]; then
- _nmcli_dev_wifi_list && return
-elif [[ $w2 == dev && $w1 == wifi ]]; then
- compadd list && return
-elif [[ $w1 == dev ]]; then
- _nmcli_dev && return
-else
- _arguments \
- {'(--terse)-t','(-t)--terse'}'[terse output]' \
- {'(--pretty)-p','(-p)--pretty'}'[pretty output]' \
- {'(--mode)-m','(-m)--mode'}'[output mode]:output mode:(tabular multiline)' \
- {'(--fields)-f','(-f)--fields'}'[specify fields to output]: :->fields' \
- {'(--escape)-e','(-e)--escape'}'[escape columns separators in values]:escape columns separators in values:(yes no)' \
- {'(--version)-v','(-v)--version'}'[show program version]' \
- {'(--help)-h','(-h)--help'}'[print this help]' \
- '*::nmcli object:_nmcli_objects' \
- && return
-fi
-
-[[ "$state" == "fields" ]] &&
- _values -s , 'fields to be printed' \
- all common \
- autoconnect dbus-path device name net-enabled readonly running \
- scope state timestamp timestamp-real type uuid wifi wifi-hardware \
- wwan wwan-hardware \
- && return