#! /bin/bash # shellcheck disable=SC2291 # Quote repeated spaces to avoid them collapsing into one. # shellcheck disable=SC2034 # VAR appears unused. # Color variables for global usage RED=$(echo -ne '\e[0;31m') GREEN=$(echo -ne '\e[0;32m') YELLOW=$(echo -ne '\e[0;33m') BLUE=$(echo -ne '\e[0;34m') PURPLE=$(echo -ne '\e[0;35m') CYAN=$(echo -ne '\e[0;36m') WHITE=$(echo -ne '\e[0;37m') # Light/bold variants LRED=$(echo -ne '\e[1;31m') LGREEN=$(echo -ne '\e[1;32m') LYELLOW=$(echo -ne '\e[1;33m') LBLUE=$(echo -ne '\e[1;34m') LPURPLE=$(echo -ne '\e[1;35m') LCYAN=$(echo -ne '\e[1;36m') LWHITE=$(echo -ne '\e[1;37m') ORANGE=$(echo -ne '\e[38;5;214m') RESET=$(echo -ne '\e[0m') # ### DMS Logging Functionality # # This function provides the logging for scripts used by DMS. # It adheres to the convention for log levels. # Valid values (in order of increasing verbosity) are: `error`, # `warn`, `info`, `debug` and `trace`. The default log level # is `info`. # # #### Arguments # # $1 :: the log level to log the message with # $2 :: the message # # #### Panics # # If the first argument is not set or invalid, an error # message is logged. Likewise when the second argument # is missing. Both failures will return with exit code '1'. function _log { if [[ -z ${1+set} ]] then echo "Call to '_log' is missing a valid log level" >&2 return 1 fi if [[ -z ${2+set} ]] then echo "Call to '_log' is missing a message to log" >&2 return 1 fi local MESSAGE LEVEL_AS_INT LOG_LEVEL_FALLBACK MESSAGE="${RESET}[" if [[ -e /etc/dms-settings ]] then LOG_LEVEL_FALLBACK=$(grep "^LOG_LEVEL=" /etc/dms-settings | cut -d '=' -f 2) LOG_LEVEL_FALLBACK="${LOG_LEVEL_FALLBACK:1:-1}" else LOG_LEVEL_FALLBACK='info' fi case "${LOG_LEVEL:-${LOG_LEVEL_FALLBACK}}" in ( 'trace' ) LEVEL_AS_INT=5 ;; ( 'debug' ) LEVEL_AS_INT=4 ;; ( 'warn' ) LEVEL_AS_INT=2 ;; ( 'error' ) LEVEL_AS_INT=1 ;; ( * ) LEVEL_AS_INT=3 ;; esac case "${1}" in ( 'trace' ) [[ ${LEVEL_AS_INT} -ge 5 ]] || return 0 MESSAGE+=" ${LGRAY}TRACE " ;; ( 'debug' ) [[ ${LEVEL_AS_INT} -ge 4 ]] || return 0 MESSAGE+=" ${LBLUE}DEBUG " ;; ( 'info' ) [[ ${LEVEL_AS_INT} -ge 3 ]] || return 0 MESSAGE+=" ${BLUE}INF " ;; ( 'warn' ) [[ ${LEVEL_AS_INT} -ge 2 ]] || return 0 MESSAGE+=" ${LYELLOW}WARNING " ;; ( 'error' ) [[ ${LEVEL_AS_INT} -ge 1 ]] || return 0 MESSAGE+=" ${RED}ERROR " ;; ( * ) echo "Call to '_log' with invalid log level argument '${1}'" >&2 return 1 ;; esac MESSAGE+="${RESET}] ${2}" if [[ ${1} =~ ^(warn|error)$ ]] then echo -e "${MESSAGE}" >&2 else echo -e "${MESSAGE}" fi } function _log_with_date { _log "${1}" "$(date '+%Y-%m-%d %H:%M:%S') ${2}" ; }