docker-mailserver/target/scripts/helpers/log.sh

120 lines
2.8 KiB
Bash
Raw Normal View History

#! /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
}
scripts: refactoring & miscellaneous small changes (#2499) * `update-check.sh` now uses the new log * refactored `setup-stack.sh` The changes are: 1. Replaced `""` wiht `''` where possible (reasoning: Bash is very implicit and I'd like to use `''` where possible to indicate no variables are expanded here) 2. `> /file` -> `>/file` according to our style guide 3. Some log adjustments for messages where I deemed it appropriate 4. Then, an error message from a Dovecot setup was also prevented (by adding a check whether the directory is present before a `: >...` command would create a file in this directory). These are all small, miscellaneous changes that I wanted to combine into one commit and ultimately one PR because I see no point in opening a PR for every small change here. I hope this is fine. * added a small `sleep` to the `_shutdown` function This ensure the last log message is actually logged before Supervisor logs the message that it received a SIGTERM. This makes reading the log easier because now the causal relationship is shown (we are terminating Supervisor, and not someone else and we're just logging it). I forgot to replace `""` with `''` in `update-check.sh`, so I included it here because this is the last commit before PR review. * re-add exit on successful update (only) * re-added date information to update-check log messages * added `_log_with_date` function The new function will log a message with a proper timestamp. This is all handled in `log.sh`, we therefore not need to source other files too. This will be used in the future by `check-for-changes.sh` as well :) Co-authored-by: Casper <casperklein@users.noreply.github.com> Co-authored-by: Brennan Kinney <5098581+polarathene@users.noreply.github.com>
2022-03-26 10:17:08 +01:00
function _log_with_date { _log "${1}" "$(date '+%Y-%m-%d %H:%M:%S') ${2}" ; }