From c789efbaf0db016256d58c685c5586d7a684170d Mon Sep 17 00:00:00 2001 From: Maciek Makowski Date: Sun, 31 Dec 2017 21:44:21 +0000 Subject: github #21: update nmcli completions to be compatible with recent version 1.8.4 --- Completion/Linux/Command/_networkmanager | 373 +++++++++++++++++++++++++++++++ Completion/Linux/Command/_nmcli | 244 -------------------- 2 files changed, 373 insertions(+), 244 deletions(-) create mode 100644 Completion/Linux/Command/_networkmanager delete mode 100644 Completion/Linux/Command/_nmcli (limited to 'Completion/Linux') 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 -- cgit 1.4.1