Update with kubeselect script
Signed-off-by: Manuel Vergara <manuel@vergaracarmona.es>
This commit is contained in:
parent
a7d65c08ec
commit
ae3b6ebd4e
@ -1,7 +1,6 @@
|
||||
<p style="background:#fff; color:red; font-size:2em;font-weight:bold; text-align:center; border: 5px blue solid">NO PUBLICAR</p>
|
||||
|
||||
# configuraciones Ubuntu
|
||||
|
||||
- Configuración Wifi en HP Pavilion. [WifiES.txt](doc/WifiES.txt)
|
||||
- Script actualizaciones de paquetes apt y snap. [actualizar.sh](src/actualizar.sh)
|
||||
- Script de pruebas de red. [pruebaRed.sh](src/pruebaRed.sh)
|
||||
- Script para seleccionar contextos con kubectl [kubeselect](src/kubeselect)
|
||||
|
348
src/kubeselect
Executable file
348
src/kubeselect
Executable file
@ -0,0 +1,348 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# This small helper util helps select an available Kubernetes context using the arrow keys
|
||||
# using one simple command rather than two seperate kubectl commands to first show, then select contexts.
|
||||
# It uses the mapfile shim found here: https://github.com/dosentmatter/bash-mapfile-shim
|
||||
# which itself uses upvars by Freddy Vulto: http://fvue.nl/wiki/Bash:_Passing_variables_by_reference
|
||||
# These are only needed for bash versions < 4, otherwise the native functions are used.
|
||||
#
|
||||
# Finally, the small select_option function was found on this Stackoverflow thread:
|
||||
# https://stackoverflow.com/questions/11426529/reading-output-of-a-command-into-an-array-in-bash
|
||||
# I included all source code I used as is.
|
||||
|
||||
# Bash: Passing variables by reference
|
||||
# Copyright (C) 2010 Freddy Vulto
|
||||
# Version: upvars-0.9.dev
|
||||
# See: http://fvue.nl/wiki/Bash:_Passing_variables_by_reference
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
# Assign variable one scope above the caller
|
||||
# Usage: local "$1" && upvar $1 "value(s)"
|
||||
# Param: $1 Variable name to assign value to
|
||||
# Param: $* Value(s) to assign. If multiple values, an array is
|
||||
# assigned, otherwise a single value is assigned.
|
||||
# NOTE: For assigning multiple variables, use 'upvars'. Do NOT
|
||||
# use multiple 'upvar' calls, since one 'upvar' call might
|
||||
# reassign a variable to be used by another 'upvar' call.
|
||||
# Example:
|
||||
#
|
||||
# f() { local b; g b; echo $b; }
|
||||
# g() { local "$1" && upvar $1 bar; }
|
||||
# f # Ok: b=bar
|
||||
#
|
||||
upvar() {
|
||||
if unset -v "$1"; then # Unset & validate varname
|
||||
if (( $# == 2 )); then
|
||||
eval $1=\"\$2\" # Return single value
|
||||
else
|
||||
eval $1=\(\"\${@:2}\"\) # Return array
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Assign variables one scope above the caller
|
||||
# Usage: local varname [varname ...] &&
|
||||
# upvars [-v varname value] | [-aN varname [value ...]] ...
|
||||
# Available OPTIONS:
|
||||
# -aN Assign next N values to varname as array
|
||||
# -v Assign single value to varname
|
||||
# Return: 1 if error occurs
|
||||
# Example:
|
||||
#
|
||||
# f() { local a b; g a b; declare -p a b; }
|
||||
# g() {
|
||||
# local c=( foo bar )
|
||||
# local "$1" "$2" && upvars -v $1 A -a${#c[@]} $2 "${c[@]}"
|
||||
# }
|
||||
# f # Ok: a=A, b=(foo bar)
|
||||
#
|
||||
upvars() {
|
||||
if ! (( $# )); then
|
||||
echo "${FUNCNAME[0]}: usage: ${FUNCNAME[0]} [-v varname"\
|
||||
"value] | [-aN varname [value ...]] ..." 1>&2
|
||||
return 2
|
||||
fi
|
||||
while (( $# )); do
|
||||
case $1 in
|
||||
-a*)
|
||||
# Error checking
|
||||
[[ ${1#-a} ]] || { echo "bash: ${FUNCNAME[0]}: \`$1': missing"\
|
||||
"number specifier" 1>&2; return 1; }
|
||||
printf %d "${1#-a}" &> /dev/null || { echo "bash:"\
|
||||
"${FUNCNAME[0]}: \`$1': invalid number specifier" 1>&2
|
||||
return 1; }
|
||||
# Assign array of -aN elements
|
||||
[[ "$2" ]] && unset -v "$2" && eval $2=\(\"\${@:3:${1#-a}}\"\) &&
|
||||
shift $((${1#-a} + 2)) || { echo "bash: ${FUNCNAME[0]}:"\
|
||||
"\`$1${2+ }$2': missing argument(s)" 1>&2; return 1; }
|
||||
;;
|
||||
-v)
|
||||
# Assign single value
|
||||
[[ "$2" ]] && unset -v "$2" && eval $2=\"\$3\" &&
|
||||
shift 3 || { echo "bash: ${FUNCNAME[0]}: $1: missing"\
|
||||
"argument(s)" 1>&2; return 1; }
|
||||
;;
|
||||
--help) echo "\
|
||||
Usage: local varname [varname ...] &&
|
||||
${FUNCNAME[0]} [-v varname value] | [-aN varname [value ...]] ...
|
||||
Available OPTIONS:
|
||||
-aN VARNAME [value ...] assign next N values to varname as array
|
||||
-v VARNAME value assign single value to varname
|
||||
--help display this help and exit
|
||||
--version output version information and exit"
|
||||
return 0 ;;
|
||||
--version) echo "\
|
||||
${FUNCNAME[0]}-0.9.dev
|
||||
Copyright (C) 2010 Freddy Vulto
|
||||
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
||||
This is free software: you are free to change and redistribute it.
|
||||
There is NO WARRANTY, to the extent permitted by law."
|
||||
return 0 ;;
|
||||
*)
|
||||
echo "bash: ${FUNCNAME[0]}: $1: invalid option" 1>&2
|
||||
return 1 ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# use mapfile_function if mapfile not found
|
||||
mapfile() {
|
||||
if type -f mapfile &>/dev/null; then
|
||||
command mapfile "$@"
|
||||
else
|
||||
mapfile_function "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
# Behaves like bash 4.x mapfile.
|
||||
mapfile_function() {
|
||||
local DELIM=$'\n'
|
||||
local REMOVE_TRAILING_DELIM='false'
|
||||
local OUTPUT_ARRAY_NAME='MAPFILE'
|
||||
|
||||
local OPTIND OPTARG OPTERR
|
||||
local option
|
||||
OPTERR=0
|
||||
while getopts ':d:n:O:s:tu:C:c:' option; do
|
||||
case "$option" in
|
||||
d)
|
||||
DELIM=$OPTARG
|
||||
;;
|
||||
t)
|
||||
REMOVE_TRAILING_DELIM='true'
|
||||
;;
|
||||
:)
|
||||
echo "Option requires an argument: -$OPTARG" >&2
|
||||
return 1
|
||||
;;
|
||||
\?)
|
||||
echo "Illegal option: -$OPTARG" >&2
|
||||
return 2
|
||||
;;
|
||||
?)
|
||||
echo "Option unimplemented: -$option" >&2
|
||||
return 3
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
shift "$((OPTIND - 1))"
|
||||
|
||||
if (($# >= 1)); then
|
||||
OUTPUT_ARRAY_NAME=$1
|
||||
fi
|
||||
|
||||
local output_array=()
|
||||
local null_end='false'
|
||||
local REPLY
|
||||
if [[ -n "$DELIM" ]]; then # stops at first null when DELIM is not null
|
||||
IFS= read -r -d '' && null_end='true'
|
||||
fi
|
||||
while IFS= read -r -d "$DELIM"; do
|
||||
if [[ "$REMOVE_TRAILING_DELIM" = 'true' ]]; then
|
||||
output_array+=("$REPLY")
|
||||
else
|
||||
output_array+=("$REPLY$DELIM")
|
||||
fi
|
||||
done < <(
|
||||
if [[ -n "$DELIM" ]]; then
|
||||
echo -n "$REPLY"
|
||||
[[ "$null_end" = 'true' ]] && printf '%b' '\0'
|
||||
else
|
||||
cat
|
||||
fi
|
||||
)
|
||||
if [[ -n "$REPLY" ]] || [[ "$null_end" = 'true' ]]; then
|
||||
output_array+=("$REPLY")
|
||||
fi
|
||||
|
||||
local "$OUTPUT_ARRAY_NAME" &&
|
||||
upvars -a"${#output_array[@]}" "$OUTPUT_ARRAY_NAME" "${output_array[@]}"
|
||||
}
|
||||
|
||||
# mapfile according to word splitting rules.
|
||||
# This isn't used by the shim.
|
||||
# Empty lines aren't included in array if
|
||||
# DELIM is whitespace (space, tab, newline) or null.
|
||||
mapfile_IFS() {
|
||||
local DELIM=$'\n'
|
||||
local REMOVE_TRAILING_DELIM='false'
|
||||
local OUTPUT_ARRAY_NAME='MAPFILE'
|
||||
|
||||
local OPTIND OPTARG OPTERR
|
||||
local option
|
||||
OPTERR=0
|
||||
while getopts ':d:n:O:s:tu:C:c:' option; do
|
||||
case "$option" in
|
||||
d)
|
||||
DELIM=$OPTARG
|
||||
;;
|
||||
t)
|
||||
REMOVE_TRAILING_DELIM='true'
|
||||
;;
|
||||
:)
|
||||
echo "Option requires an argument: -$OPTARG" >&2
|
||||
return 1
|
||||
;;
|
||||
\?)
|
||||
echo "Illegal option: -$OPTARG" >&2
|
||||
return 2
|
||||
;;
|
||||
?)
|
||||
echo "Option unimplemented: -$option" >&2
|
||||
return 3
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
shift "$((OPTIND - 1))"
|
||||
|
||||
if (($# >= 1)); then
|
||||
OUTPUT_ARRAY_NAME=$1
|
||||
fi
|
||||
|
||||
local output_array=()
|
||||
local null_end='false'
|
||||
local delim_end='false'
|
||||
local REPLY
|
||||
local array_front
|
||||
local array_last
|
||||
if [[ -n "$DELIM" ]]; then
|
||||
IFS= read -r -d '' && null_end='true'
|
||||
[[ "$REPLY" = *"$DELIM" ]] && delim_end='true'
|
||||
IFS=$DELIM read -r -d '' -a 'output_array' < <(
|
||||
echo -n "$REPLY"
|
||||
[[ "$null_end" = 'true' ]] && printf '%b' '\0'
|
||||
)
|
||||
|
||||
if [[ "$REMOVE_TRAILING_DELIM" = 'false' ]]; then
|
||||
array_front=("${output_array[@]:0:${#output_array[@]} - 1}")
|
||||
array_last=${output_array[${#output_array[@]} - 1]}
|
||||
|
||||
array_front=("${array_front[@]/%/$DELIM}")
|
||||
if [[ "$delim_end" = 'true' ]]; then
|
||||
array_last+=$DELIM
|
||||
fi
|
||||
|
||||
output_array=("${array_front[@]}" "$array_last")
|
||||
fi
|
||||
else
|
||||
while IFS=$DELIM read -r -d ''; do
|
||||
# no need to append null trailing delim because vars can't hold null
|
||||
[[ -n "$REPLY" ]] && output_array+=("$REPLY")
|
||||
done
|
||||
[[ -n "$REPLY" ]] && output_array+=("$REPLY")
|
||||
fi
|
||||
|
||||
local "$OUTPUT_ARRAY_NAME" &&
|
||||
upvars -a"${#output_array[@]}" "$OUTPUT_ARRAY_NAME" "${output_array[@]}"
|
||||
}
|
||||
|
||||
|
||||
# Renders a text based list of options that can be selected by the
|
||||
# user using up, down and enter keys and returns the chosen option.
|
||||
#
|
||||
# Arguments : list of options, maximum of 256
|
||||
# "opt1" "opt2" ...
|
||||
# Return value: selected index (0 for opt1, 1 for opt2 ...)
|
||||
function select_option {
|
||||
|
||||
# little helpers for terminal print control and key input
|
||||
ESC=$( printf "\033")
|
||||
cursor_blink_on() { printf "$ESC[?25h"; }
|
||||
cursor_blink_off() { printf "$ESC[?25l"; }
|
||||
cursor_to() { printf "$ESC[$1;${2:-1}H"; }
|
||||
print_option() { printf " $1 "; }
|
||||
print_selected() { printf " $ESC[7m $1 $ESC[27m"; }
|
||||
get_cursor_row() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; }
|
||||
key_input() { read -s -n3 key 2>/dev/null >&2
|
||||
if [[ $key = $ESC[A ]]; then echo up; fi
|
||||
if [[ $key = $ESC[B ]]; then echo down; fi
|
||||
if [[ $key = "" ]]; then echo enter; fi; }
|
||||
|
||||
# initially print empty new lines (scroll down if at bottom of screen)
|
||||
for opt; do printf "\n"; done
|
||||
|
||||
# determine current screen position for overwriting the options
|
||||
local lastrow=`get_cursor_row`
|
||||
local startrow=$(($lastrow - $#))
|
||||
|
||||
# ensure cursor and input echoing back on upon a ctrl+c during read -s
|
||||
trap "cursor_blink_on; stty echo; printf '\n'; exit" 2
|
||||
cursor_blink_off
|
||||
|
||||
local selected=0
|
||||
while true; do
|
||||
# print options by overwriting the last lines
|
||||
local idx=0
|
||||
for opt; do
|
||||
cursor_to $(($startrow + $idx))
|
||||
if [ $idx -eq $selected ]; then
|
||||
print_selected "$opt"
|
||||
else
|
||||
print_option "$opt"
|
||||
fi
|
||||
((idx++))
|
||||
done
|
||||
|
||||
# user key control
|
||||
case `key_input` in
|
||||
enter) break;;
|
||||
up) ((selected--));
|
||||
if [ $selected -lt 0 ]; then selected=$(($# - 1)); fi;;
|
||||
down) ((selected++));
|
||||
if [ $selected -ge $# ]; then selected=0; fi;;
|
||||
esac
|
||||
done
|
||||
|
||||
# cursor position back to normal
|
||||
cursor_to $lastrow
|
||||
printf "\n"
|
||||
cursor_blink_on
|
||||
|
||||
return $selected
|
||||
}
|
||||
|
||||
mapfile -t available_contexts < <( kubectl config get-contexts -oname )
|
||||
|
||||
echo "Select context using up/down keys and enter to confirm:"
|
||||
echo
|
||||
|
||||
select_option "${available_contexts[@]}"
|
||||
choice=$?
|
||||
|
||||
kubectl config use-context ${available_contexts[$choice]}
|
Loading…
Reference in New Issue
Block a user