summaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/completion/gobgp-completion.bash195
1 files changed, 195 insertions, 0 deletions
diff --git a/tools/completion/gobgp-completion.bash b/tools/completion/gobgp-completion.bash
new file mode 100644
index 00000000..b9e0c483
--- /dev/null
+++ b/tools/completion/gobgp-completion.bash
@@ -0,0 +1,195 @@
+#!bash
+
+__gobgp_q() {
+ gobgp 2>/dev/null "$@"
+}
+
+__search_target() {
+ local word target c=1
+
+ while [ $c -lt $cword ]; do
+ word="${words[c]}"
+ for target in $1; do
+ if [ "$target" = "$word" ]; then
+ echo "$target"
+ return
+ fi
+ done
+ ((c++))
+ done
+}
+
+__gobgp_table_list() {
+ local table_list=("local adj-in adj-out")
+ local table="$(__search_target "${table_list}")"
+ if [ -z "$table" ]; then
+ case "$cur" in
+ *)
+ COMPREPLY=( $( compgen -W "${table_list}" -- "$cur") )
+ ;;
+ esac
+ return
+ fi
+ COMPREPLY=( $( compgen -W "ipv4 ipv6 evpn" -- "$cur") )
+ return
+}
+
+__gobgp_neighbr_list() {
+ local neighbor_list=( $(__gobgp_q --quiet show neighbors) )
+ local target="$(__search_target "${neighbor_list[*]}")"
+ if [ -z "$target" ]; then
+ case "$cur" in
+ *)
+ COMPREPLY=( $( compgen -W "${neighbor_list[*]}" -- "$cur") )
+ ;;
+ esac
+ __ltrim_colon_completions "$cur"
+ return 0
+ fi
+ return 1
+}
+
+_gobgp_show_neighbor() {
+ __gobgp_neighbr_list
+ if [ $? -ne 0 ] ; then
+ __gobgp_table_list
+ fi
+}
+
+_gobgp_show_neighbors() {
+ case "$cur" in
+ *)
+ ;;
+ esac
+ return
+}
+
+_gobgp_show_global() {
+ local targets="ipv4 ipv6 evpn"
+ local target="$(__search_target "$targets")"
+ if [ -z "$target" ]; then
+ case "$cur" in
+ *)
+ COMPREPLY=( $( compgen -W "${targets[*]}" -- "$cur" ) )
+ ;;
+ esac
+ return
+ fi
+}
+
+_gobgp_show() {
+ local targets="neighbor neighbors global"
+ local target="$(__search_target "$targets")"
+ if [ -z "$target" ]; then
+ case "$cur" in
+ *)
+ COMPREPLY=( $( compgen -W "${targets[*]}" -- "$cur" ) )
+ ;;
+ esac
+ return
+ fi
+ _gobgp_show_${target}
+}
+
+__gobgp_generic_reset() {
+ local targets="neighbor"
+ local target="$(__search_target "$targets")"
+ if [ -z "$target" ]; then
+ case "$cur" in
+ *)
+ COMPREPLY=( $( compgen -W "${targets[*]}" -- "$cur" ) )
+ ;;
+ esac
+ return
+ fi
+ __gobgp_neighbr_list
+}
+
+_gobgp_reset() {
+ __gobgp_generic_reset
+}
+
+_gobgp_softreset() {
+ __gobgp_generic_reset
+}
+
+_gobgp_softresetin() {
+ __gobgp_generic_reset
+}
+
+_gobgp_softresetout() {
+ __gobgp_generic_reset
+}
+
+_gobgp_shutdown() {
+ __gobgp_generic_reset
+}
+
+_gobgp_enable() {
+ __gobgp_generic_reset
+}
+
+_gobgp_disable() {
+ __gobgp_generic_reset
+}
+
+_gobgp_gobgp() {
+ case "$prev" in
+ -h)
+ return
+ ;;
+ *)
+ ;;
+ esac
+
+ case "$cur" in
+ -*)
+ COMPREPLY=( $( compgen -W "-h" -- "$cur" ) )
+ ;;
+ *)
+ COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
+ ;;
+ esac
+}
+
+_gobgp() {
+ local commands=(
+ show
+ reset
+ softreset
+ softresetin
+ softresetout
+ shutdown
+ enable
+ disable
+ )
+
+ COMPREPLY=()
+ local cur prev words cword
+ _get_comp_words_by_ref -n : cur prev words cword
+
+ local command='gobgp'
+ local counter=1
+ while [ $counter -lt $cword ]; do
+ case "${words[$counter]}" in
+ -h)
+ (( counter++ ))
+ ;;
+ -*)
+ ;;
+ *)
+ command="${words[$counter]}"
+ cpos=$counter
+ (( cpos++ ))
+ break
+ ;;
+ esac
+ (( counter++ ))
+ done
+ local completions_func=_gobgp_${command}
+ declare -F $completions_func > /dev/null && $completions_func
+
+ return 0
+}
+
+complete -F _gobgp gobgp