summaryrefslogtreecommitdiffhomepage
path: root/tools/completion
diff options
context:
space:
mode:
Diffstat (limited to 'tools/completion')
-rw-r--r--tools/completion/gobgp-completion.bash163
1 files changed, 109 insertions, 54 deletions
diff --git a/tools/completion/gobgp-completion.bash b/tools/completion/gobgp-completion.bash
index face1a80..bf301171 100644
--- a/tools/completion/gobgp-completion.bash
+++ b/tools/completion/gobgp-completion.bash
@@ -4,6 +4,27 @@ __gobgp_q() {
gobgp 2>/dev/null "$@"
}
+__gobgp_address() {
+ url=""
+ port=""
+ if [ ! -z "$gobgp_ip" ]; then
+ url="-u $gobgp_ip"
+ fi
+ if [ ! -z "$gobgp_port" ]; then
+ port="-p $gobgp_port"
+ fi
+}
+
+__compreply() {
+ targets="$@"
+ case "$cur" in
+ *)
+ COMPREPLY=( $( compgen -W "${targets[*]}" -- "$cur" ) )
+ ;;
+ esac
+ return
+}
+
__search_target() {
local word target c=1
@@ -20,52 +41,60 @@ __search_target() {
}
__gobgp_table_list() {
- local targets=("local adj-in adj-out reset softreset softresetin softresetout shutdown enable disable policy")
+ local targets="local adj-in adj-out reset softreset softresetin softresetout shutdown enable disable policy"
local target="$(__search_target "$targets")"
if [ -z "$target" ]; then
- case "$cur" in
- *)
- COMPREPLY=( $( compgen -W "${targets[*]}" -- "$cur") )
- ;;
- esac
+ __compreply ${targets}
return
fi
+ if [ "$target" = "policy" ]; then
+ _gobgp_neighbor_policy
+ fi
return
}
__gobgp_neighbr_list() {
- local url=""
- local port=""
- if [ ! -z "$gobgp_ip" ]; then
- url="-u $gobgp_ip"
- fi
- if [ ! -z "$gobgp_port" ]; then
- port="-p $gobgp_port"
+ __gobgp_address
+ local targets=( $(__gobgp_q $url $port --quiet neighbor) )
+ local target="$(__search_target "${targets[*]}")"
+ if [ -z "$target" ]; then
+ __compreply ${targets}
+ __ltrim_colon_completions "$cur"
+ return 0
fi
- local neighbor_list=( $(__gobgp_q $url $port --quiet neighbor) )
- local target="$(__search_target "${neighbor_list[*]}")"
+ return 1
+}
+
+__gobgp_policy_list() {
+ __gobgp_address
+ local targets=( $(__gobgp_q $url $port --quiet policy "${policy_kind}") )
+ local target="$(__search_target "${targets[*]}")"
if [ -z "$target" ]; then
- case "$cur" in
- *)
- COMPREPLY=( $( compgen -W "${neighbor_list[*]}" -- "$cur") )
- ;;
- esac
+ __compreply ${targets}
__ltrim_colon_completions "$cur"
return 0
fi
+ latest_word="$target"
return 1
}
+__gobgp_policy_statement_list() {
+ __gobgp_address
+ local targets=( $(__gobgp_q $url $port --quiet policy routepolicy "${policy}") )
+ local target="$(__search_target "${targets[*]}")"
+ if [ -z "$target" ]; then
+ __compreply ${targets}
+ __ltrim_colon_completions "$cur"
+ return 0
+ fi
+ return 1
+}
_gobgp_global_rib(){
local targets="add del"
local target="$(__search_target "$targets")"
if [ -z "$target" ]; then
- case "$cur" in
- *)
- COMPREPLY=( $( compgen -W "${targets[*]}" -- "$cur" ) )
- ;;
- esac
+ __compreply ${targets}
return
fi
}
@@ -74,11 +103,7 @@ _gobgp_global() {
local targets="rib"
local target="$(__search_target "$targets")"
if [ -z "$target" ]; then
- case "$cur" in
- *)
- COMPREPLY=( $( compgen -W "${targets[*]}" -- "$cur" ) )
- ;;
- esac
+ __compreply ${targets}
return
fi
_gobgp_global_${target}
@@ -89,56 +114,86 @@ _gobgp_neighbor() {
if [ $? -ne 0 ] ; then
__gobgp_table_list
fi
+}
+_gobgp_neighbor_policy_op() {
+ local targets="import export"
+ local target="$(__search_target "$targets")"
+ if [ -z "$target" ]; then
+ __compreply ${targets}
+ return
+ fi
}
-_gobgp_policy_routepolicy(){
- return
+_gobgp_neighbor_policy() {
+ local targets="add del"
+ local target="$(__search_target "$targets")"
+ if [ -z "$target" ]; then
+ __compreply ${targets}
+ return
+ fi
+ _gobgp_neighbor_policy_op
}
-_gobgp_policy_neighbor(){
- return
+_gobgp_policy_routepolicy_op(){
+ policy="${latest_word}"
+ __gobgp_policy_statement_list
+ if [ $? -ne 0 ] ; then
+ targets="conditions actions"
+ local target="$(__search_target "$targets")"
+ if [ -z "$target" ]; then
+ __compreply ${targets}
+ return
+ fi
+ return
+ fi
}
-_gobgp_policy_prefix_add(){
- return
+_gobgp_policy_routepolicy(){
+ local targets="add del"
+ local target="$(__search_target "$targets")"
+ if [ -z "$target" ]; then
+ __compreply ${targets}
+ return
+ fi
+ policy_kind="routepolicy"
+ __gobgp_policy_list
+ if [ $? -ne 0 ] ; then
+ _gobgp_policy_routepolicy_op
+ fi
}
-_gobgp_policy_prefix_del(){
- local targets="all"
+
+_gobgp_policy_neighbor(){
+ local targets="add del"
local target="$(__search_target "$targets")"
if [ -z "$target" ]; then
- case "$cur" in
- *)
- COMPREPLY=( $( compgen -W "${targets[*]}" -- "$cur" ) )
- ;;
- esac
+ __compreply ${targets}
return
fi
+ if [ "$target" = "del" ]; then
+ policy_kind="neighbor"
+ __gobgp_policy_list
+ fi
}
_gobgp_policy_prefix(){
local targets="add del"
local target="$(__search_target "$targets")"
if [ -z "$target" ]; then
- case "$cur" in
- *)
- COMPREPLY=( $( compgen -W "${targets[*]}" -- "$cur" ) )
- ;;
- esac
+ __compreply ${targets}
return
fi
- _gobgp_policy_prefix_${target}
+ if [ "$target" = "del" ]; then
+ policy_kind="prefix"
+ __gobgp_policy_list
+ fi
}
_gobgp_policy() {
local targets="prefix neighbor routepolicy"
local target="$(__search_target "$targets")"
if [ -z "$target" ]; then
- case "$cur" in
- *)
- COMPREPLY=( $( compgen -W "${targets[*]}" -- "$cur" ) )
- ;;
- esac
+ __compreply ${targets}
return
fi
_gobgp_policy_${target}