summaryrefslogtreecommitdiff
path: root/functions
diff options
context:
space:
mode:
authorJohn Southworth <john.southworth@vyatta.com>2011-08-02 12:45:09 -0500
committerJohn Southworth <john.southworth@vyatta.com>2011-08-02 12:45:09 -0500
commit078992d5bca135f6389cc37bf867ebbefb1ff72b (patch)
treeb3c9569e216574a4b544e561a1c4debc855c3e21 /functions
parent65d10befec7daac9e1c600073fca0e912c188f23 (diff)
downloadvyatta-op-078992d5bca135f6389cc37bf867ebbefb1ff72b.tar.gz
vyatta-op-078992d5bca135f6389cc37bf867ebbefb1ff72b.zip
Reorganize the bash completion and command interpreter scripts into easier to manage chunks. vyatta-op-run no longer exists in /etc/bash_completion.d/ as it is not a completion script it should not be here
Diffstat (limited to 'functions')
-rw-r--r--functions/interpreter/vyatta-common82
-rw-r--r--functions/interpreter/vyatta-image-complete142
-rw-r--r--functions/interpreter/vyatta-op-run167
3 files changed, 391 insertions, 0 deletions
diff --git a/functions/interpreter/vyatta-common b/functions/interpreter/vyatta-common
new file mode 100644
index 0000000..0a98d56
--- /dev/null
+++ b/functions/interpreter/vyatta-common
@@ -0,0 +1,82 @@
+# vyatta bash completion common functions
+
+# **** 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 common functions
+#
+# **** End License ****
+
+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
+}
+
+is_elem_of () {
+ local elem=$1
+ local -a olist
+ eval "olist=( \"\${$2[@]}\" )"
+ for e in ${olist[*]}; do
+ if [[ "$e" == "$elem" ]]; then
+ return 0
+ fi
+ done
+ return 1
+}
diff --git a/functions/interpreter/vyatta-image-complete b/functions/interpreter/vyatta-image-complete
new file mode 100644
index 0000000..d9dc240
--- /dev/null
+++ b/functions/interpreter/vyatta-image-complete
@@ -0,0 +1,142 @@
+# vyatta bash operational mode image name completions
+# **** 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.
+#
+# This code was originally developed by Vyatta, Inc.
+# Portions created by Vyatta are Copyright (C) 2006, 2007 Vyatta, Inc.
+# All Rights Reserved.
+#
+# Author: John Southworth
+# Date: 2011
+# Description: setup bash completion for image file names
+#
+# **** End License ****
+_vyatta_image_is_file()
+{
+ local cur=$1
+ cur=${cur/:/}
+ topdir=${cur%%/*}
+ cur=${cur#$topdir/}
+ if [[ $topdir == "running" ]]; then
+ cur="/${cur}"
+ elif [[ $topdir == "disk-install" ]]; then
+ cur="/live/image/${cur}"
+ else
+ cur="/live/image/boot/${topdir}/live-rw/${cur}"
+ fi
+ if [[ -f ${cur} ]]; then
+ return 0;
+ else
+ return 1;
+ fi
+}
+
+_vyatta_image_file_complete()
+{
+ if _vyatta_image_is_file ${COMP_WORDS[(( ${#COMP_WORDS[@]}-2 ))]}; then
+ _vyatta_op_completions=( "" " " )
+ return 0;
+ fi
+ _vyatta_image_path_complete
+}
+
+
+_vyatta_image_path_complete()
+{
+ compopt -o nospace
+ local -a reply
+ if _vyatta_image_is_file $cur ; then
+ foundfile=1
+ _vyatta_op_completions=( "${cur} " )
+ return 0;
+ fi
+ if [[ ${cur} == "" ]]; then
+ reply=( $(compgen -d /live/image/boot/ | grep -v grub) )
+ for i in `seq 0 $[${#reply[@]}-1]`; do
+ file=${reply[$i]}
+ reply[$i]=${file/#\/live\/image\/boot\//}
+ reply[$i]="${reply[$i]}://config/"
+ done
+ reply+=( "running://config/" )
+ if [[ -d /live/image/opt/vyatta/etc/config || -d /live/image/config ]]; then
+ reply+=( "disk-install://" )
+ fi
+ else
+ if ! [[ $cur =~ .*:\/\/ ]]; then
+ if [[ $cur =~ .*:\/ ]]; then
+ cur=${cur/:\//}
+ fi
+ if [[ $cur =~ .*: ]]; then
+ cur=${cur/:/}
+ fi
+ local isrunningimg=$(compgen -W "running" -- ${cur})
+ local isdiskinstall=$(compgen -W "disk-install" -- ${cur})
+ if [[ $isrunningimg == "running" ]];then
+ cur="/"
+ elif [[ $isdiskinstall == "disk-install" ]]; then
+ cur="/live/image/"
+ else
+ cur="/live/image/boot/${cur}"
+ fi
+ reply=( $(compgen -f ${cur}) )
+ for i in `seq 0 $[${#reply[@]}-1]`; do
+ file=${reply[$i]}
+ if [[ $isrunningimg == "running" ]];then
+ reply[$i]="running://config/"
+ elif [[ $isdiskinstall == "disk-install" ]]; then
+ reply[$i]="disk-install://"
+ else
+ reply[$i]=${file/#\/live\/image\/boot\//}
+ if [[ -d /live/image/boot/${reply[$i]} ]]; then
+ reply[$i]="${reply[$i]/#\//}://config/"
+ fi
+ fi
+ done
+ else
+ cur=${cur/:/}
+ topdir=${cur%%/*}
+ cur=${cur#$topdir//}
+ if [[ $topdir == "running" ]]; then
+ cur="/${cur}"
+ elif [[ $topdir == "disk-install" ]]; then
+ cur="/live/image/${cur}"
+ else
+ cur="/live/image/boot/${topdir}/live-rw/${cur}"
+ fi
+ reply=( $(compgen -f ${cur}) )
+ # for loop from _filedirs() in /etc/bash_completion
+ for ((i=0; i < ${#reply[@]}; i++)); do
+ if [[ ${cur:0:1} != "'" ]]; then
+ [[ -d ${reply[i]} ]] && reply[i]="${reply[i]}"/
+ if [[ ${cur:0:1} == '"' ]]; then
+ reply[i]=${reply[i]//\\/\\\\}
+ reply[i]=${reply[i]//\"/\\\"}
+ reply[i]=${reply[i]//\$/\\\$}
+ else
+ reply[i]=$(printf %q ${reply[i]})
+ fi
+ fi
+ done
+ for i in `seq 0 $[${#reply[@]}-1]`; do
+ file=${reply[$i]}
+ if [[ $topdir == "running" ]]; then
+ reply[$i]=${file/#\//"$topdir://"}
+ elif [[ $topdir == "disk-install" ]]; then
+ reply[$i]=${file/#\/live\/image\//$"$topdir://"}
+ else
+ reply[$i]=${file/#\/live\/image\/boot\/$topdir/"$topdir://"}
+ reply[$i]=${reply[$i]/\/live-rw\/}
+ fi
+ done
+ fi
+ fi
+ _vyatta_op_completions=( "${reply[@]}" )
+ return 0
+}
diff --git a/functions/interpreter/vyatta-op-run b/functions/interpreter/vyatta-op-run
new file mode 100644
index 0000000..33de2f1
--- /dev/null
+++ b/functions/interpreter/vyatta-op-run
@@ -0,0 +1,167 @@
+
+# **** 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.
+#
+# This code was originally developed by Vyatta, Inc.
+# Portions created by Vyatta are Copyright (C) 2006, 2007 Vyatta, Inc.
+# All Rights Reserved.
+#
+# Author: Tom Grennan
+# Date: 2007
+# Description: setup bash completion for Vyatta operational commands
+#
+# **** End License ****
+
+_vyatta_op_init ()
+{
+ # empty and default line compeletion
+ complete -E -F _vyatta_op_expand
+ complete -D -F _vyatta_op_default_expand
+
+ # create the top level aliases for the unambiguous portions of the commands
+ # this is the only place we need an entire enumerated list of the subcommands
+ for cmd in $( ls /opt/vyatta/share/vyatta-op/templates/ ); do
+ for pos in $(seq 1 ${#cmd}); do
+ case ${cmd:0:$pos} in
+ for|do|done|if|fi|case|while|tr )
+ continue ;;
+ *) ;;
+ esac
+ complete -F _vyatta_op_expand ${cmd:0:$pos}
+ eval alias ${cmd:0:$pos}=\'_vyatta_op_run ${cmd:0:$pos}\'
+ done
+ done
+
+ shopt -s histverify
+ if [[ "$VYATTA_USER_LEVEL_DIR" == "/opt/vyatta/etc/shell/level/users" ]]; then
+ PS1='\u@\h> '
+ fi
+}
+
+_vyatta_op_get_node_def_field ()
+{
+ local file=$1 field=$2
+
+ sed -n '/^'"$field"':/,$ {
+# strip field name and hold rest of line
+ s/[a-z]*: *//
+ h
+ :b
+# at EOF, print hold buffer and quit
+ $ { x; p; q }
+# input next line
+ n
+# if start of another field def, print hold buf and quit
+ /^[a-z]*:/ { x; p; q }
+# add to hold buf and branch to input next line
+ H
+ bb
+ }' $file
+}
+
+_vyatta_op_conv_node_path ()
+{
+ # is the node ok, ambiguous, or invalid
+ local node_path
+ local node
+ local -a ARR
+ node_path=$1
+ node=$2
+ ARR=( "$node_path/$node"* )
+ if [[ "${#ARR[@]}" == "1" ]]; then
+ echo ${ARR[0]##*/}
+ elif [[ "${#ARR[@]}" == "0" ]]; then
+ if [[ -d "${node_path}/node.tag" ]]; then
+ echo "$node tag"
+ else
+ echo "$node invalid"
+ fi
+ elif [[ -d "$node_path/$node" ]]; then
+ echo $node
+ else
+ echo "$node ambiguous"
+ fi
+}
+
+_vyatta_op_conv_run_cmd ()
+{
+ # Substitue bash positional variables
+ # for the same value in the expanded array
+ local run_cmd
+ run_cmd="$@"
+ run_cmd="${run_cmd/\"\$\@\"/${args[*]}}"
+ run_cmd="${run_cmd/\$\*/${args[*]}}"
+ run_cmd=$(echo -e "$run_cmd" | sed -e 's/\$\([0-9]\)/\$\{args\[\1\]\}/g')
+ echo -ne "$run_cmd"
+}
+
+_vyatta_op_run ()
+{
+ local -i estat
+ local tpath=$vyatta_op_templates
+ local restore_shopts=$( shopt -p extglob nullglob | tr \\n \; )
+ shopt -s extglob nullglob
+
+ _vyatta_op_last_comp=${_vyatta_op_last_comp_init}
+ false; estat=$?
+
+ i=1
+ declare -a args # array of expanded arguments
+ for arg in "$@"; do
+ arg=( $(_vyatta_op_conv_node_path $tpath $arg) ) # expand the arguments
+ # output proper error message based on the above expansion
+ if [[ "${arg[1]}" == "ambiguous" ]]; then
+ echo -ne "\n Ambiguous command: ${args[@]} [$arg]\n"
+ local -a cmds=( "$tpath/$arg"* )
+ _vyatta_op_node_path=$tpath
+ local comps=$(_vyatta_op_help $arg ${cmds[@]##*/})
+ echo -e "$comps\n" | sed -e 's/^P/ P/'
+ eval $restore_shopts
+ return 1
+ elif [[ "${arg[1]}" == "invalid" ]]; then
+ echo -ne "\n Invalid command: ${args[@]} [$arg]\n\n"
+ eval $restore_shopts
+ return 1
+ fi
+
+ args[$i]=$arg
+ if [ -f "$tpath/$arg/node.def" ] ; then
+ tpath+=/$arg
+ elif [ -f $tpath/node.tag/node.def ] ; then
+ tpath+=/node.tag
+ else
+ echo "Invalid command" >&2
+ eval $restore_shopts
+ return 1
+ fi
+ let "i+=1"
+ done
+
+ local run_cmd=$(_vyatta_op_get_node_def_field $tpath/node.def run)
+ run_cmd=$(_vyatta_op_conv_run_cmd "$run_cmd") # convert the positional parameters
+ local ret=0
+ local cmd_regex="^(LESSOPEN=|less|pager|tail|/opt/vyatta/bin/vyatta-tshark-interface-port.pl).*"
+ if [ -n "$run_cmd" ]; then
+ if [[ -t 1 && "$1" == "show" && ! $run_cmd =~ $cmd_regex ]] ; then
+ eval "($run_cmd) | ${VYATTA_PAGER:-cat}"
+ else
+ eval "$run_cmd"
+ fi
+ else
+ echo -ne "\n Incomplete command: ${args[@]}\n\n" >&2
+ ret=1
+ fi
+ eval $restore_shopts
+ return $ret
+}
+
+### Local Variables:
+### mode: shell-script
+### End: