scripts: update log format (#4035)

Co-authored-by: Brennan Kinney <5098581+polarathene@users.noreply.github.com>
This commit is contained in:
Georg Lauterbach 2024-05-29 02:28:51 +02:00 committed by GitHub
parent 95d965fb76
commit f8b3f40276
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 40 additions and 36 deletions

View File

@ -43,6 +43,8 @@ The most noteworthy change of this release is the update of the container's base
- **Removed support for Solr integration:** ([#4025](https://github.com/docker-mailserver/docker-mailserver/pull/4025)) - **Removed support for Solr integration:** ([#4025](https://github.com/docker-mailserver/docker-mailserver/pull/4025))
- This was a community contributed feature for FTS (Full Text Search), the docs advise using an image that has not been maintained for over 2 years and lacks ARM64 support. Based on user engagement over the years this feature has very niche value to continue to support, thus is being removed. - This was a community contributed feature for FTS (Full Text Search), the docs advise using an image that has not been maintained for over 2 years and lacks ARM64 support. Based on user engagement over the years this feature has very niche value to continue to support, thus is being removed.
- If you use Solr, support can be restored if you're willing to contribute docs for the feature that resolves the concerns raised - If you use Solr, support can be restored if you're willing to contribute docs for the feature that resolves the concerns raised
- **Log**:
- The format of DMS specific logs (_from our scripts, not running services_) has been changed. The new format is `<RFC 3339 TIMESTAMP> <LOG LEVEL> <LOG EVENT SRC>: <MESSAGE>` ([#4035](https://github.com/docker-mailserver/docker-mailserver/pull/4035))
- **rsyslog:** - **rsyslog:**
- Debian 12 adjusted the `rsyslog` configuration for the default file template from `RSYSLOG_TraditionalFileFormat` to `RSYSLOG_FileFormat` (_upstream default since 2012_). This change may affect you if you have any monitoring / analysis of log output (_eg: `mail.log` / `docker logs`_). - Debian 12 adjusted the `rsyslog` configuration for the default file template from `RSYSLOG_TraditionalFileFormat` to `RSYSLOG_FileFormat` (_upstream default since 2012_). This change may affect you if you have any monitoring / analysis of log output (_eg: `mail.log` / `docker logs`_).
- The two formats are roughly equivalent to [RFC 3164](https://www.rfc-editor.org/rfc/rfc3164)) and [RFC 5424](https://datatracker.ietf.org/doc/html/rfc5424#section-1) respectively. - The two formats are roughly equivalent to [RFC 3164](https://www.rfc-editor.org/rfc/rfc3164)) and [RFC 5424](https://datatracker.ietf.org/doc/html/rfc5424#section-1) respectively.

View File

@ -7,7 +7,7 @@
# shellcheck source=./helpers/index.sh # shellcheck source=./helpers/index.sh
source /usr/local/bin/helpers/index.sh source /usr/local/bin/helpers/index.sh
_log_with_date 'debug' 'Starting changedetector' _log 'debug' 'Starting changedetector'
# ATTENTION: Do not remove! # ATTENTION: Do not remove!
# This script requires some environment variables to be properly set. # This script requires some environment variables to be properly set.
@ -30,9 +30,9 @@ if [[ ! -f ${CHKSUM_FILE} ]]; then
_exit_with_error "'${CHKSUM_FILE}' is missing" 0 _exit_with_error "'${CHKSUM_FILE}' is missing" 0
fi fi
_log_with_date 'trace' "Using postmaster address '${POSTMASTER_ADDRESS}'" _log 'trace' "Using postmaster address '${POSTMASTER_ADDRESS}'"
_log_with_date 'debug' "Changedetector is ready" _log 'debug' "Changedetector is ready"
function _check_for_changes() { function _check_for_changes() {
# get chksum and check it, no need to lock config yet # get chksum and check it, no need to lock config yet
@ -44,7 +44,7 @@ function _check_for_changes() {
# 1 files differ # 1 files differ
# 2 inaccessible or missing argument # 2 inaccessible or missing argument
if [[ ${?} -eq 1 ]]; then if [[ ${?} -eq 1 ]]; then
_log_with_date 'info' 'Change detected' _log 'info' 'Change detected'
_create_lock # Shared config safety lock _create_lock # Shared config safety lock
local CHANGED local CHANGED
@ -52,7 +52,7 @@ function _check_for_changes() {
_handle_changes _handle_changes
_remove_lock _remove_lock
_log_with_date 'debug' 'Completed handling of detected change' _log 'debug' 'Completed handling of detected change'
# mark changes as applied # mark changes as applied
mv "${CHKSUM_FILE}.new" "${CHKSUM_FILE}" mv "${CHKSUM_FILE}.new" "${CHKSUM_FILE}"
@ -64,7 +64,7 @@ function _handle_changes() {
local VHOST_UPDATED=0 local VHOST_UPDATED=0
# These two configs are the source for /etc/postfix/vhost (managed mail domains) # These two configs are the source for /etc/postfix/vhost (managed mail domains)
if [[ ${CHANGED} =~ ${DMS_DIR}/postfix-(accounts|virtual).cf ]]; then if [[ ${CHANGED} =~ ${DMS_DIR}/postfix-(accounts|virtual).cf ]]; then
_log_with_date 'trace' 'Regenerating vhosts (Postfix)' _log 'trace' 'Regenerating vhosts (Postfix)'
# Regenerate via `helpers/postfix.sh`: # Regenerate via `helpers/postfix.sh`:
_create_postfix_vhost _create_postfix_vhost
@ -75,7 +75,7 @@ function _handle_changes() {
_postfix_dovecot_changes _postfix_dovecot_changes
_rspamd_changes _rspamd_changes
_log_with_date 'debug' 'Reloading services due to detected changes' _log 'debug' 'Reloading services due to detected changes'
[[ ${ENABLE_AMAVIS} -eq 1 ]] && _reload_amavis [[ ${ENABLE_AMAVIS} -eq 1 ]] && _reload_amavis
_reload_postfix _reload_postfix
@ -119,7 +119,7 @@ function _postfix_dovecot_changes() {
|| [[ ${CHANGED} =~ ${DMS_DIR}/dovecot-quotas.cf ]] \ || [[ ${CHANGED} =~ ${DMS_DIR}/dovecot-quotas.cf ]] \
|| [[ ${CHANGED} =~ ${DMS_DIR}/dovecot-masters.cf ]] || [[ ${CHANGED} =~ ${DMS_DIR}/dovecot-masters.cf ]]
then then
_log_with_date 'trace' 'Regenerating accounts (Dovecot + Postfix)' _log 'trace' 'Regenerating accounts (Dovecot + Postfix)'
[[ ${SMTP_ONLY} -ne 1 ]] && _create_accounts [[ ${SMTP_ONLY} -ne 1 ]] && _create_accounts
fi fi
@ -131,7 +131,7 @@ function _postfix_dovecot_changes() {
|| [[ ${CHANGED} =~ ${DMS_DIR}/postfix-relaymap.cf ]] \ || [[ ${CHANGED} =~ ${DMS_DIR}/postfix-relaymap.cf ]] \
|| [[ ${CHANGED} =~ ${DMS_DIR}/postfix-sasl-password.cf ]] || [[ ${CHANGED} =~ ${DMS_DIR}/postfix-sasl-password.cf ]]
then then
_log_with_date 'trace' 'Regenerating relay config (Postfix)' _log 'trace' 'Regenerating relay config (Postfix)'
_process_relayhost_configs _process_relayhost_configs
fi fi
@ -159,14 +159,14 @@ function _ssl_changes() {
|| [[ ${CHANGED} =~ ${SSL_ALT_CERT_PATH:-${REGEX_NEVER_MATCH}} ]] \ || [[ ${CHANGED} =~ ${SSL_ALT_CERT_PATH:-${REGEX_NEVER_MATCH}} ]] \
|| [[ ${CHANGED} =~ ${SSL_ALT_KEY_PATH:-${REGEX_NEVER_MATCH}} ]] || [[ ${CHANGED} =~ ${SSL_ALT_KEY_PATH:-${REGEX_NEVER_MATCH}} ]]
then then
_log_with_date 'debug' 'Manual certificates have changed - extracting certificates' _log 'debug' 'Manual certificates have changed - extracting certificates'
_setup_ssl _setup_ssl
fi fi
# `acme.json` is only relevant to Traefik, and is where it stores the certificates it manages. # `acme.json` is only relevant to Traefik, and is where it stores the certificates it manages.
# When a change is detected it's assumed to be a possible cert renewal that needs to be # When a change is detected it's assumed to be a possible cert renewal that needs to be
# extracted for `docker-mailserver` services to adjust to. # extracted for `docker-mailserver` services to adjust to.
elif [[ ${CHANGED} =~ /etc/letsencrypt/acme.json ]]; then elif [[ ${CHANGED} =~ /etc/letsencrypt/acme.json ]]; then
_log_with_date 'debug' "'/etc/letsencrypt/acme.json' has changed - extracting certificates" _log 'debug' "'/etc/letsencrypt/acme.json' has changed - extracting certificates"
_setup_ssl _setup_ssl
# Prevent an unnecessary change detection from the newly extracted cert files by updating their hashes in advance: # Prevent an unnecessary change detection from the newly extracted cert files by updating their hashes in advance:
@ -188,23 +188,23 @@ function _rspamd_changes() {
# "${RSPAMD_DMS_D}/override.d" # "${RSPAMD_DMS_D}/override.d"
if [[ ${CHANGED} =~ ${RSPAMD_DMS_OVERRIDE_D}/.* ]]; then if [[ ${CHANGED} =~ ${RSPAMD_DMS_OVERRIDE_D}/.* ]]; then
_log_with_date 'trace' 'Rspamd - Copying configuration overrides' _log 'trace' 'Rspamd - Copying configuration overrides'
rm "${RSPAMD_OVERRIDE_D}"/* rm "${RSPAMD_OVERRIDE_D}"/*
cp "${RSPAMD_DMS_OVERRIDE_D}"/* "${RSPAMD_OVERRIDE_D}" cp "${RSPAMD_DMS_OVERRIDE_D}"/* "${RSPAMD_OVERRIDE_D}"
fi fi
# "${RSPAMD_DMS_D}/custom-commands.conf" # "${RSPAMD_DMS_D}/custom-commands.conf"
if [[ ${CHANGED} =~ ${RSPAMD_DMS_CUSTOM_COMMANDS_F} ]]; then if [[ ${CHANGED} =~ ${RSPAMD_DMS_CUSTOM_COMMANDS_F} ]]; then
_log_with_date 'trace' 'Rspamd - Generating new configuration from custom commands' _log 'trace' 'Rspamd - Generating new configuration from custom commands'
_rspamd_handle_user_modules_adjustments _rspamd_handle_user_modules_adjustments
fi fi
# "${RSPAMD_DMS_D}/dkim" # "${RSPAMD_DMS_D}/dkim"
if [[ ${CHANGED} =~ ${RSPAMD_DMS_DKIM_D} ]]; then if [[ ${CHANGED} =~ ${RSPAMD_DMS_DKIM_D} ]]; then
_log_with_date 'trace' 'Rspamd - DKIM files updated' _log 'trace' 'Rspamd - DKIM files updated'
fi fi
_log_with_date 'debug' 'Rspamd configuration has changed - restarting service' _log 'debug' 'Rspamd configuration has changed - restarting service'
supervisorctl restart rspamd supervisorctl restart rspamd
fi fi
} }

View File

@ -53,8 +53,7 @@ function _log() {
return 1 return 1
fi fi
local LEVEL_AS_INT local LEVEL_AS_INT LOG_COLOR LOG_LEVEL_NAME MESSAGE
local MESSAGE="${RESET}["
case "$(_get_log_level_or_default)" in case "$(_get_log_level_or_default)" in
( 'trace' ) LEVEL_AS_INT=5 ;; ( 'trace' ) LEVEL_AS_INT=5 ;;
@ -67,27 +66,35 @@ function _log() {
case "${1}" in case "${1}" in
( 'trace' ) ( 'trace' )
[[ ${LEVEL_AS_INT} -ge 5 ]] || return 0 [[ ${LEVEL_AS_INT} -ge 5 ]] || return 0
MESSAGE+=" ${CYAN}TRACE " LOG_COLOR='CYAN'
LOG_LEVEL_NAME='TRACE'
;; ;;
( 'debug' ) ( 'debug' )
[[ ${LEVEL_AS_INT} -ge 4 ]] || return 0 [[ ${LEVEL_AS_INT} -ge 4 ]] || return 0
MESSAGE+=" ${PURPLE}DEBUG " LOG_COLOR='PURPLE'
LOG_LEVEL_NAME='DEBUG'
;; ;;
( 'info' ) ( 'info' )
[[ ${LEVEL_AS_INT} -ge 3 ]] || return 0 [[ ${LEVEL_AS_INT} -ge 3 ]] || return 0
MESSAGE+=" ${BLUE}INF " LOG_COLOR='BLUE'
# the whitespace is intentional (for alignment purposes)
LOG_LEVEL_NAME='INFO '
;; ;;
( 'warn' ) ( 'warn' )
[[ ${LEVEL_AS_INT} -ge 2 ]] || return 0 [[ ${LEVEL_AS_INT} -ge 2 ]] || return 0
MESSAGE+=" ${LYELLOW}WARNING " LOG_COLOR='LYELLOW'
# the whitespace is intentional (for alignment purposes)
LOG_LEVEL_NAME='WARN '
;; ;;
( 'error' ) ( 'error' )
[[ ${LEVEL_AS_INT} -ge 1 ]] || return 0 [[ ${LEVEL_AS_INT} -ge 1 ]] || return 0
MESSAGE+=" ${LRED}ERROR " ;; LOG_COLOR='LRED'
LOG_LEVEL_NAME='ERROR'
;;
( * ) ( * )
_log 'error' "Call to '_log' with invalid log level argument '${1}'" _log 'error' "Call to '_log' with invalid log level argument '${1}'"
@ -95,7 +102,7 @@ function _log() {
;; ;;
esac esac
MESSAGE+="${RESET}] ${2}" MESSAGE="$(date --rfc-3339='seconds') ${!LOG_COLOR}${LOG_LEVEL_NAME}${RESET} $(basename "${0}"): ${2}"
if [[ ${1} =~ ^(warn|error)$ ]]; then if [[ ${1} =~ ^(warn|error)$ ]]; then
echo -e "${MESSAGE}" >&2 echo -e "${MESSAGE}" >&2
@ -104,11 +111,6 @@ function _log() {
fi fi
} }
# Like `_log` but adds a timestamp in front of the message.
function _log_with_date() {
_log "${1}" "$(date '+%Y-%m-%d %H:%M:%S') ${2}"
}
# Get the value of the environment variable LOG_LEVEL if # Get the value of the environment variable LOG_LEVEL if
# it is set. Otherwise, try to query the common environment # it is set. Otherwise, try to query the common environment
# variables file. If this does not yield a value either, # variables file. If this does not yield a value either,

View File

@ -10,8 +10,8 @@ CHANGELOG_URL='https://github.com/docker-mailserver/docker-mailserver/blob/maste
# check for correct syntax # check for correct syntax
# number + suffix. suffix must be 's' for seconds, 'm' for minutes, 'h' for hours or 'd' for days. # number + suffix. suffix must be 's' for seconds, 'm' for minutes, 'h' for hours or 'd' for days.
if [[ ! ${UPDATE_CHECK_INTERVAL} =~ ^[0-9]+[smhd]{1}$ ]]; then if [[ ! ${UPDATE_CHECK_INTERVAL} =~ ^[0-9]+[smhd]{1}$ ]]; then
_log_with_date 'warn' "Invalid 'UPDATE_CHECK_INTERVAL' value '${UPDATE_CHECK_INTERVAL}'" _log 'warn' "Invalid 'UPDATE_CHECK_INTERVAL' value '${UPDATE_CHECK_INTERVAL}'"
_log_with_date 'warn' 'Falling back to daily update checks' _log 'warn' 'Falling back to daily update checks'
UPDATE_CHECK_INTERVAL='1d' UPDATE_CHECK_INTERVAL='1d'
fi fi
@ -22,7 +22,7 @@ while true; do
# did we get a valid response? # did we get a valid response?
if [[ ${LATEST} =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then if [[ ${LATEST} =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
_log_with_date 'debug' 'Remote version information fetched' _log 'debug' 'Remote version information fetched'
# compare versions # compare versions
if dpkg --compare-versions "${VERSION}" lt "${LATEST}"; then if dpkg --compare-versions "${VERSION}" lt "${LATEST}"; then
@ -38,15 +38,15 @@ Latest version: ${LATEST}
Changelog: ${CHANGELOG_URL}#END Changelog: ${CHANGELOG_URL}#END
EOF EOF
_log_with_date 'info' "Update available [ ${VERSION} --> ${LATEST} ]" _log 'info' "Update available [ ${VERSION} --> ${LATEST} ]"
# only notify once # only notify once
echo "${MAIL}" | mail -s "Mailserver update available! [ ${VERSION} --> ${LATEST} ]" "${POSTMASTER_ADDRESS}" && exit 0 echo "${MAIL}" | mail -s "Mailserver update available! [ ${VERSION} --> ${LATEST} ]" "${POSTMASTER_ADDRESS}" && exit 0
else else
_log_with_date 'info' 'No update available' _log 'info' 'No update available'
fi fi
else else
_log_with_date 'warn' 'Update check failed' _log 'warn' 'Update check failed'
fi fi
# check again in 'UPDATE_CHECK_INTERVAL' time # check again in 'UPDATE_CHECK_INTERVAL' time

View File

@ -44,7 +44,7 @@ function teardown_file() { _default_teardown ; }
run docker logs "${CONTAINER_NAME}" run docker logs "${CONTAINER_NAME}"
assert_success assert_success
for SERVICE in 'Amavis/SA' 'OpenDKIM' 'OpenDMARC' 'policyd-spf'; do for SERVICE in 'Amavis/SA' 'OpenDKIM' 'OpenDMARC' 'policyd-spf'; do
assert_output --regexp ".*WARNING.*Running ${SERVICE} & Rspamd at the same time is discouraged" assert_output --regexp ".*WARN.*Running ${SERVICE} & Rspamd at the same time is discouraged"
done done
} }

View File

@ -50,7 +50,7 @@ function teardown() { _default_teardown ; }
# Should emit a warning: # Should emit a warning:
run docker logs "${CONTAINER_NAME}" run docker logs "${CONTAINER_NAME}"
assert_success assert_success
assert_output --partial '[ WARNING ] Using self-generated dhparams is considered insecure - unless you know what you are doing, please remove' assert_output --partial 'Using self-generated dhparams is considered insecure - unless you know what you are doing, please remove'
} }
# Ensures the docker image services (Postfix and Dovecot) have the expected DH files: # Ensures the docker image services (Postfix and Dovecot) have the expected DH files: