diff --git a/completions/bind9 b/completions/bind9 new file mode 100644 index 00000000000..51791763035 --- /dev/null +++ b/completions/bind9 @@ -0,0 +1,214 @@ +# bash completion for nslookup -*- shell-script -*- +# bind9 utilities completion + +_comp_cmd_rndc__list_commands() +{ + rndc 2>&1 | awk '/^ / {print $1}' | sort -u +} + +_comp_cmd_named_checkconf__list_zones() +{ + named-checkconf -l | awk '{print $1}' +} + +_comp_cmd_rndc__list_parameters() +{ + local SUBCMD=$1 + rndc 2>&1 | awk "/^ ${SUBCMD} / { print \$2 }" +} + +_comp_cmd_rndc() +{ + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return + + case $prev in + -c|-k) + _comp_compgen_filedir + return + ;; + -s) + _comp_compgen_known_hosts -- "$cur" + return + ;; + esac + + local REPLY + _comp_count_args + if ((REPLY == 1)); then + _comp_compgen_split -- "$(_comp_cmd_rndc__list_commands)" + elif ((REPLY == 2)); then + local PARAMS="$(_comp_cmd_rndc__list_parameters $prev)" + if [[ "$PARAMS" == zone ]]; then + _comp_compgen_split -- "$(_comp_cmd_named_checkconf__list_zones)" + return + else + _comp_compgen_split -- "$PARAMS" + fi + fi + if [[ $cur == -* ]]; then + _comp_compgen_usage + return + fi +} && complete -F _comp_cmd_rndc rndc + +# Generate list of +example opts from dig help, including negative. +_comp_cmd_dig__list_plusopts() +{ + "${comp_args[0]}" -h 2>&1 | awk '/^\s+\+\[no\]/ { sub("+\\[no\\]", "", $1); sub("=##+$", "=", $1); sub("\\[=##+\\]", "", $1); print "+"$1, "+no"$1} /^\s+\+[^[]/ {sub("=##+", "=", $1); print $1}' +} + +# Implements common dig usage patterns +_comp_cmd_dig__common() +{ + if [[ $cur == -* ]]; then + _comp_compgen_help -- -h + return + elif [[ $cur == @* ]]; then + _comp_compgen_known_hosts -- "$cur" + return + elif [[ $cur == +* ]]; then + if [[ $cur == *= ]]; then + return + fi + _comp_compgen_split -- "$(_comp_cmd_dig__list_plusopts)" + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + _comp_compgen_known_hosts -- "$cur" + _comp_compgen -x nslookup queryclass + _comp_compgen -x nslookup querytype +} + +_comp_cmd_dig() +{ + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return + + case $prev in + -c) + _comp_compgen -x nslookup queryclass + return + ;; + -t) + _comp_compgen -x nslookup querytype + return + ;; + -q) + _comp_compgen_known_hosts -- "$cur" + return + ;; + -k|-f) + _comp_compgen_filedir + return + ;; + -x|-b) + _comp_compgen_ip_addresses -- "$cur" + return + ;; + esac + + _comp_cmd_dig__common "$@" +} && complete -F _comp_cmd_dig dig + +_comp_cmd_mdig() +{ + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return + + case $prev in + -c) + _comp_compgen -x nslookup queryclass + return + ;; + -t) + _comp_compgen -x nslookup querytype + return + ;; + -q) + _comp_compgen_known_hosts -- "$cur" + return + ;; + -f) + _comp_compgen_filedir + return + ;; + -x|-b) + _comp_compgen_ip_addresses -- "$cur" + return + ;; + esac + + _comp_cmd_dig__common "$@" +} && complete -F _comp_cmd_mdig mdig + +_comp_cmd_delv() +{ + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return + + case $prev in + -c) + _comp_compgen -x nslookup queryclass + return + ;; + -t) + _comp_compgen -x nslookup querytype + return + ;; + -q) + _comp_compgen_known_hosts -- "$cur" + return + ;; + -a) + _comp_compgen_filedir + return + ;; + -x|-b) + _comp_compgen_ip_addresses -- "$cur" + return + ;; + esac + + _comp_cmd_dig__common "$@" +} && complete -F _comp_cmd_delv delv + +# kdig is provided by knot-utils, but is more or less a drop-in replacement for dig +# Reuse common parts for it too. +_comp_cmd_kdig() +{ + local cur prev words cword comp_args + _comp_initialize -n = -- "$@" || return + + case $prev in + -c) + _comp_compgen -x nslookup queryclass + return + ;; + -t) + _comp_compgen -x nslookup querytype + return + ;; + -q) + _comp_compgen_known_hosts -- "$cur" + return + ;; + -k|-E|-G) + _comp_compgen_filedir + return + ;; + -x|-b) + _comp_compgen_ip_addresses -- "$cur" + return + ;; + esac + + if [[ $cur == -* ]]; then + _comp_compgen_usage + return + fi + _comp_cmd_dig__common "$@" +} && complete -F _comp_cmd_kdig kdig + +# ex: filetype=sh diff --git a/completions/nslookup b/completions/nslookup index b04b03a4904..d965a9390a4 100644 --- a/completions/nslookup +++ b/completions/nslookup @@ -1,11 +1,11 @@ # bash completion for nslookup -*- shell-script -*- -_comp_cmd_nslookup__queryclass() +_comp_xfunc_nslookup_compgen_queryclass() { _comp_compgen -a -- -W 'IN CH HS ANY' } -_comp_cmd_nslookup__querytype() +_comp_xfunc_nslookup_compgen_querytype() { # https://en.wikipedia.org/wiki/List_of_DNS_record_types # Resource records @@ -31,12 +31,12 @@ _comp_cmd_nslookup() case $cur in -class=* | -cl=*) cur=${cur#*=} - _comp_cmd_nslookup__queryclass + _comp_xfunc_nslookup_compgen_queryclass return ;; -querytype=* | -type=* | -q=* | -ty=*) cur=${cur#*=} - _comp_cmd_nslookup__querytype + _comp_xfunc_nslookup_compgen_querytype return ;; -?*=*) @@ -68,11 +68,11 @@ _comp_cmd_host() case $prev in -c) - _comp_cmd_nslookup__queryclass + _comp_xfunc_nslookup_compgen_queryclass return ;; -t) - _comp_cmd_nslookup__querytype + _comp_xfunc_nslookup_compgen_querytype return ;; -m)