diff --git a/CHANGES b/CHANGES index 496d62b4..49b22a06 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ [ Guillaume Rousse ] * gphoto2: new completion + * nmcli: new completion bash-completion (2.0) diff --git a/completions/Makefile.am b/completions/Makefile.am index 8d590576..a6cba386 100644 --- a/completions/Makefile.am +++ b/completions/Makefile.am @@ -107,6 +107,7 @@ bashcomp_DATA = a2x \ gpasswd \ gpg \ gpg2 \ + gphoto2 \ gprof \ groupadd \ groupdel \ @@ -219,6 +220,7 @@ bashcomp_DATA = a2x \ newlist \ newusers \ nmap \ + nmcli \ nslookup \ ntpdate \ openssl \ diff --git a/completions/nmcli b/completions/nmcli new file mode 100644 index 00000000..dc55ebb8 --- /dev/null +++ b/completions/nmcli @@ -0,0 +1,199 @@ +# nmcli completion -*- shell-script -*- + +_nmcli_list() +{ + COMPREPLY=( $( compgen -W '$1' -- $cur ) ) +} + +_nmcli_con_id() +{ + local IFS=$'\n' + COMPREPLY=( $( compgen -W "$(nmcli con list 2>/dev/null | \ + tail -n +2 | awk -F ' {2,}' '{print $1 }')" -- $cur ) ) +} + +_nmcli_con_uuid() +{ + COMPREPLY=( $( compgen -W "$(nmcli con list 2>/dev/null | \ + tail -n +2 | awk -F ' {2,}' '{print $2}')" -- $cur ) ) +} + +_nmcli_ap_ssid() +{ + local IFS=$'\n' + COMPREPLY=( $( compgen -W "$(nmcli dev wifi list 2>/dev/null | \ + tail -n +2 | awk -F ' {2,}' '{print $1}')" -- $cur ) ) +} + +_nmcli_ab_bssid() +{ + COMPREPLY=( $( compgen -W "$(nmcli dev wifi list 2>/dev/null | \ + tail -n +2 | awk -F ' {2,}' '{print $2}')" -- $cur ) ) +} + +_nmcli() +{ + local cur prev words cword + _init_completion || return + + case $prev in + -m|--mode) + COMPREPLY=( $( compgen -W 'tabular multiline' -- $cur ) ) + return 0 + ;; + -f|--fields) + COMPREPLY=( $( compgen -W 'all common' -- $cur ) ) + return 0 + ;; + -e|--escape) + _nmcli_list "yes no" + return 0 + ;; + id) + _nmcli_con_id + return 0 + ;; + uuid) + _nmcli_con_uuid + return 0 + ;; + iface) + _available_interfaces + return 0 + ;; + bssid) + _nmcli_ab_bssid + return 0 + ;; + wep-key-type) + _nmcli_list "key phrase" + return 0 + ;; + esac + + if [[ $cword -eq 1 ]] ; then + if [[ "$cur" == -* ]]; then + COMPREPLY=( $( compgen -W '--terse --pretty --mode --fields \ + --escape --version --help' -- $cur ) ) + else + COMPREPLY=( $( compgen -W "nm con dev" -- $cur ) ) + fi + else + local object=${words[1]} + local command=${words[2]} + + case $object in + nm) + case $command in + enable) + _nmcli_list "true false" + return 0 + ;; + sleep) + _nmcli_list "true false" + return 0 + ;; + wifi) + _nmcli_list "on off" + return 0 + ;; + wwan) + _nmcli_list "on off" + return 0 + ;; + wimax) + _nmcli_list "on off" + return 0 + ;; + esac + + COMPREPLY=( $( compgen -W 'status permissions enable sleep \ + wifi wwan wimax' -- $cur ) ) + ;; + con) + case $command in + list) + COMPREPLY=( $( compgen -W 'id uuid' -- $cur ) ) + return 0 + ;; + up) + if [[ "$cur" == -* ]]; then + COMPREPLY=( $( compgen -W '--nowait --timeout' \ + -- $cur ) ) + else + COMPREPLY=( $( compgen -W 'id uuid iface ap nsp' \ + -- $cur ) ) + fi + return 0 + ;; + down) + COMPREPLY=( $( compgen -W 'id uuid' -- $cur ) ) + return 0 + ;; + delete) + COMPREPLY=( $( compgen -W 'id uuid' -- $cur ) ) + return 0 + ;; + esac + + COMPREPLY=( $( compgen -W 'list status up down delete' \ + -- $cur ) ) + ;; + dev) + case $command in + list) + COMPREPLY=( $( compgen -W 'iface' -- $cur ) ) + return 0 + ;; + disconnect) + if [[ "$cur" == -* ]]; then + COMPREPLY=( $( compgen -W '--nowait --timeout' \ + -- $cur ) ) + else + COMPREPLY=( $( compgen -W 'iface' -- $cur ) ) + fi + return 0 + ;; + wifi) + local subcommand=${words[3]} + + case $subcommand in + list) + COMPREPLY=( $( compgen -W 'iface bssid' \ + -- $cur ) ) + return 0 + ;; + connect) + if [[ "$cur" == -* ]]; then + COMPREPLY=( $( compgen -W '--private \ + --nowait --timeout' -- $cur ) ) + else + if [[ "$prev" == "connect" ]]; then + _nmcli_ap_ssid + else + COMPREPLY=( $( compgen -W 'password \ + wep-key-type iface bssid name' \ + -- $cur ) ) + fi + fi + return 0 + ;; + esac + + COMPREPLY=( $( compgen -W 'list connect' -- $cur ) ) + return 0 + ;; + esac + + COMPREPLY=( $( compgen -W 'status list disconnect wifi' \ + -- $cur ) ) + ;; + esac + + fi + + return 0 +} && +complete -F _nmcli nmcli + +# ex: ts=4 sw=4 et filetype=sh diff --git a/test/completion/nmcli.exp b/test/completion/nmcli.exp new file mode 100644 index 00000000..816468f7 --- /dev/null +++ b/test/completion/nmcli.exp @@ -0,0 +1 @@ +assert_source_completions nmcli diff --git a/test/lib/completions/nmcli.exp b/test/lib/completions/nmcli.exp new file mode 100644 index 00000000..b891f45e --- /dev/null +++ b/test/lib/completions/nmcli.exp @@ -0,0 +1,18 @@ +proc setup {} { + save_env +} + + +proc teardown {} { + assert_env_unmodified +} + + +setup + + +assert_complete_any "nmcli " +sync_after_int + + +teardown