about summary refs log tree commit diff
path: root/Completion/Linux/Command/_nmcli
blob: a6b97a36cd55fa6090c13c621c0ab8ff8f536a39 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#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