From 43a122fe18abec5d7607e9659a890780930bb1ce Mon Sep 17 00:00:00 2001 From: Casper Date: Sun, 27 Aug 2023 23:40:24 +0200 Subject: [PATCH] scripts: add wrapper to update Postfix configuration safely (follow up) (#3503) --- target/scripts/helpers/postfix.sh | 26 +++++++++++++++----------- target/scripts/helpers/utils.sh | 1 + 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/target/scripts/helpers/postfix.sh b/target/scripts/helpers/postfix.sh index b376dce9..5fa4fa83 100644 --- a/target/scripts/helpers/postfix.sh +++ b/target/scripts/helpers/postfix.sh @@ -92,39 +92,43 @@ function _vhost_ldap_support() { # /etc/aliases is handled by `alias.sh` and uses `postalias` to update the Postfix alias database. No need for `postmap`. # http://www.postfix.org/postalias.1.html -# Add an key with an value to Postfix's main configuration file +# Add a key with a value to Postfix's main configuration file # or update an existing key. An already existing key can be updated # by either appending to the existing value (default) or by prepending. # # @param ${1} = key name in Postfix's main configuration file # @param ${2} = new value (appended or prepended) -# @param ${3} = "append" (default) or "prepend" [OPTIONAL] +# @param ${3} = action "append" (default) or "prepend" [OPTIONAL] function _add_to_or_update_postfix_main() { local KEY=${1:?Key name is required} local NEW_VALUE=${2:?New value is required} local ACTION=${3:-append} + local CURRENT_VALUE - # If entry does not exist, add it - otherwise update with ACTION: - if ! grep -q -E "^${KEY}" /etc/postfix/main.cf; then + # Get current value from /etc/postfix/main.cf + _adjust_mtime_for_postfix_maincf + CURRENT_VALUE=$(postconf -h "${KEY}" 2>/dev/null) + + # If key does not exist or value is empty, add it - otherwise update with ACTION: + if [[ -z ${CURRENT_VALUE} ]]; then postconf "${KEY} = ${NEW_VALUE}" else - KEY=$(_escape_for_sed "${KEY}") - NEW_VALUE=$(_escape_for_sed "${NEW_VALUE}") - local SED_STRING + # If $NEW_VALUE is already present --> nothing to do, skip. + if [[ " ${CURRENT_VALUE} " == *" ${NEW_VALUE} "* ]]; then + return 0 + fi case "${ACTION}" in ('append') - SED_STRING="/${NEW_VALUE}/! s|^(${KEY} *=.*)|\1 ${NEW_VALUE}|g" + postconf "${KEY} = ${CURRENT_VALUE} ${NEW_VALUE}" ;; ('prepend') - SED_STRING="/${NEW_VALUE}/! s|^(${KEY}) *= *(.*)|\1 = ${NEW_VALUE} \2|g" + postconf "${KEY} = ${NEW_VALUE} ${CURRENT_VALUE}" ;; (*) _log 'error' "Action '${3}' in _add_to_or_update_postfix_main is unknown" return 1 ;; esac - - sed -i -E "${SED_STRING}" /etc/postfix/main.cf fi } diff --git a/target/scripts/helpers/utils.sh b/target/scripts/helpers/utils.sh index 02d29cc9..c74fd7e8 100644 --- a/target/scripts/helpers/utils.sh +++ b/target/scripts/helpers/utils.sh @@ -4,6 +4,7 @@ function _escape() { echo "${1//./\\.}" } +# TODO: Not in use currently. Maybe in the future: https://github.com/docker-mailserver/docker-mailserver/pull/3484/files#r1299410851 # Replaces a string so that it can be used inside # `sed` safely. #