summaryrefslogtreecommitdiff
path: root/etc/bash_completion.d/vyatta-cfg
diff options
context:
space:
mode:
Diffstat (limited to 'etc/bash_completion.d/vyatta-cfg')
-rwxr-xr-xetc/bash_completion.d/vyatta-cfg906
1 files changed, 906 insertions, 0 deletions
diff --git a/etc/bash_completion.d/vyatta-cfg b/etc/bash_completion.d/vyatta-cfg
new file mode 100755
index 0000000..110b563
--- /dev/null
+++ b/etc/bash_completion.d/vyatta-cfg
@@ -0,0 +1,906 @@
+#!/bin/bash
+
+# **** License ****
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program 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.
+#
+# A copy of the GNU General Public License is available as
+# `/usr/share/common-licenses/GPL' in the Debian GNU/Linux distribution
+# or on the World Wide Web at `http://www.gnu.org/copyleft/gpl.html'.
+# You can also obtain it by writing to the Free Software Foundation,
+# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+# Author: Vyatta
+# Description: bash completion for Vyatta configuration commands
+#
+# **** End License ****
+
+# Turn on history logging
+export HISTCONTROL=
+export HISTFILESIZE=10000
+export HISTSIZE=10000
+export HISTTIMEFORMAT='%FT%T%z '
+export PROMPT_COMMAND='history -a'
+builtin set histappend=1
+
+# only do this if we are going into configure mode
+if [ "$_OFR_CONFIGURE" != "ok" ]; then
+ return 0
+fi
+
+if [ -r /etc/default/vyatta ]; then
+ source /etc/default/vyatta
+fi
+
+# function for shell api
+vyatta_cli_shell_api ()
+{
+ local noeval=''
+ if [ "$1" == NOEVAL ]; then
+ noeval=true
+ shift
+ fi
+ local outstr
+ if ! outstr=$(${vyatta_sbindir}/my_cli_shell_api "$@"); then
+ # display the error output (if any) and then fail
+ if [ -n "$outstr" ]; then
+ echo "$outstr"
+ fi
+ return 1
+ fi
+ # eval the output (if any)
+ if [ -n "$outstr" ]; then
+ if [ -n "$noeval" ]; then
+ echo "$outstr"
+ else
+ eval "$outstr"
+ fi
+ fi
+ return 0
+}
+
+# set up the session environment
+## note: this can not use vyatta_cli_shell_api() above since it "declares"
+## env vars.
+eval "$(${vyatta_sbindir}/my_cli_shell_api getSessionEnv $$)"
+
+declare is_set=0
+declare last_idx=0
+declare -a comp_words=()
+
+# commands to unalias
+declare -a unalias_cmds=( clear configure date debug edit exit load merge \
+ no run set show save terminal undebug up top )
+for cmd in "${unalias_cmds[@]}"; do
+ unalias $cmd >& /dev/null
+done
+
+show ()
+{
+ local -a args=()
+ for arg in "$@"; do
+ if [ "$arg" == "-all" ]; then
+ args+=('--show-show-defaults')
+ else
+ args+=("$arg")
+ fi
+ done
+ cli-shell-api showCfg "${args[@]}" | eval "${VYATTA_PAGER:-cat}"
+}
+
+commit ()
+{
+ local comment="commit"
+ local next=0
+ local -a args=()
+ for arg in "$@"; do
+ if [ "$next" == "1" ]; then
+ comment=$arg
+ next=0;
+ elif [ "$arg" == "comment" ]; then
+ next=1
+ elif [ "$arg" == "confirm" ]; then
+ echo Use commit-confirm command
+ return 1;
+ else
+ args[${#args[@]}]="$arg"
+ fi
+ done
+ args+=("-C '$comment'")
+
+ export COMMIT_VIA=cli
+ if /opt/vyatta/sbin/my_commit "${args[@]}"; then
+ vyatta_cli_shell_api markSessionUnsaved
+ fi
+ unset COMMIT_VIA
+}
+
+commit-confirm ()
+{
+ local -a args=()
+ local first=1
+ local minutes=10
+ for arg in "$@"; do
+ if [ "$first" = "1" ]; then
+ if [[ $arg = *[[:digit:]]* ]]; then
+ minutes=$arg
+ else
+ args[${#args[@]}]="$arg"
+ fi
+ first=0
+ else
+ args[${#args[@]}]="$arg"
+ fi
+ done
+ cmd="${vyatta_sbindir}/vyatta-config-mgmt.pl --action=commit-confirm \
+ --minutes=$minutes"
+ eval "sudo sg vyattacfg \"$cmd\" "
+ if [ $? = 0 ]; then
+ commit "$@"
+ fi
+}
+
+confirm ()
+{
+ ${vyatta_sbindir}/vyatta-config-mgmt.pl --action=confirm
+}
+
+compare ()
+{
+ ${vyatta_sbindir}/vyatta-config-mgmt.pl --action=diff "$@"
+}
+
+save ()
+{
+ if vyatta_cli_shell_api sessionChanged; then
+ echo -e "Warning: you have uncommitted changes that will not be saved.\n"
+ fi
+ # transform individual args into quoted strings
+ local arg=''
+ local save_cmd="${vyatta_sbindir}/vyatta-save-config.pl"
+ for arg in "$@"; do
+ save_cmd+=" '$arg'"
+ done
+ eval "sudo sg vyattacfg \"umask 0002 ; $save_cmd\""
+ vyatta_cli_shell_api unmarkSessionUnsaved
+}
+
+reboot ()
+{
+ echo "Exit from configure mode before rebooting."
+}
+
+rollback ()
+{
+ ${vyatta_sbindir}/vyatta-config-mgmt.pl --action=rollback --revnum "$@"
+}
+
+shutdown ()
+{
+ echo "Exit from configure mode before shutting down system."
+}
+
+reset_edit_level ()
+{
+ vyatta_cli_shell_api getEditResetEnv
+ return $?
+}
+
+load ()
+{
+ # don't load if there are uncommitted changes.
+ if vyatta_cli_shell_api sessionChanged; then
+ echo "Cannot load: configuration modified."
+ echo "Commit or discard the changes before loading a config file."
+ return 1
+ fi
+ # return to top level.
+ reset_edit_level
+ ${vyatta_sbindir}/vyatta-load-config.pl "$@"
+}
+
+merge ()
+{
+ # don't load if there are uncommitted changes.
+ if vyatta_cli_shell_api sessionChanged; then
+ echo "Cannot load: configuration modified."
+ echo "Commit or discard the changes before loading a config file."
+ return 1
+ fi
+ # return to top level.
+ reset_edit_level
+ ${vyatta_sbindir}/vyatta-load-config.pl "$@" --merge
+}
+
+top ()
+{
+ if vyatta_cli_shell_api editLevelAtRoot; then
+ echo "Already at the top level"
+ return 0
+ fi
+
+ # go to the top level.
+ reset_edit_level
+}
+
+edit ()
+{
+ vyatta_cli_shell_api getEditEnv "$@"
+ return $?
+}
+
+up ()
+{
+ vyatta_cli_shell_api getEditUpEnv "$@"
+ return $?
+}
+
+really_exit()
+{
+
+ if vyatta_cli_shell_api sessionUnsaved; then
+ echo "Warning: configuration changes have not been saved."
+ fi
+ vyatta_cli_shell_api teardownSession
+ unset _OFR_CONFIGURE
+ builtin exit 0
+}
+
+exit ()
+{
+ local discard
+ if [ $# == 0 ]; then
+ discard=0
+ elif [ $# == 1 ] && [ "$1" == "discard" ]; then
+ discard=1
+ else
+ echo "Invalid argument \"$*\" for 'exit'"
+ return 1
+ fi
+
+ if vyatta_cli_shell_api editLevelAtRoot; then
+ # we are at the root level. check if we can really exit.
+ if vyatta_cli_shell_api sessionChanged; then
+ if (( ! discard )); then
+ echo "Cannot exit: configuration modified."
+ echo "Use 'exit discard' to discard the changes and exit."
+ return 1
+ fi
+ fi
+ really_exit
+ fi
+
+ # "exit" to the root level.
+ reset_edit_level
+}
+
+# run op mode commands
+run ()
+{
+ if [ $# == 0 ]; then
+ echo Incomplete command
+ return 1
+ fi
+ _vyatta_op_run $@
+}
+
+# do op mode completion
+vyatta_run_complete ()
+{
+ local restore_shopts=$( shopt -p extglob nullglob | tr \\n \; )
+ shopt -s extglob nullglob
+
+ COMP_WORDS=( "${COMP_WORDS[@]:1}" )
+ (( COMP_CWORD -= 1 ))
+ _vyatta_op_expand
+
+ eval $restore_shopts
+}
+
+vyatta_loadsave_complete()
+{
+ # Generate completion help for the "load" and "save" commands
+
+ local restore_shopts=$( shopt -p extglob nullglob | tr \\n \; )
+ shopt -s extglob nullglob
+
+ # Only provide completions after command name has been typed, but
+ # before any characters of the command argument have been entered.
+ # File name completion, and completion of the various URL formats
+ # is not supported yet.
+ #
+ if [ $COMP_CWORD -eq 1 -a -z "${COMP_WORDS[1]}" ]; then
+ echo
+ echo "Possible completions:"
+ if [ "${COMP_WORDS[0]}" = "load" ]; then
+ echo -e " <Enter>\t\t\t\tLoad from system config file"
+ echo -e " <file>\t\t\t\tLoad from file on local machine"
+ echo -e " scp://<user>:<passwd>@<host>/<file>\tLoad from file on remote machine"
+ echo -e " ftp://<user>:<passwd>@<host>/<file>\tLoad from file on remote machine"
+ echo -e " http://<host>/<file>\t\t\tLoad from file on remote machine"
+ echo -e " tftp://<host>/<file>\t\t\tLoad from file on remote machine"
+ elif [ "${COMP_WORDS[0]}" = "merge" ]; then
+ echo -e " <Enter>\t\t\t\tMerge from system config file"
+ echo -e " <file>\t\t\t\tMerge from file on local machine"
+ echo -e " scp://<user>:<passwd>@<host>/<file>\tMerge from file on remote machine"
+ echo -e " ftp://<user>:<passwd>@<host>/<file>\tMerge from file on remote machine"
+ echo -e " http://<host>/<file>\t\t\tMerge from file on remote machine"
+ echo -e " tftp://<host>/<file>\t\t\tMerge from file on remote machine"
+ elif [ "${COMP_WORDS[0]}" = "save" ]; then
+ echo -e " <Enter>\t\t\t\tSave to system config file"
+ echo -e " <file>\t\t\t\tSave to file on local machine"
+ echo -e " scp://<user>:<passwd>@<host>/<file>\tSave to file on remote machine"
+ echo -e " ftp://<user>:<passwd>@<host>/<file>\tSave to file on remote machine"
+ echo -e " tftp://<host>/<file>\t\t\tSave to file on remote machine"
+ fi
+ COMPREPLY=( "" " " )
+ else
+ COMPREPLY=()
+ fi
+
+ eval $restore_shopts
+}
+
+loadkey()
+{
+ # don't load if there are uncommitted changes.
+ if vyatta_cli_shell_api sessionChanged; then
+ echo "Cannot load: configuration modified."
+ echo "Commit or discard the changes before loading a config file."
+ return 1
+ fi
+ # return to top level.
+ reset_edit_level
+ ${vyatta_sbindir}/vyatta-load-user-key.pl "$@"
+}
+
+vyatta_loadkey_complete()
+{
+ case "$COMP_CWORD" in
+ 1) if [ -z "${COMP_WORDS[1]}" ]; then
+ COMPREPLY=( $(getent passwd | awk -F: '$7 == "/bin/vbash" { print $1}') )
+ else
+ COMPREPLY=( $(compgen -u -- ${COMP_WORDS[1]} ) )
+ fi ;;
+ 2) if [ -z "${COMP_WORDS[2]}" ]; then
+ echo
+ echo "Possible completions:"
+ echo -e " <file>\t\t\t\tLoad from file on local machine"
+ echo -e " scp://<user>@<host>/<file>\tLoad from file on remote machine"
+ echo -e " ftp://<user>@<host>/<file>\tLoad from file on remote machine"
+ echo -e " http://<host>/<file>\t\t\tLoad from file on remote machine"
+ echo -e " tftp://<host>/<file>\t\t\tLoad from file on remote machine"
+ COMPREPLY=()
+ else
+ COMPREPLY=( $(compgen -f -- ${COMP_WORDS[2]} ) )
+ fi ;;
+ esac
+}
+
+print_commit_log ()
+{
+ local -a array
+ eval "array=($(${vyatta_sbindir}/vyatta-config-mgmt.pl --action=show-commit-log-brief))"
+ local count=0
+ for i in "${array[@]}"; do
+ i=${i//_/ }
+ echo -e "$count\t$i"
+ (( count++ ))
+ done
+}
+
+vyatta_rollback_complete ()
+{
+ # Generate completion help for the "rollback" command
+
+ local restore_shopts=$( shopt -p extglob nullglob | tr \\n \; )
+ shopt -s extglob nullglob
+
+ # Only provide completions after command name has been typed, but
+ # before any characters of the command argument have been entered.
+ if [ $COMP_CWORD -eq 1 -a -z "${COMP_WORDS[1]}" ]; then
+ echo
+ echo "Possible completions:"
+ echo -e "<N>\tRollback to revision N (currently requires reboot)"
+ print_commit_log
+ COMPREPLY=( "" " " )
+ else
+ COMPREPLY=()
+ fi
+
+ eval $restore_shopts
+}
+
+vyatta_compare_complete ()
+{
+ # Generate completion help for the "compare" command
+
+ local restore_shopts=$( shopt -p extglob nullglob | tr \\n \; )
+ shopt -s extglob nullglob
+
+ # Only provide completions after command name has been typed, but
+ # before any characters of the command argument have been entered.
+ if [ $COMP_CWORD -eq 1 -a -z "${COMP_WORDS[1]}" ]; then
+ echo
+ echo "Possible completions:"
+ echo -e "<enter>\tCompare working & active configurations"
+ echo -e "<N>\tCompare working with revion N"
+ echo -e "<N> <M>\tCompare revion N with M"
+ print_commit_log
+ COMPREPLY=( "" " " )
+ elif [ $COMP_CWORD -eq 2 -a -z "${COMP_WORDS[2]}" ]; then
+ echo
+ echo "Possible completions:"
+ echo -e "<enter>\tCompare working & active configurations"
+ echo -e "<N>\tCompare working with revion N"
+ echo -e "<N> <M>\tCompare revion N with M"
+ print_commit_log
+ COMPREPLY=( "" " " )
+ else
+ COMPREPLY=()
+ fi
+
+ eval $restore_shopts
+}
+
+vyatta_commit_complete ()
+{
+ # Generate completion help for the "commit-confirm" command
+
+ local restore_shopts=$( shopt -p extglob nullglob | tr \\n \; )
+ shopt -s extglob nullglob
+
+ # Only provide completions after command name has been typed, but
+ # before any characters of the command argument have been entered.
+ if [ $COMP_CWORD -eq 1 -a -z "${COMP_WORDS[1]}" ]; then
+ echo
+ echo "Possible completions:"
+ if [ "${COMP_WORDS[0]}" = "commit" ]; then
+ echo -e "<enter>\tCommit working configuration"
+ elif [ "${COMP_WORDS[0]}" = "commit-confirm" ]; then
+ echo -e "<enter>\tCommit, rollback/reboot in 10 minutes if no confirm"
+ echo -e "<N>\tCommit, rollback/reboot in N minutes if no confirm"
+ fi
+ echo -e "comment\tComment for commit log"
+ COMPREPLY=( "" " " )
+ elif [ "${COMP_WORDS[1]}" = "comment" ]; then
+ echo
+ echo "Possible completions:"
+ echo -e "<txt>\tText comment for commit log (e.g. \"add user bob\")"
+ COMPREPLY=( "" " " )
+ else
+ COMPREPLY=()
+ fi
+
+ eval $restore_shopts
+}
+
+get_prefix_filtered_list ()
+{
+ # $1: prefix
+ # $2: \@list
+ # $3: \@filtered
+ declare -a olist
+ local pfx=$1
+ pfx=${pfx#\"}
+ eval "olist=( \"\${$2[@]}\" )"
+ local idx=0
+ for elem in "${olist[@]}"; do
+ local sub=${elem#$pfx}
+ if [ "$elem" == "$sub" ] && [ -n "$pfx" ]; then
+ continue
+ fi
+ eval "$3[$idx]=\"$elem\""
+ (( idx++ ))
+ done
+}
+
+get_prefix_filtered_list2 ()
+{
+ # $1: prefix
+ # $2: \@list
+ # $3: \@filtered
+ # $4: \@list2
+ # $5: \@filtered2
+ declare -a olist
+ local pfx=$1
+ pfx=${pfx#\"}
+ eval "olist=( \"\${$2[@]}\" )"
+ eval "local orig_len=\${#$2[@]}"
+ local orig_idx=0
+ local idx=0
+ for (( orig_idx = 0; orig_idx < orig_len; orig_idx++ )); do
+ eval "local elem=\${$2[$orig_idx]}"
+ eval "local elem2=\${$4[$orig_idx]}"
+ local sub=${elem#$pfx}
+ if [ "$elem" == "$sub" ] && [ -n "$pfx" ]; then
+ continue
+ fi
+ eval "$3[$idx]=\"$elem\""
+ eval "$5[$idx]=\"$elem2\""
+ (( idx++ ))
+ done
+}
+
+declare vyatta_cfg_help=""
+declare vyatta_cfg_type=""
+declare vyatta_cfg_tag=0
+declare vyatta_cfg_multi=0
+declare -a vyatta_cfg_allowed=()
+declare vyatta_cfg_comp_help=""
+declare -a vyatta_cfg_val_type=()
+declare -a vyatta_cfg_val_help=()
+
+declare -a _get_help_text_items=()
+declare -a _get_help_text_helps=()
+get_help_text ()
+{
+ vyatta_help_text="\\nPossible completions:"
+ for (( idx = 0; idx < ${#_get_help_text_items[@]}; idx++ )); do
+ vyatta_help_text+="\\n\\x20\\x20"
+ if [ ${#_get_help_text_items[idx]} -lt 6 ]; then
+ vyatta_help_text+="${_get_help_text_items[idx]}\\t\\t"
+ elif [ ${#_get_help_text_items[idx]} -lt 14 ]; then
+ vyatta_help_text+="${_get_help_text_items[idx]}\\t"
+ else
+ vyatta_help_text+="${_get_help_text_items[idx]}\\n\\x20\\x20\\t\\t"
+ fi
+ vyatta_help_text+="${_get_help_text_helps[idx]}"
+ done
+ if [ -n "$vyatta_cfg_comp_help" ]; then
+ local hstr=${vyatta_cfg_comp_help//\'/\'\\\\\\\'\'}
+ vyatta_help_text+="\\n\\nDetailed information:\\n"
+ local sIFS=$IFS
+ IFS=' '
+ local chstr=$(echo -en "$hstr\n" \
+ | while read comp_help_line; do
+ echo "vyatta_help_text+=' $comp_help_line\\n';"
+ done)
+ eval "$chstr"
+ IFS=$sIFS
+ fi
+}
+
+get_value_format_string ()
+{
+ local vtype=$1
+ if [[ $vtype = !* ]]; then
+ echo -n '!'
+ vtype="${vtype#!}"
+ fi
+ case "$vtype" in
+ _*)
+ echo -n "${vtype#_}"
+ ;;
+ txt)
+ echo -n '<text>'
+ ;;
+ u32)
+ echo -n '<0-4294967295>'
+ ;;
+ u32:*)
+ echo -n "<${vtype##u32:}>"
+ ;;
+ range)
+ echo -n "<start>-<end>"
+ ;;
+ ipv4)
+ echo -n '<x.x.x.x>'
+ ;;
+ ipv6)
+ echo -n '<h:h:h:h:h:h:h:h>'
+ ;;
+ ipv4net)
+ echo -n '<x.x.x.x/x>'
+ ;;
+ ipv6net)
+ echo -n '<h:h:h:h:h:h:h:h/x>'
+ ;;
+ ipv4range)
+ echo -n '<x.x.x.x>-<x.x.x.x>'
+ ;;
+ ipv6range)
+ echo -n '<h:h:h:h:h:h:h:h>-<h:h:h:h:h:h:h:h>'
+ ;;
+ bool)
+ echo -n '<boolean>'
+ ;;
+ macaddr)
+ echo -n '<h:h:h:h:h:h>'
+ ;;
+ *)
+ echo -n "$vtype"
+ ;;
+ esac
+}
+
+declare -a vyatta_completions
+declare vyatta_help_text="\\nNo help text available"
+declare vyatta_do_help=false
+vyatta_do_complete ()
+{
+ if $vyatta_do_help; then
+ printf "$vyatta_help_text"
+ COMPREPLY=( "" " " )
+ else
+ local -a f_comps=()
+ local cword=
+ if (( ${#COMP_WORDS[@]} > 0 )); then
+ cword=${COMP_WORDS[COMP_CWORD]}
+ fi
+ get_prefix_filtered_list "$cword" vyatta_completions f_comps
+ local estr="COMPREPLY=( "
+ for w in "${f_comps[@]}"; do
+ estr="$estr\"$w\" "
+ done
+ estr="${estr})"
+ eval "$estr"
+ fi
+ vyatta_help_text="\\nNo help text available"
+}
+
+vyatta_simple_complete ()
+{
+ # when this function is called, it is expected that:
+ # * "vyatta_help_text" is filled with the help text.
+ # * "vyatta_completions" is an array of "filtered" possible completions
+ # (i.e., only those starting with the current last component).
+ if $vyatta_do_help; then
+ printf "$vyatta_help_text"
+ COMPREPLY=( "" " " )
+ else
+ COMPREPLY=( "${vyatta_completions[@]}" )
+ fi
+ vyatta_help_text="\\nNo help text available"
+}
+
+generate_pipe_help ()
+{
+ _get_help_text_items=( "${_vyatta_pipe_completions[@]}" \
+ "${_vyatta_pipe_noncompletions[@]}" )
+ _get_help_text_helps=()
+ for comp in "${_get_help_text_items[@]}"; do
+ _get_help_text_helps+=("$(_vyatta_pipe_help "$comp")")
+ done
+ get_help_text
+}
+
+# env variables for shell api completion
+declare _cli_shell_api_last_comp_val=''
+declare _cli_shell_api_comp_help=''
+declare -a _cli_shell_api_comp_values=()
+declare -a _cli_shell_api_hitems=()
+declare -a _cli_shell_api_hstrs=()
+
+vyatta_config_complete ()
+{
+ local restore_shopts=$( shopt -p extglob nullglob | tr \\n \; )
+ shopt -s extglob nullglob
+
+ if [ "$COMP_LINE" == "$VYATTA_COMP_LINE" ]; then
+ VYATTA_COMP_LINE=''
+ vyatta_do_help=true
+ else
+ VYATTA_COMP_LINE=$COMP_LINE
+ vyatta_do_help=false
+ fi
+
+ # handle pipe
+ if _vyatta_pipe_completion "${COMP_WORDS[@]}"; then
+ generate_pipe_help
+ vyatta_completions=( "${_vyatta_pipe_completions[@]}" )
+ vyatta_do_complete
+ eval $restore_shopts
+ return
+ fi
+
+ if (( ${#COMP_WORDS[@]} < 2 )); then
+ _get_help_text_items=( "activate" \
+ "confirm" \
+ "comment" \
+ "commit" \
+ "commit-confirm" \
+ "compare" \
+ "copy" \
+ "deactivate" \
+ "delete" \
+ "discard" \
+ "edit" \
+ "exit" \
+ "load" \
+ "loadkey" \
+ "merge" \
+ "rename" \
+ "rollback" \
+ "run" \
+ "save" \
+ "set" \
+ "show" )
+ _get_help_text_helps=( \
+ "Activate this element" \
+ "Confirm prior commit" \
+ "Add comment to this configuration element" \
+ "Commit the current set of changes" \
+ "Commit the current set of changes with confirm" \
+ "Compare configuration revisions" \
+ "Copy a configuration element" \
+ "Deactivate this element" \
+ "Delete a configuration element" \
+ "Discard uncommitted changes" \
+ "Edit a sub-element" \
+ "Exit from this configuration level" \
+ "Load configuration from a file and replace running configuration" \
+ "Load user SSH key from a file" \
+ "Load configuration from a file and merge running configuration" \
+ "Rename a configuration element" \
+ "Rollback to a prior config revision (requires reboot)" \
+ "Run an operational-mode command" \
+ "Save configuration to a file" \
+ "Set the value of a parameter or create a new element" \
+ "Show the configuration (default values may be suppressed)" \
+ )
+ if (( ${#COMP_WORDS[@]} == 1 )); then
+ declare -a fitems=()
+ declare -a fstrs=()
+ get_prefix_filtered_list2 "${COMP_WORDS[0]}" \
+ _get_help_text_items fitems _get_help_text_helps fstrs
+ _get_help_text_items=( "${fitems[@]}" )
+ _get_help_text_helps=( "${fstrs[@]}" )
+ fi
+ get_help_text
+ vyatta_completions=( "${_get_help_text_items[@]}" )
+ vyatta_do_complete
+ eval $restore_shopts
+ return
+ fi
+
+ local command=${COMP_WORDS[0]}
+ local last_comp="${COMP_WORDS[COMP_CWORD]}"
+
+ # handle "exit"
+ if [ "$command" == "exit" ]; then
+ if (( COMP_CWORD > 1 )); then
+ COMPREPLY=()
+ eval $restore_shopts
+ return
+ fi
+ _get_help_text_items=("discard")
+ _get_help_text_helps=("Discard any changes")
+ get_help_text
+ vyatta_completions=("discard")
+ vyatta_do_complete
+ eval $restore_shopts
+ return
+ fi
+
+ local -a api_args=("${COMP_WORDS[@]}")
+
+ # handle "copy" and "rename"
+ if [ "$command" == "copy" -o "$command" == "rename" ]; then
+ # Syntax of copy and rename commands are:
+ #
+ # copy/rename <param1> <sub-param1> to <param2> <sub-param2>
+ #
+ # where <param1> and <param2> are configuration parameters
+ # in the tree at the current edit level.
+ #
+ # If parsing index 1 or 2 (i.e. <param1> or <sub-param1>),
+ # fall through this test to the parameter parsing code below.
+ if (( COMP_CWORD == 3 )); then
+ # If parsing index 3, there's only one option.
+ _get_help_text_items=("to")
+ _get_help_text_helps=("Set destination")
+ get_help_text
+ vyatta_completions=("to")
+ vyatta_do_complete
+ eval $restore_shopts
+ return
+ elif (( COMP_CWORD > 3 && COMP_CWORD < 6 )); then
+ # If parsing index 4 or 5, start completion at <param2>.
+ api_args=("$command" "${COMP_WORDS[@]:4}")
+ elif (( COMP_CWORD > 5 )); then
+ # If parsing after index 5, there are no more valid parameters
+ COMPREPLY=()
+ eval $restore_shopts
+ return
+ fi
+ fi
+
+ if ! vyatta_cli_shell_api getCompletionEnv "${api_args[@]}"; then
+ # invalid completion
+ eval $restore_shopts
+ return
+ fi
+ vyatta_cfg_comp_help=$_cli_shell_api_comp_help
+ _get_help_text_helps=( "${_cli_shell_api_hstrs[@]}" )
+ if $_cli_shell_api_last_comp_val; then
+ # last component is a "value". need to do the following:
+ # use comp_help if exists
+ # prefix filter comp_values
+ # replace any <*> in comp_values with ""
+ # convert help items to <...> representation
+ _get_help_text_items=()
+ for ((i = 0; i < ${#_cli_shell_api_hitems[@]}; i++)); do
+ local t=$(get_value_format_string "${_cli_shell_api_hitems[i]}")
+ _get_help_text_items+=("$t")
+ done
+ vyatta_completions=()
+ for ((i = 0; i < ${#_cli_shell_api_comp_values[@]}; i++)); do
+ if [ -z "$last_comp" ] \
+ && [[ "${_cli_shell_api_comp_values[i]}" = \<*\> ]]; then
+ vyatta_completions+=("")
+ elif [ -z "$last_comp" ] \
+ || [[ "${_cli_shell_api_comp_values[i]}" = "$last_comp"* ]]; then
+ vyatta_completions+=("${_cli_shell_api_comp_values[i]}")
+ fi
+ done
+ else
+ _get_help_text_items=( "${_cli_shell_api_hitems[@]}" )
+ vyatta_completions=( "${_cli_shell_api_comp_values[@]}" )
+ fi
+ get_help_text
+ vyatta_simple_complete
+ eval $restore_shopts
+}
+
+if ! vyatta_cli_shell_api setupSession; then
+ echo 'Failed to set up config session'
+ builtin exit 1
+fi
+
+# disallow 'Ctrl-D' exit, since we need special actions on 'exit'
+builtin set -o ignoreeof 1
+
+reset_edit_level
+alias set=/opt/vyatta/sbin/my_set
+alias delete=/opt/vyatta/sbin/my_delete
+alias activate=/opt/vyatta/sbin/my_activate
+alias deactivate=/opt/vyatta/sbin/my_deactivate
+alias rename=/opt/vyatta/sbin/my_rename
+alias copy=/opt/vyatta/sbin/my_copy
+alias comment=/opt/vyatta/sbin/my_comment
+alias discard=/opt/vyatta/sbin/my_discard
+
+export VYATTA_COMP_LINE=""
+
+# readline bindings
+bind 'set show-all-if-ambiguous on'
+if ! bind -p |grep -q '\\C-x\\C-t'; then
+ bind '"\C-x\C-t": kill-region'
+fi
+if ! bind -p |grep -q '\\C-x\\C-o'; then
+ bind '"\C-x\C-o": copy-region-as-kill'
+fi
+
+complete -F vyatta_config_complete ''
+complete -F vyatta_config_complete activate
+complete -F vyatta_config_complete deactivate
+complete -F vyatta_config_complete set
+complete -F vyatta_config_complete delete
+complete -F vyatta_config_complete show
+complete -F vyatta_config_complete edit
+complete -F vyatta_config_complete exit
+complete -F vyatta_run_complete run
+complete -F vyatta_loadsave_complete save
+complete -F vyatta_loadsave_complete load
+complete -F vyatta_loadsave_complete merge
+complete -F vyatta_loadkey_complete loadkey
+complete -F vyatta_compare_complete compare
+complete -F vyatta_config_complete comment
+complete -F vyatta_config_complete copy
+complete -F vyatta_config_complete rename
+complete -F vyatta_rollback_complete rollback
+complete -F vyatta_commit_complete commit
+complete -F vyatta_commit_complete commit-confirm
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 4
+# End: