|
@@ -18,6 +18,7 @@
|
|
|
# be done outside of a function
|
|
|
declare -a HADOOP_SUBCMD_USAGE
|
|
|
declare -a HADOOP_OPTION_USAGE
|
|
|
+declare -a HADOOP_SUBCMD_USAGE_TYPES
|
|
|
|
|
|
## @description Print a message to stderr
|
|
|
## @audience public
|
|
@@ -115,6 +116,89 @@ function hadoop_verify_entry
|
|
|
[[ ${!1} =~ \ ${2}\ ]]
|
|
|
}
|
|
|
|
|
|
+## @description Check if an array has a given value
|
|
|
+## @audience public
|
|
|
+## @stability stable
|
|
|
+## @replaceable yes
|
|
|
+## @param element
|
|
|
+## @param array
|
|
|
+## @returns 0 = yes
|
|
|
+## @returns 1 = no
|
|
|
+function hadoop_array_contains
|
|
|
+{
|
|
|
+ declare element=$1
|
|
|
+ shift
|
|
|
+ declare val
|
|
|
+
|
|
|
+ if [[ "$#" -eq 0 ]]; then
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ for val in "${@}"; do
|
|
|
+ if [[ "${val}" == "${element}" ]]; then
|
|
|
+ return 0
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ return 1
|
|
|
+}
|
|
|
+
|
|
|
+## @description Add the `appendstring` if `checkstring` is not
|
|
|
+## @description present in the given array
|
|
|
+## @audience public
|
|
|
+## @stability stable
|
|
|
+## @replaceable yes
|
|
|
+## @param envvar
|
|
|
+## @param appendstring
|
|
|
+function hadoop_add_array_param
|
|
|
+{
|
|
|
+ declare arrname=$1
|
|
|
+ declare add=$2
|
|
|
+
|
|
|
+ declare arrref="${arrname}[@]"
|
|
|
+ declare array=("${!arrref}")
|
|
|
+
|
|
|
+ if ! hadoop_array_contains "${add}" "${array[@]}"; then
|
|
|
+ #shellcheck disable=SC1083,SC2086
|
|
|
+ eval ${arrname}=\(\"\${array[@]}\" \"${add}\" \)
|
|
|
+ hadoop_debug "$1 accepted $2"
|
|
|
+ else
|
|
|
+ hadoop_debug "$1 declined $2"
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+## @description Sort an array (must not contain regexps)
|
|
|
+## @description present in the given array
|
|
|
+## @audience public
|
|
|
+## @stability stable
|
|
|
+## @replaceable yes
|
|
|
+## @param arrayvar
|
|
|
+function hadoop_sort_array
|
|
|
+{
|
|
|
+ declare arrname=$1
|
|
|
+ declare arrref="${arrname}[@]"
|
|
|
+ declare array=("${!arrref}")
|
|
|
+ declare oifs
|
|
|
+
|
|
|
+ declare globstatus
|
|
|
+ declare -a sa
|
|
|
+
|
|
|
+ globstatus=$(set -o | grep noglob | awk '{print $NF}')
|
|
|
+
|
|
|
+ set -f
|
|
|
+ oifs=${IFS}
|
|
|
+
|
|
|
+ # shellcheck disable=SC2034
|
|
|
+ IFS=$'\n' sa=($(sort <<<"${array[*]}"))
|
|
|
+
|
|
|
+ # shellcheck disable=SC1083
|
|
|
+ eval "${arrname}"=\(\"\${sa[@]}\"\)
|
|
|
+
|
|
|
+ IFS=${oifs}
|
|
|
+ if [[ "${globstatus}" = off ]]; then
|
|
|
+ set +f
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
## @description Check if we are running with priv
|
|
|
## @description by default, this implementation looks for
|
|
|
## @description EUID=0. For OSes that have true priv
|
|
@@ -220,13 +304,20 @@ function hadoop_uservar_su
|
|
|
## @stability evolving
|
|
|
## @replaceable no
|
|
|
## @param subcommand
|
|
|
+## @param subcommandtype
|
|
|
## @param subcommanddesc
|
|
|
function hadoop_add_subcommand
|
|
|
{
|
|
|
- local subcmd=$1
|
|
|
- local text=$2
|
|
|
+ declare subcmd=$1
|
|
|
+ declare subtype=$2
|
|
|
+ declare text=$3
|
|
|
+
|
|
|
+ hadoop_debug "${subcmd} as a ${subtype}"
|
|
|
|
|
|
- HADOOP_SUBCMD_USAGE[${HADOOP_SUBCMD_USAGE_COUNTER}]="${subcmd}@${text}"
|
|
|
+ hadoop_add_array_param HADOOP_SUBCMD_USAGE_TYPES "${subtype}"
|
|
|
+
|
|
|
+ # done in this order so that sort works later
|
|
|
+ HADOOP_SUBCMD_USAGE[${HADOOP_SUBCMD_USAGE_COUNTER}]="${subcmd}@${subtype}@${text}"
|
|
|
((HADOOP_SUBCMD_USAGE_COUNTER=HADOOP_SUBCMD_USAGE_COUNTER+1))
|
|
|
}
|
|
|
|
|
@@ -253,17 +344,22 @@ function hadoop_reset_usage
|
|
|
{
|
|
|
HADOOP_SUBCMD_USAGE=()
|
|
|
HADOOP_OPTION_USAGE=()
|
|
|
+ HADOOP_SUBCMD_USAGE_TYPES=()
|
|
|
HADOOP_SUBCMD_USAGE_COUNTER=0
|
|
|
HADOOP_OPTION_USAGE_COUNTER=0
|
|
|
}
|
|
|
|
|
|
## @description Print a screen-size aware two-column output
|
|
|
+## @description if reqtype is not null, only print those requested
|
|
|
## @audience private
|
|
|
## @stability evolving
|
|
|
## @replaceable no
|
|
|
+## @param reqtype
|
|
|
## @param array
|
|
|
function hadoop_generic_columnprinter
|
|
|
{
|
|
|
+ declare reqtype=$1
|
|
|
+ shift
|
|
|
declare -a input=("$@")
|
|
|
declare -i i=0
|
|
|
declare -i counter=0
|
|
@@ -275,11 +371,13 @@ function hadoop_generic_columnprinter
|
|
|
declare -i foldsize
|
|
|
declare -a tmpa
|
|
|
declare numcols
|
|
|
+ declare brup
|
|
|
|
|
|
if [[ -n "${COLUMNS}" ]]; then
|
|
|
numcols=${COLUMNS}
|
|
|
else
|
|
|
numcols=$(tput cols) 2>/dev/null
|
|
|
+ COLUMNS=${numcols}
|
|
|
fi
|
|
|
|
|
|
if [[ -z "${numcols}"
|
|
@@ -292,7 +390,8 @@ function hadoop_generic_columnprinter
|
|
|
while read -r line; do
|
|
|
tmpa[${counter}]=${line}
|
|
|
((counter=counter+1))
|
|
|
- option=$(echo "${line}" | cut -f1 -d'@')
|
|
|
+ IFS='@' read -ra brup <<< "${line}"
|
|
|
+ option="${brup[0]}"
|
|
|
if [[ ${#option} -gt ${maxoptsize} ]]; then
|
|
|
maxoptsize=${#option}
|
|
|
fi
|
|
@@ -304,8 +403,22 @@ function hadoop_generic_columnprinter
|
|
|
((foldsize=numcols-maxoptsize))
|
|
|
|
|
|
until [[ $i -eq ${#tmpa[@]} ]]; do
|
|
|
- option=$(echo "${tmpa[$i]}" | cut -f1 -d'@')
|
|
|
- giventext=$(echo "${tmpa[$i]}" | cut -f2 -d'@')
|
|
|
+ IFS='@' read -ra brup <<< "${tmpa[$i]}"
|
|
|
+
|
|
|
+ option="${brup[0]}"
|
|
|
+ cmdtype="${brup[1]}"
|
|
|
+ giventext="${brup[2]}"
|
|
|
+
|
|
|
+ if [[ -n "${reqtype}" ]]; then
|
|
|
+ if [[ "${cmdtype}" != "${reqtype}" ]]; then
|
|
|
+ ((i=i+1))
|
|
|
+ continue
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [[ -z "${giventext}" ]]; then
|
|
|
+ giventext=${cmdtype}
|
|
|
+ fi
|
|
|
|
|
|
while read -r line; do
|
|
|
printf "%-${maxoptsize}s %-s\n" "${option}" "${line}"
|
|
@@ -325,13 +438,14 @@ function hadoop_generic_columnprinter
|
|
|
## @param [text to use in place of SUBCOMMAND]
|
|
|
function hadoop_generate_usage
|
|
|
{
|
|
|
- local cmd=$1
|
|
|
- local takesclass=$2
|
|
|
- local subcmdtext=${3:-"SUBCOMMAND"}
|
|
|
- local haveoptions
|
|
|
- local optstring
|
|
|
- local havesubs
|
|
|
- local subcmdstring
|
|
|
+ declare cmd=$1
|
|
|
+ declare takesclass=$2
|
|
|
+ declare subcmdtext=${3:-"SUBCOMMAND"}
|
|
|
+ declare haveoptions
|
|
|
+ declare optstring
|
|
|
+ declare havesubs
|
|
|
+ declare subcmdstring
|
|
|
+ declare cmdtype
|
|
|
|
|
|
cmd=${cmd##*/}
|
|
|
|
|
@@ -358,7 +472,7 @@ function hadoop_generate_usage
|
|
|
echo " OPTIONS is none or any of:"
|
|
|
echo ""
|
|
|
|
|
|
- hadoop_generic_columnprinter "${HADOOP_OPTION_USAGE[@]}"
|
|
|
+ hadoop_generic_columnprinter "" "${HADOOP_OPTION_USAGE[@]}"
|
|
|
fi
|
|
|
|
|
|
if [[ "${havesubs}" = true ]]; then
|
|
@@ -366,7 +480,18 @@ function hadoop_generate_usage
|
|
|
echo " ${subcmdtext} is one of:"
|
|
|
echo ""
|
|
|
|
|
|
- hadoop_generic_columnprinter "${HADOOP_SUBCMD_USAGE[@]}"
|
|
|
+ if [[ "${#HADOOP_SUBCMD_USAGE_TYPES[@]}" -gt 0 ]]; then
|
|
|
+
|
|
|
+ hadoop_sort_array HADOOP_SUBCMD_USAGE_TYPES
|
|
|
+ for subtype in "${HADOOP_SUBCMD_USAGE_TYPES[@]}"; do
|
|
|
+ #shellcheck disable=SC2086
|
|
|
+ cmdtype="$(tr '[:lower:]' '[:upper:]' <<< ${subtype:0:1})${subtype:1}"
|
|
|
+ printf "\n %s Commands:\n\n" "${cmdtype}"
|
|
|
+ hadoop_generic_columnprinter "${subtype}" "${HADOOP_SUBCMD_USAGE[@]}"
|
|
|
+ done
|
|
|
+ else
|
|
|
+ hadoop_generic_columnprinter "" "${HADOOP_SUBCMD_USAGE[@]}"
|
|
|
+ fi
|
|
|
echo ""
|
|
|
echo "${subcmdtext} may print help when invoked w/o parameters or with -h."
|
|
|
fi
|