Files
talos-cluster/scripts/lib/common.sh

108 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
# Log messages with different levels
function log() {
local level="${1:-info}"
shift
# Define log levels with their priorities
local -A level_priority=(
[debug]=1
[info]=2
[warn]=3
[error]=4
)
# Get the current log level's priority
local current_priority=${level_priority[$level]:-2} # Default to "info" priority
# Get the configured log level from the environment, default to "info"
local configured_level=${LOG_LEVEL:-info}
local configured_priority=${level_priority[$configured_level]:-2}
# Skip log messages below the configured log level
if ((current_priority < configured_priority)); then
return
fi
# Define log colors
local -A colors=(
[debug]="\033[1m\033[38;5;63m" # Blue
[info]="\033[1m\033[38;5;87m" # Cyan
[warn]="\033[1m\033[38;5;192m" # Yellow
[error]="\033[1m\033[38;5;198m" # Red
)
# Fallback to "info" if the color for the given level is not defined
local color="${colors[$level]:-${colors[info]}}"
local msg="$1"
shift
# Prepare additional data
local data=
if [[ $# -gt 0 ]]; then
for item in "$@"; do
if [[ "${item}" == *=* ]]; then
data+="\033[1m\033[38;5;236m${item%%=*}=\033[0m\"${item#*=}\" "
else
data+="${item} "
fi
done
fi
# Determine output stream based on log level
local output_stream="/dev/stdout"
if [[ "$level" == "error" ]]; then
output_stream="/dev/stderr"
fi
# Print the log message
printf "%s %b%s%b %s %b\n" "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \
"${color}" "${level^^}" "\033[0m" "${msg}" "${data}" >"${output_stream}"
# Exit if the log level is error
if [[ "$level" == "error" ]]; then
exit 1
fi
}
# Check if required environment variables are set
function check_env() {
local envs=("${@}")
local missing=()
local values=()
for env in "${envs[@]}"; do
if [[ -z "${!env-}" ]]; then
missing+=("${env}")
else
values+=("${env}=${!env}")
fi
done
if [ ${#missing[@]} -ne 0 ]; then
log error "Missing required env variables" "envs=${missing[*]}"
fi
log debug "Env variables are set" "envs=${values[*]}"
}
# Check if required CLI tools are installed
function check_cli() {
local deps=("${@}")
local missing=()
for dep in "${deps[@]}"; do
if ! command -v "${dep}" &>/dev/null; then
missing+=("${dep}")
fi
done
if [ ${#missing[@]} -ne 0 ]; then
log error "Missing required deps" "deps=${missing[*]}"
fi
log debug "Deps are installed" "deps=${deps[*]}"
}