* Introduced two argument to 'configure':
* --without-bash-completion
Don't install bash completion script
* --with-bash-completion-dir
Install bash completion script to user defined folder.
If not defined, use pkg-config of bash-completion(>= 2.0) path.
On RHEL 6 or bash-completion not installed, use
/etc/bash_completion.d/
* For RPM spec, introduce build requirement of bash-completion >= 2.0
on non-RHEL6 OS.
* Moved 'doc/lsmcli.bash' to 'tools/bash_completion/lsmcli' as it's
not
a document.
* Tested by "make rpm" on OBS(RHEL6/7, Fedora, openSuSE).
Signed-off-by: Gris Ge <fge(a)redhat.com>
---
configure.ac | 36 ++++
doc/lsmcli.bash | 421 --------------------------------------
packaging/libstoragemgmt.spec.in | 10 +
tools/Makefile.am | 2 +-
tools/bash_completion/Makefile.am | 4 +
tools/bash_completion/lsmcli | 421 ++++++++++++++++++++++++++++++++++++++
6 files changed, 472 insertions(+), 422 deletions(-)
delete mode 100644 doc/lsmcli.bash
create mode 100644 tools/bash_completion/Makefile.am
create mode 100644 tools/bash_completion/lsmcli
diff --git a/configure.ac b/configure.ac
index db657bb..1464e7c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -200,6 +200,41 @@ PKG_CHECK_MODULES(
AC_MSG_ERROR([libconfig 1.3.2 or newer not found.])
)
+dnl ==========================================================================
+dnl Add option '--without-bash-completion' to exclude bash completion script.
+dnl ==========================================================================
+
+AC_ARG_WITH([bash-completion],
+ [AS_HELP_STRING([--without-bash-completion],
+ [Do not install the bash auto-completion script])],
+ [],
+ [with_bash_completion=yes])
+
+AM_CONDITIONAL(
+ [WITH_BASH_COMPLETION], [test "x$with_bash_completion" =
"xyes"])
+
+dnl ==========================================================================
+dnl Add option '--with-bash-completion-dir' to specific bash completion dir,
+dnl if not defined, if pkg-config file for bash-completion found, use its
+dnl 'completionsdir', else use /etc/bash_completion.d
+dnl ==========================================================================
+AC_ARG_WITH([bash-completion-dir],
+ AS_HELP_STRING(
+ [--with-bash-completion-dir=DIR],
+ [Bash completions directory]),
+ [],
+ [AS_IF(
+ [$($PKG_CONFIG --exists bash-completion)],
+ [with_bash_completion_dir=$(
+ $PKG_CONFIG --variable=completionsdir bash-completion)],
+ # EPEL 6 is still shipping bash-completion version 1.x
+ # which does not provide pkg-config support.
+ # So, for EPEL 6 or anyone not installed bash-compeltion, we
+ # use fallback folder '/etc/bash_completion.d'
+ [with_bash_completion_dir=$sysconfdir/bash_completion.d])])
+
+AC_SUBST([bashcompletiondir], [$with_bash_completion_dir])
+
#Setup the unit directory for systemd stuff
PKG_PROG_PKG_CONFIG
AC_ARG_WITH([systemdsystemunitdir],
@@ -233,6 +268,7 @@ AC_OUTPUT(libstoragemgmt.pc \
tools/udev/Makefile \
tools/lsmcli/Makefile \
tools/utility/Makefile \
+ tools/bash_completion/Makefile \
packaging/Makefile \
packaging/daemon/Makefile \
packaging/libstoragemgmt.spec \
diff --git a/doc/lsmcli.bash b/doc/lsmcli.bash
deleted file mode 100644
index a67083b..0000000
--- a/doc/lsmcli.bash
+++ /dev/null
@@ -1,421 +0,0 @@
-# Copyright (C) 2015 Red Hat, Inc., Tony Asleson <tasleson(a)redhat.com>
-# Distributed under the GNU General Public License, version 2.0.
-# See:
https://www.gnu.org/licenses/gpl-2.0.html
-#
-# Bash completion for lsmcli. This may be far from ideal,
-# suggestions & improvements appreciated!
-
-potential_args=''
-
-# Skip value lookups by default
-NO_VALUE_LOOKUP=${LSMCLI_AUTO_COMPLETE_VALUE:=0}
-
-function join { local IFS="$1"; shift; echo "$*"; }
-
-# Linear search of an array of strings for the specified string
-function listcontains() {
- declare -a the_list=("${!1}")
-
- for word in "${the_list[@]}" ; do
- [[ ${word} == $2 ]] && return 0
- done
- return 1
-}
-
-# Given a list of what is possible and what is on the command line return
-# what is left.
-# $1 What is possible
-# Retults are returned in global string $potential_args
-function possible_args()
-{
- local l=()
-
- for i in $1
- do
- listcontains COMP_WORDS[@] "$i"
- if [[ $? -eq 1 ]] ; then
- l+=("$i")
- fi
- done
-
- potential_args=$( join ' ', "${l[@]}" )
-}
-
-# Returns the position of the value in the COMP_WORDS that contains $1, or
-# 255 if it doesn't exist
-function arg_index()
-{
- count=0
- for i in "${COMP_WORDS[@]}"
- do
- if [[ "$i" == "$1" ]] ; then
- return ${count}
- fi
- let count+=1
- done
- return 255
-}
-
-function _lsm()
-{
- local cur prev opts
- sep='#'
- COMPREPLY=()
- cur="${COMP_WORDS[COMP_CWORD]}"
- prev="${COMP_WORDS[COMP_CWORD-1]}"
- opts_short="-b -v -u -P -H -t -e -f -w -b"
- opts_long=" --help --version --uri --prompt --human --terse --enum \
- --force --wait --header --script "
- opts_cmds="list job-status capabilities plugin-info volume-create \
- volume-delete, volume-resize volume-replicate \
- volume-replicate-range volume-replicate-range-block-size \
- volume-dependants volume-dependants-rm volume-access-group \
- volume-mask volume-unmask access-group-create \
- access-group-delete access-group-add access-group-remove \
- volume-enable volume-disable iscsi-chap fs-create fs-delete \
- fs-resize fs-export fs-unexport fs-clone fs-snap-create \
- fs-snap-delete fs-snap-restore fs-dependants fs-dependants-rm \
- file-clone ls lp lv ld la lf lt c p vc vd vr vm vi ve vi ac \
- aa ar ad vri"
-
- list_args="--type"
- list_type_args="volumes pools fs snapshots exports nfs_client_auth \
- access_groups systems disks plugins target_ports"
-
- opts_filter="--sys --pool --vol --disk --ag --fs --nfs"
-
- cap_args="--sys"
- volume_create_args="--name --size --pool"
- volume_delete_args="--vol --force" # Should force be here, to easy to tab
through?"
- volume_resize_args="--vol --size --force" # Should force be here, to easy
to tab through?"
-
- volume_replicate_args="--vol --name --rep-type"
- # Hmmm, this looks like a bug with CLI, should support lower and upper case?
- volume_rep_types="CLONE COPY MIRROR_ASYNC MIRROR_SYNC"
-
- volume_replicate_range_args="--src-vol --dst-vol --rep-type --src-start \
- --dst-start --count --force" # Force ?
-
- volume_replication_range_bs="--sys"
- volume_dependants="--vol"
-
- volume_access_group_args="--vol"
- volume_masking_args="--vol --ag"
-
- access_group_create_args="--name --init --sys"
- access_group_delete_args="--ag"
-
- access_group_add_remove_args="--ag --init"
-
- volume_enable_disable_args="--vol"
-
- volume_raidinfo_args="--vol"
-
- iscsi_chap_args="--in-user --in-pass --out-user --out-pass"
-
- fs_create_args="--name --size --pool"
- fs_delete_args="--fs --force" # Force ?
- fs_resize_args="--fs --size --force" # Force ?
- fs_export_args="--fs --exportpath --anonuid --auth-type --root-host --ro-host
--rw-host"
- fs_unexport_args="--export"
- fs_clone_args="--src-fs --dst-name"
- fs_snap_create_args="--name --fs"
- fs_snap_delete_args="--snap --fs"
- fs_snap_restore_args="--snap --fs --file --fileas --force"
- fs_dependants_args="--fs"
- file_clone_args="--fs --src --dst --backing-snapshot"
-
- # These operations can potentially be slow and cause hangs depending on plugin and
configuration
- if [[ ${NO_VALUE_LOOKUP} -ne 0 ]] ; then
-
- # Check if we have somthing present that we can help the user with
- case "${prev}" in
- --sys)
- # Is there a better way todo this?
- local items=`lsmcli list --type systems -t${sep} | awk -F ${sep}
'{print $1}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- ;;
- --pool)
- # Is there a better way todo this?
- local items=`lsmcli list --type pools -t${sep} | awk -F ${sep}
'{print $1}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- ;;
- --vol|--src-vol|--dst-vol)
- # Is there a better way todo this?
- local items=`lsmcli list --type volumes -t${sep} | awk -F ${sep}
'{print $1}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- ;;
- --disk)
- # Is there a better way todo this?
- local items=`lsmcli list --type disks -t${sep} | awk -F ${sep}
'{print $1}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- ;;
- --ag)
- # Is there a better way todo this?
- local items=`lsmcli list --type access_groups -t${sep} | awk -F ${sep}
'{print $1}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- ;;
- --init)
- arg_index "--ag"
- i=$?
- # We have an access group present on the command line so filter the
intiators to it
- if [[ ${i} -ne 255 ]]; then
- # It would be better if we filtered the result with the access group
- # if it's present on the command line already.
- local items=`lsmcli list --type access_groups -t${sep} --ag
${COMP_WORDS[${i}+1]} | awk -F ${sep} '{print $3}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- else
- local items=`lsmcli list --type access_groups -t${sep} | awk -F
${sep} '{print $3}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- fi
- ;;
- --nfs-export)
- # Is there a better way todo this?
- local items=`lsmcli list --type exports -t${sep} | awk -F ${sep}
'{print $1}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- ;;
- --tgt)
- # Is there a better way todo this?
- local items=`lsmcli list --type target_ports -t${sep} | awk -F ${sep}
'{print $1}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- ;;
- --fs|--src-fs)
- local items=`lsmcli list --type fs -t${sep} | awk -F ${sep} '{print
$1}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- ;;
- --export)
- local items=`lsmcli list --type exports -t${sep} | awk -F ${sep}
'{print $1}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- ;;
- --snap)
- arg_index "--fs"
- i=$?
- # We have an access group present on the command line so filter the
snapshots to it
- if [[ ${i} -ne 255 ]]; then
- local items=`lsmcli list --type snapshots \
- --fs ${COMP_WORDS[${i}+1]} -t${sep} | awk -F ${sep} '{print
$1}'`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- else
- COMPREPLY=( $(compgen -W "" -- ${cur}) )
- return 0
- fi
- ;;
- --auth-type)
- local items=`lsmcli list --type nfs_client_auth -t ' '`
- COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
- return 0
- ;;
- *)
- ;;
- esac
- fi
-
- # Cases where we don't have to worry about look-up time
- case "${prev}" in
- --type)
- COMPREPLY=( $(compgen -W "${list_type_args}" -- ${cur}) )
- return 0
- ;;
- --size|--count|--src-start|--dst-start|--name|--in-user|--in-pass|\
- --out-user|--out-pass|--exportpath|--anonuid|--root-host|--ro-host|\
- --rw-host|--dest-name|--file|--fileas|--src|--dst)
- # These we cannot lookup, so don't offer any values
- COMPREPLY=( $(compgen -W "" -- ${cur}) )
- return 0
- ;;
- --rep-type)
- COMPREPLY=( $(compgen -W "${volume_rep_types}" -- ${cur}) )
- return 0
- ;;
- snapshots)
- # Specific listing case where you need a fs too
- if [[ ${COMP_WORDS[COMP_CWORD-2]} == '--type' && \
- ${COMP_WORDS[COMP_CWORD-3]} == 'list' ]] ; then
- COMPREPLY=( $(compgen -W "--fs" -- ${cur}) )
- return 0
- fi
- ;;
- *)
- esac
-
- case "${COMP_WORDS[1]}" in
- job-status)
- possible_args "--job"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- list)
- possible_args ${list_args}
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-create|vc)
- possible_args "${volume_create_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-delete|vd)
- possible_args "${volume_delete_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-raid-info|vri)
- possible_args "${volume_raidinfo_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-resize|vr)
- possible_args "${volume_resize_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-replicate)
- possible_args "${volume_replicate_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-replicate-range)
- possible_args "${volume_replicate_range_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-replicate-range-block-size)
- possible_args "${volume_replication_range_bs}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-dependants|volume-dependants-rm)
- possible_args "${volume_dependants}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-access-group)
- possible_args "${volume_access_group_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-mask|volume-unmask|vm|vu)
- possible_args "${volume_masking_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- access-group-create|ac)
- possible_args "${access_group_create_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- access-group-delete|ad)
- possible_args "${access_group_delete_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- access-group-add|access-group-remove|aa|ar)
- possible_args "${access_group_add_remove_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- volume-enable|volume-disable|ve|vi)
- possible_args "${volume_enable_disable_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- iscsi-chap)
- possible_args "${iscsi_chap_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- fs-create)
- possible_args "${fs_create_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- fs-delete)
- possible_args "${fs_delete_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- fs-resize)
- possible_args "${fs_resize_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- fs-export)
- possible_args "${fs_export_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- fs-unexport)
- possible_args "${fs_unexport_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- fs-clone)
- possible_args "${fs_clone_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- fs-snap-create)
- possible_args "${fs_snap_create_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- fs-snap-delete)
- possible_args "${fs_snap_delete_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- fs-snap-restore)
- possible_args "${fs_snap_restore_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- fs-dependants|fs-dependants-rm)
- possible_args "${fs_dependants_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- file-clone)
- possible_args "${file_clone_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- capabilities|c)
- possible_args "${cap_args}"
- COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
- return 0
- ;;
- *)
- ;;
- esac
-
- # Handle the case where we are starting out with nothing
- if [[ ${prev} == 'lsmcli' ]] ; then
- if [[ ${cur} == --* ]] ; then
- COMPREPLY=( $(compgen -W "${opts_long}" -- ${cur}) )
- return 0
- fi
-
- if [[ ${cur} == -* ]] ; then
- COMPREPLY=( $(compgen -W "${opts_short}${opts_long}" -- ${cur}) )
- return 0
- fi
-
- if [[ ${cur} == * ]] ; then
- COMPREPLY=( $(compgen -W "${opts_short}${opts_long}${opts_cmds}"
-- ${cur}) )
- return 0
- fi
- fi
-}
-complete -F _lsm lsmcli
diff --git a/packaging/libstoragemgmt.spec.in b/packaging/libstoragemgmt.spec.in
index 1ca0eea..38e0d28 100644
--- a/packaging/libstoragemgmt.spec.in
+++ b/packaging/libstoragemgmt.spec.in
@@ -68,6 +68,9 @@ BuildRequires: fdupes
%if 0%{?rhel} == 6
BuildRequires: python-ordereddict
+%else
+# Require bash-completion > 2.0
+BuildRequires: bash-completion >= 2.0
%endif
%if 0%{?with_systemd}
@@ -464,6 +467,13 @@ fi
%dir %{_sysconfdir}/lsm
%dir %{_sysconfdir}/lsm/pluginconf.d
+%if 0%{?rhel} == 6
+%{_sysconfdir}/bash_completion.d/lsmcli
+%else
+%{_datadir}/bash-completion/completions/lsmcli
+%endif
+
+
%if 0%{?with_systemd}
%{_unitdir}/libstoragemgmt.service
%endif
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 1d41361..25c9abc 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,3 +1,3 @@
## Process this file with automake to produce Makefile.in
-SUBDIRS = lsmcli udev utility
+SUBDIRS = lsmcli udev utility bash_completion
diff --git a/tools/bash_completion/Makefile.am b/tools/bash_completion/Makefile.am
new file mode 100644
index 0000000..d1a9c3a
--- /dev/null
+++ b/tools/bash_completion/Makefile.am
@@ -0,0 +1,4 @@
+if WITH_BASH_COMPLETION
+EXTRA_DIST=lsmcli
+bashcompletion_DATA = lsmcli
+endif
diff --git a/tools/bash_completion/lsmcli b/tools/bash_completion/lsmcli
new file mode 100644
index 0000000..a67083b
--- /dev/null
+++ b/tools/bash_completion/lsmcli
@@ -0,0 +1,421 @@
+# Copyright (C) 2015 Red Hat, Inc., Tony Asleson <tasleson(a)redhat.com>
+# Distributed under the GNU General Public License, version 2.0.
+# See:
https://www.gnu.org/licenses/gpl-2.0.html
+#
+# Bash completion for lsmcli. This may be far from ideal,
+# suggestions & improvements appreciated!
+
+potential_args=''
+
+# Skip value lookups by default
+NO_VALUE_LOOKUP=${LSMCLI_AUTO_COMPLETE_VALUE:=0}
+
+function join { local IFS="$1"; shift; echo "$*"; }
+
+# Linear search of an array of strings for the specified string
+function listcontains() {
+ declare -a the_list=("${!1}")
+
+ for word in "${the_list[@]}" ; do
+ [[ ${word} == $2 ]] && return 0
+ done
+ return 1
+}
+
+# Given a list of what is possible and what is on the command line return
+# what is left.
+# $1 What is possible
+# Retults are returned in global string $potential_args
+function possible_args()
+{
+ local l=()
+
+ for i in $1
+ do
+ listcontains COMP_WORDS[@] "$i"
+ if [[ $? -eq 1 ]] ; then
+ l+=("$i")
+ fi
+ done
+
+ potential_args=$( join ' ', "${l[@]}" )
+}
+
+# Returns the position of the value in the COMP_WORDS that contains $1, or
+# 255 if it doesn't exist
+function arg_index()
+{
+ count=0
+ for i in "${COMP_WORDS[@]}"
+ do
+ if [[ "$i" == "$1" ]] ; then
+ return ${count}
+ fi
+ let count+=1
+ done
+ return 255
+}
+
+function _lsm()
+{
+ local cur prev opts
+ sep='#'
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
+ opts_short="-b -v -u -P -H -t -e -f -w -b"
+ opts_long=" --help --version --uri --prompt --human --terse --enum \
+ --force --wait --header --script "
+ opts_cmds="list job-status capabilities plugin-info volume-create \
+ volume-delete, volume-resize volume-replicate \
+ volume-replicate-range volume-replicate-range-block-size \
+ volume-dependants volume-dependants-rm volume-access-group \
+ volume-mask volume-unmask access-group-create \
+ access-group-delete access-group-add access-group-remove \
+ volume-enable volume-disable iscsi-chap fs-create fs-delete \
+ fs-resize fs-export fs-unexport fs-clone fs-snap-create \
+ fs-snap-delete fs-snap-restore fs-dependants fs-dependants-rm \
+ file-clone ls lp lv ld la lf lt c p vc vd vr vm vi ve vi ac \
+ aa ar ad vri"
+
+ list_args="--type"
+ list_type_args="volumes pools fs snapshots exports nfs_client_auth \
+ access_groups systems disks plugins target_ports"
+
+ opts_filter="--sys --pool --vol --disk --ag --fs --nfs"
+
+ cap_args="--sys"
+ volume_create_args="--name --size --pool"
+ volume_delete_args="--vol --force" # Should force be here, to easy to tab
through?"
+ volume_resize_args="--vol --size --force" # Should force be here, to easy
to tab through?"
+
+ volume_replicate_args="--vol --name --rep-type"
+ # Hmmm, this looks like a bug with CLI, should support lower and upper case?
+ volume_rep_types="CLONE COPY MIRROR_ASYNC MIRROR_SYNC"
+
+ volume_replicate_range_args="--src-vol --dst-vol --rep-type --src-start \
+ --dst-start --count --force" # Force ?
+
+ volume_replication_range_bs="--sys"
+ volume_dependants="--vol"
+
+ volume_access_group_args="--vol"
+ volume_masking_args="--vol --ag"
+
+ access_group_create_args="--name --init --sys"
+ access_group_delete_args="--ag"
+
+ access_group_add_remove_args="--ag --init"
+
+ volume_enable_disable_args="--vol"
+
+ volume_raidinfo_args="--vol"
+
+ iscsi_chap_args="--in-user --in-pass --out-user --out-pass"
+
+ fs_create_args="--name --size --pool"
+ fs_delete_args="--fs --force" # Force ?
+ fs_resize_args="--fs --size --force" # Force ?
+ fs_export_args="--fs --exportpath --anonuid --auth-type --root-host --ro-host
--rw-host"
+ fs_unexport_args="--export"
+ fs_clone_args="--src-fs --dst-name"
+ fs_snap_create_args="--name --fs"
+ fs_snap_delete_args="--snap --fs"
+ fs_snap_restore_args="--snap --fs --file --fileas --force"
+ fs_dependants_args="--fs"
+ file_clone_args="--fs --src --dst --backing-snapshot"
+
+ # These operations can potentially be slow and cause hangs depending on plugin and
configuration
+ if [[ ${NO_VALUE_LOOKUP} -ne 0 ]] ; then
+
+ # Check if we have somthing present that we can help the user with
+ case "${prev}" in
+ --sys)
+ # Is there a better way todo this?
+ local items=`lsmcli list --type systems -t${sep} | awk -F ${sep}
'{print $1}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ ;;
+ --pool)
+ # Is there a better way todo this?
+ local items=`lsmcli list --type pools -t${sep} | awk -F ${sep}
'{print $1}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ ;;
+ --vol|--src-vol|--dst-vol)
+ # Is there a better way todo this?
+ local items=`lsmcli list --type volumes -t${sep} | awk -F ${sep}
'{print $1}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ ;;
+ --disk)
+ # Is there a better way todo this?
+ local items=`lsmcli list --type disks -t${sep} | awk -F ${sep}
'{print $1}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ ;;
+ --ag)
+ # Is there a better way todo this?
+ local items=`lsmcli list --type access_groups -t${sep} | awk -F ${sep}
'{print $1}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ ;;
+ --init)
+ arg_index "--ag"
+ i=$?
+ # We have an access group present on the command line so filter the
intiators to it
+ if [[ ${i} -ne 255 ]]; then
+ # It would be better if we filtered the result with the access group
+ # if it's present on the command line already.
+ local items=`lsmcli list --type access_groups -t${sep} --ag
${COMP_WORDS[${i}+1]} | awk -F ${sep} '{print $3}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ else
+ local items=`lsmcli list --type access_groups -t${sep} | awk -F
${sep} '{print $3}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ fi
+ ;;
+ --nfs-export)
+ # Is there a better way todo this?
+ local items=`lsmcli list --type exports -t${sep} | awk -F ${sep}
'{print $1}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ ;;
+ --tgt)
+ # Is there a better way todo this?
+ local items=`lsmcli list --type target_ports -t${sep} | awk -F ${sep}
'{print $1}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ ;;
+ --fs|--src-fs)
+ local items=`lsmcli list --type fs -t${sep} | awk -F ${sep} '{print
$1}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ ;;
+ --export)
+ local items=`lsmcli list --type exports -t${sep} | awk -F ${sep}
'{print $1}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ ;;
+ --snap)
+ arg_index "--fs"
+ i=$?
+ # We have an access group present on the command line so filter the
snapshots to it
+ if [[ ${i} -ne 255 ]]; then
+ local items=`lsmcli list --type snapshots \
+ --fs ${COMP_WORDS[${i}+1]} -t${sep} | awk -F ${sep} '{print
$1}'`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ else
+ COMPREPLY=( $(compgen -W "" -- ${cur}) )
+ return 0
+ fi
+ ;;
+ --auth-type)
+ local items=`lsmcli list --type nfs_client_auth -t ' '`
+ COMPREPLY=( $(compgen -W "${items}" -- ${cur}) )
+ return 0
+ ;;
+ *)
+ ;;
+ esac
+ fi
+
+ # Cases where we don't have to worry about look-up time
+ case "${prev}" in
+ --type)
+ COMPREPLY=( $(compgen -W "${list_type_args}" -- ${cur}) )
+ return 0
+ ;;
+ --size|--count|--src-start|--dst-start|--name|--in-user|--in-pass|\
+ --out-user|--out-pass|--exportpath|--anonuid|--root-host|--ro-host|\
+ --rw-host|--dest-name|--file|--fileas|--src|--dst)
+ # These we cannot lookup, so don't offer any values
+ COMPREPLY=( $(compgen -W "" -- ${cur}) )
+ return 0
+ ;;
+ --rep-type)
+ COMPREPLY=( $(compgen -W "${volume_rep_types}" -- ${cur}) )
+ return 0
+ ;;
+ snapshots)
+ # Specific listing case where you need a fs too
+ if [[ ${COMP_WORDS[COMP_CWORD-2]} == '--type' && \
+ ${COMP_WORDS[COMP_CWORD-3]} == 'list' ]] ; then
+ COMPREPLY=( $(compgen -W "--fs" -- ${cur}) )
+ return 0
+ fi
+ ;;
+ *)
+ esac
+
+ case "${COMP_WORDS[1]}" in
+ job-status)
+ possible_args "--job"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ list)
+ possible_args ${list_args}
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-create|vc)
+ possible_args "${volume_create_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-delete|vd)
+ possible_args "${volume_delete_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-raid-info|vri)
+ possible_args "${volume_raidinfo_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-resize|vr)
+ possible_args "${volume_resize_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-replicate)
+ possible_args "${volume_replicate_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-replicate-range)
+ possible_args "${volume_replicate_range_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-replicate-range-block-size)
+ possible_args "${volume_replication_range_bs}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-dependants|volume-dependants-rm)
+ possible_args "${volume_dependants}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-access-group)
+ possible_args "${volume_access_group_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-mask|volume-unmask|vm|vu)
+ possible_args "${volume_masking_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ access-group-create|ac)
+ possible_args "${access_group_create_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ access-group-delete|ad)
+ possible_args "${access_group_delete_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ access-group-add|access-group-remove|aa|ar)
+ possible_args "${access_group_add_remove_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ volume-enable|volume-disable|ve|vi)
+ possible_args "${volume_enable_disable_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ iscsi-chap)
+ possible_args "${iscsi_chap_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ fs-create)
+ possible_args "${fs_create_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ fs-delete)
+ possible_args "${fs_delete_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ fs-resize)
+ possible_args "${fs_resize_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ fs-export)
+ possible_args "${fs_export_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ fs-unexport)
+ possible_args "${fs_unexport_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ fs-clone)
+ possible_args "${fs_clone_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ fs-snap-create)
+ possible_args "${fs_snap_create_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ fs-snap-delete)
+ possible_args "${fs_snap_delete_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ fs-snap-restore)
+ possible_args "${fs_snap_restore_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ fs-dependants|fs-dependants-rm)
+ possible_args "${fs_dependants_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ file-clone)
+ possible_args "${file_clone_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ capabilities|c)
+ possible_args "${cap_args}"
+ COMPREPLY=( $(compgen -W "${potential_args}" -- ${cur}) )
+ return 0
+ ;;
+ *)
+ ;;
+ esac
+
+ # Handle the case where we are starting out with nothing
+ if [[ ${prev} == 'lsmcli' ]] ; then
+ if [[ ${cur} == --* ]] ; then
+ COMPREPLY=( $(compgen -W "${opts_long}" -- ${cur}) )
+ return 0
+ fi
+
+ if [[ ${cur} == -* ]] ; then
+ COMPREPLY=( $(compgen -W "${opts_short}${opts_long}" -- ${cur}) )
+ return 0
+ fi
+
+ if [[ ${cur} == * ]] ; then
+ COMPREPLY=( $(compgen -W "${opts_short}${opts_long}${opts_cmds}"
-- ${cur}) )
+ return 0
+ fi
+ fi
+}
+complete -F _lsm lsmcli
--
1.8.3.1