Files
proxmox-scripts/utils/common.sh
2023-12-04 09:58:06 +02:00

216 lines
4.2 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Color variables
CLR_RD="\033[0;31m"
CLR_RDB="\033[1;31m"
CLR_GN="\033[0;32m"
CLR_GNB="\033[1;32m"
CLR_YL="\033[0;33m"
CLR_YLB="\033[1;33m"
CLR_CY="\033[0;36m"
CLR_CYB="\033[1;36m"
CLR="\033[m"
# Helper variables
__OUTPUT=/dev/null
__SPIN_PID=0
__LAST_LINE=0
__STEP_NAME=""
__STEP_BUSY=""
__STEP_DONE=""
os_name() {
printf $(uname)
}
os_distro() {
printf $(awk -F'=' '/^ID=/{ print $NF }' /etc/os-release)
}
os_fetch() {
wget -t 3 -T 30 -q $@
}
os_ip() {
printf $(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)
}
pms_bootstrap() {
set -Eeuo pipefail
stty -echo
printf "\033[?25l"
if [ "$EPS_CT_INSTALL" = false ]; then
TEMP_DIR=$(mktemp -d)
pushd $TEMP_DIR >$__OUTPUT
fi
}
pms_header() {
log "info" "${EPS_APP_NAME:-Unknown}\n"
}
pms_check_os() {
local _os=${1:-$EPS_OS_NAME}
local _distro=${2:-$EPS_OS_DISTRO}
local _supported=false
if [ "$_os" != "Linux" ]; then
log "error" "OS not supported: ${CLR_CYB}$_os${CLR}" "" 1
fi
for d in $EPS_SUPPORTED_DISTROS; do
if [ "$d" = "$_distro" ]; then
_supported=true
break;
fi
done
if [ "$_supported" = false ]; then
log "error" "OS distribution not supported: ${CLR_CYB}$_distro${CLR}\n\n${CLR_YL}Supported distributions:${CLR} ${CLR_YLB}$EPS_SUPPORTED_DISTROS${CLR}" "" 1
fi
}
pms_settraps() {
trap '__trap_error ${BASH_LINENO:-"$LINENO"} ${FUNCNAME:-"$BASH_COMMAND"}' ERR
trap __trap_interrupt SIGHUP SIGINT SIGQUIT
trap __trap_exit EXIT
}
pms_cleartraps() {
trap - EXIT ERR SIGHUP SIGINT SIGQUIT
}
log () {
local type=${1:-"info"}
local message="$2"
local clear=${3:-}
local exit_code=${4:-0}
case $type in
info)
printf "${clear}${CLR_CYB} ${CLR_CY}${message}${CLR}\n";;
success)
printf "${clear}${CLR_GNB}${CLR_GN}${message}${CLR}\n";;
warn)
printf "${clear}${CLR_YLB}! ${CLR_YL}${message}${CLR}\n";;
error)
printf "${clear}${CLR_RDB}${CLR_RD}${message}${CLR}\n";;
*)
;;
esac
if [ $exit_code -gt 0 ]; then
exit $exit_code
fi
}
step_start() {
step_end
__STEP_NAME=${1:-}
__STEP_BUSY=${2:-${__STEP_BUSY}}
__STEP_DONE=${3:-${__STEP_DONE}}
__LAST_LINE=$(__row)
log "info" "${__STEP_BUSY} ${__STEP_NAME}"
__start_spinner &
__SPIN_PID=$!
disown
}
step_end() {
__stop_spinner
if [ -z "$__STEP_NAME" ]; then
return 0
fi
local message=${1:-}
local exit_code=${2:-0}
if [ -z "$message" ]; then
message="$__STEP_NAME $__STEP_DONE"
if [ "$exit_code" -gt 0 ]; then
message="$__STEP_NAME not $__STEP_DONE"
fi
fi
if [ "$exit_code" -gt 0 ]; then
log "error" "$message ${CLR_RD}" $(__clr)
exit $exit_code
else
log "success" "$message ${CLR_GN}" $(__clr)
fi
__STEP_NAME=""
__LAST_LINE=0
}
__start_spinner() {
local marks="⁘ ⁙"
while :; do
for mark in $marks; do
printf "$(__clr '1K')${CLR_CYB}$mark${CLR}\n"
sleep 0.35
done
done
}
__stop_spinner() {
if [ "$__SPIN_PID" -gt 0 ]; then
kill $__SPIN_PID &>$__OUTPUT
__SPIN_PID=0
fi
}
__row() {
local COL
local ROW
IFS=';' read -sdR -p $'\E[6n' ROW COL
printf "${ROW#*[}"
}
__clr() {
__LAST_LINE=${__LAST_LINE:-$(__row)}
local end=${1:-"0J"}
local row=${2:-$__LAST_LINE}
local col=${3:-1}
printf "\r\033[${row};${col}H\033[${end}"
}
__trap_exit() {
trap - ERR
__stop_spinner &>$__OUTPUT
if [ "$EPS_CT_INSTALL" = false ]; then
popd &>$__OUTPUT
rm -rf $TEMP_DIR &>$__OUTPUT
fi
printf "\033[?25h"
stty sane
}
__trap_interrupt() {
local exit_code="$?"
trap - ERR
stty sane
printf "\033[?25h"
[ -z "$__STEP_NAME" ] || log "warn" "$__STEP_NAME ${CLR_YL}not completely $__STEP_DONE${CLR}" $(__clr)
printf "\n${CLR_YLB}[TERMINATED]${CLR} process terminated with exit code ${CLR_YLB}$exit_code${CLR}\n"
}
__trap_error() {
local exit_code="$?"
local line_number="$1"
local command="$2"
local row=$(__row)
[ -z "$__STEP_NAME" ] || log "error" "$__STEP_NAME ${CLR_RD}not $__STEP_DONE" $(__clr 'K')
printf "$(__clr '' $row)\n${CLR_RDB}[ERROR]${CLR} on line ${CLR_RDB}$line_number${CLR} with exit code ${CLR_RDB}$exit_code${CLR} while executing command ${CLR_YLB}$command${CLR}\n"
}