chiark / gitweb /
bash-completion: add completion for resolvectl
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 18 Apr 2018 18:26:54 +0000 (03:26 +0900)
committerSven Eden <yamakuzure@gmx.net>
Fri, 24 Aug 2018 14:47:08 +0000 (16:47 +0200)
shell-completion/bash/meson.build
shell-completion/bash/resolvectl [new file with mode: 0644]

index a6831f5fe01a44eaf39c1566c5d8e334300de475..48e671579354fd5c7ab988abfef922bdddfc5c05 100644 (file)
@@ -43,6 +43,7 @@ if bashcompletiondir != 'no'
 #                  ['machinectl',          'ENABLE_MACHINED'],
 #                  ['networkctl',          'ENABLE_NETWORKD'],
 #                  ['systemd-resolve',     'ENABLE_RESOLVE'],
+#                  ['resolvectl',          'ENABLE_RESOLVE'],
 #                  ['timedatectl',         'ENABLE_TIMEDATED'],
 #else
         items = [['loginctl',            ''],
diff --git a/shell-completion/bash/resolvectl b/shell-completion/bash/resolvectl
new file mode 100644 (file)
index 0000000..cb897fd
--- /dev/null
@@ -0,0 +1,165 @@
+# resolvectl(1) completion                                  -*- shell-script -*-
+# SPDX-License-Identifier: LGPL-2.1+
+#
+# This file is part of elogind.
+#
+# Copyright 2018 Yu Watanabe
+#
+# elogind is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+#
+# elogind is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with elogind; If not, see <http://www.gnu.org/licenses/>.
+
+__contains_word () {
+        local w word=$1; shift
+        for w in "$@"; do
+                [[ $w = "$word" ]] && return
+        done
+}
+
+__get_interfaces(){
+        { cd /sys/class/net && echo *; } | \
+        while read -d' ' -r name; do
+                [[ "$name" != "lo" ]] && echo "$name"
+        done
+}
+
+_resolvectl() {
+        local i comps verb name
+        local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
+        local -A OPTS=(
+               [STANDALONE]='-h --help --version --no-pager -4 -6
+                             --service-address=no --service-txt=no
+                             --cname=no --search=no --legend=no'
+                      [ARG]='-i --interface -p --protocol -t --type -c --class --raw'
+        )
+        local -A VERBS=(
+                   [DOMAIN]='query service openpgp'
+                   [FAMILY]='tlsa'
+                   [STATUS]='status'
+                     [LINK]='revert dns domain nta'
+                  [RESOLVE]='llmnr mdns'
+                   [DNSSEC]='dnssec'
+               [STANDALONE]='statistics reset-statistics flush-caches reset-server-features'
+        )
+        local -A ARGS=(
+                   [FAMILY]='tcp udp sctp'
+                  [RESOLVE]='yes no resolve'
+                   [DNSSEC]='yes no allow-downgrade'
+        )
+        local interfaces=$( __get_interfaces )
+
+        if __contains_word "$prev" ${OPTS[ARG]}; then
+                case $prev in
+                        --interface|-i)
+                                comps="$interfaces"
+                                ;;
+                        --protocol|-p|--type|-t|--class|-c)
+                                comps=$( resolvectl --legend=no "$prev" help; echo help )
+                                ;;
+                        --raw)
+                                comps="payload packet"
+                                ;;
+                esac
+                COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
+                return 0
+        fi
+
+        if [[ "$cur" = -* ]]; then
+                COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
+                return 0
+        fi
+
+        for ((i=0; i < COMP_CWORD; i++)); do
+                if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
+                 ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
+                        verb=${COMP_WORDS[i]}
+                        break
+                fi
+        done
+
+        if [[ -z $verb ]]; then
+                comps="${VERBS[*]}"
+
+        elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[DOMAIN]}; then
+                comps=''
+
+        elif __contains_word "$verb" ${VERBS[STATUS]}; then
+                comps="$interfaces"
+
+        elif __contains_word "$verb" ${VERBS[FAMILY]}; then
+                for ((i++; i < COMP_CWORD; i++)); do
+                        if __contains_word "${COMP_WORDS[i]}" ${ARGS[FAMILY]} &&
+                         ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
+                                name=${COMP_WORDS[i]}
+                                break;
+                        fi
+                done
+                if [[ -z $name ]]; then
+                        comps=${ARGS[FAMILY]}
+                else
+                        comps=""
+                fi
+
+        elif __contains_word "$verb" ${VERBS[LINK]} ${VERBS[RESOLVE]} ${VERBS[DNSSEC]}; then
+                for ((i++; i < COMP_CWORD; i++)); do
+                        if __contains_word "${COMP_WORDS[i]}" $interfaces &&
+                         ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
+                                name=${COMP_WORDS[i]}
+                                break;
+                        fi
+                done
+
+                if [[ -z $name ]]; then
+                        comps="$interfaces"
+
+                elif __contains_word "$verb" ${VERBS[RESOLVE]}; then
+                        name=
+                        for ((i++; i < COMP_CWORD; i++)); do
+                                if __contains_word "${COMP_WORDS[i]}" ${ARGS[RESOLVE]} &&
+                                 ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
+                                        name=${COMP_WORDS[i]}
+                                        break;
+                                fi
+                        done
+
+                        if [[ -z $name ]]; then
+                                comps=${ARGS[RESOLVE]}
+                        else
+                                comps=''
+                        fi
+
+                elif __contains_word "$verb" ${VERBS[DNSSEC]}; then
+                        name=
+                        for ((i++; i < COMP_CWORD; i++)); do
+                                if __contains_word "${COMP_WORDS[i]}" ${ARGS[DNSSEC]} &&
+                                 ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
+                                        name=${COMP_WORDS[i]}
+                                        break;
+                                fi
+                        done
+
+                        if [[ -z $name ]]; then
+                                comps=${ARGS[DNSSEC]}
+                        else
+                                comps=''
+                        fi
+
+                else
+                        comps=''
+                fi
+        fi
+
+        COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
+        return 0
+}
+
+complete -F _resolvectl resolvectl