summary refs log tree commit diff
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.tar.xz
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