From 0270997761a1e1da88d3e738175f4178df765988 Mon Sep 17 00:00:00 2001 From: Christoph Date: Sun, 20 Jul 2025 13:19:59 +0200 Subject: [PATCH] install_update_dovecot-2.4.sh: another imtermediate update --- install_update_dovecot-2.4.sh | 915 ++++++++++++++++++++++++++++------ 1 file changed, 752 insertions(+), 163 deletions(-) diff --git a/install_update_dovecot-2.4.sh b/install_update_dovecot-2.4.sh index d76cb36..8aad9d3 100755 --- a/install_update_dovecot-2.4.sh +++ b/install_update_dovecot-2.4.sh @@ -274,6 +274,98 @@ replace_or_append_code_block() { return 0 } +replace_or_append_code_block_if_keyval() { + local block_name="$1" + local new_block="$2" + local file="$3" + local required_key="$4" + local required_value="$5" + + if [[ -z "$block_name" || -z "$new_block" || -z "$file" || -z "$required_key" || -z "$required_value" ]]; then + echo "Fehler: Parameter fehlen." + echo "Verwendung: replace_or_append_code_block_if_keyval \"blockname\" \"neuer_block\" \"/pfad/zur/datei\" \"key\" \"value\"" + return 1 + fi + + if [[ ! -f "$file" ]]; then + echo "Fehler: Datei '$file' existiert nicht." + return 2 + fi + + local tmp_file + tmp_file=$(mktemp) + + local block_found=0 + + awk -v block_name="$block_name" -v new_block="$new_block" \ + -v req_key="$required_key" -v req_val="$required_value" ' + function count_char(str, c) { + n = 0 + for (i = 1; i <= length(str); i++) { + if (substr(str, i, 1) == c) n++ + } + return n + } + + { + if (!in_block && $0 ~ "^\\s*" block_name "\\s*\\{") { + in_block = 1 + brace_depth = count_char($0, "{") - count_char($0, "}") + block_buffer = $0 "\n" + found_keyval = 0 + next + } + + if (in_block) { + brace_depth += count_char($0, "{") - count_char($0, "}") + block_buffer = block_buffer $0 "\n" + + # Prüfe nur im obersten Block-Level auf key = value + if (brace_depth == 1 && $0 ~ "^\\s*" req_key "\\s*=\\s*" req_val "\\s*$") { + found_keyval = 1 + } + + if (brace_depth <= 0) { + in_block = 0 + if (found_keyval) { + print new_block + block_found = 1 + } else { + printf "%s", block_buffer + } + next + } + + next + } + + print + } + + END { + if (!block_found) { + print new_block > "/dev/stderr" + exit 3 + } + } + ' "$file" 1>"$tmp_file" 2>_new_block_to_append.tmp + + result=$? + + if [[ $result -eq 3 ]]; then + echo "" >> "$file" + cat _new_block_to_append.tmp >> "$file" + rm -f "$tmp_file" _new_block_to_append.tmp + echo "Block '$block_name' wurde nicht gefunden oder Bedingung nicht erfüllt – daher am Ende angehängt." + return 0 + fi + + mv "$tmp_file" "$file" + rm -f _new_block_to_append.tmp + echo "Block '$block_name' wurde ersetzt (Bedingung erfüllt)." + return 0 +} + delete_code_block() { local block_name="$1" local file="$2" @@ -1197,6 +1289,98 @@ replace_or_append_code_block() { return 0 } +replace_or_append_code_block_if_keyval() { + local block_name="$1" + local new_block="$2" + local file="$3" + local required_key="$4" + local required_value="$5" + + if [[ -z "$block_name" || -z "$new_block" || -z "$file" || -z "$required_key" || -z "$required_value" ]]; then + echo "Fehler: Parameter fehlen." + echo "Verwendung: replace_or_append_code_block_if_keyval \"blockname\" \"neuer_block\" \"/pfad/zur/datei\" \"key\" \"value\"" + return 1 + fi + + if [[ ! -f "$file" ]]; then + echo "Fehler: Datei '$file' existiert nicht." + return 2 + fi + + local tmp_file + tmp_file=$(mktemp) + + local block_found=0 + + awk -v block_name="$block_name" -v new_block="$new_block" \ + -v req_key="$required_key" -v req_val="$required_value" ' + function count_char(str, c) { + n = 0 + for (i = 1; i <= length(str); i++) { + if (substr(str, i, 1) == c) n++ + } + return n + } + + { + if (!in_block && $0 ~ "^\\s*" block_name "\\s*\\{") { + in_block = 1 + brace_depth = count_char($0, "{") - count_char($0, "}") + block_buffer = $0 "\n" + found_keyval = 0 + next + } + + if (in_block) { + brace_depth += count_char($0, "{") - count_char($0, "}") + block_buffer = block_buffer $0 "\n" + + # Prüfe nur im obersten Block-Level auf key = value + if (brace_depth == 1 && $0 ~ "^\\s*" req_key "\\s*=\\s*" req_val "\\s*$") { + found_keyval = 1 + } + + if (brace_depth <= 0) { + in_block = 0 + if (found_keyval) { + print new_block + block_found = 1 + } else { + printf "%s", block_buffer + } + next + } + + next + } + + print + } + + END { + if (!block_found) { + print new_block > "/dev/stderr" + exit 3 + } + } + ' "$file" 1>"$tmp_file" 2>_new_block_to_append.tmp + + result=$? + + if [[ $result -eq 3 ]]; then + echo "" >> "$file" + cat _new_block_to_append.tmp >> "$file" + rm -f "$tmp_file" _new_block_to_append.tmp + echo "Block '$block_name' wurde nicht gefunden oder Bedingung nicht erfüllt – daher am Ende angehängt." + return 0 + fi + + mv "$tmp_file" "$file" + rm -f _new_block_to_append.tmp + echo "Block '$block_name' wurde ersetzt (Bedingung erfüllt)." + return 0 +} + delete_code_block() { local block_name="$1" local file="$2" @@ -2436,7 +2620,7 @@ if [[ $dovecot_major_version -gt 2 ]] \ _key_file="/etc/dovecot/ssl/mailserver.key" _ssl_server_block="ssl_server {\n ssl = yes\n cert_file = ${_cert_file}\n key_file = ${_key_file}\n}" - echononl " Adjust file dovecot.conf.." + echononl " Adjust file $(basename "${_conf_file}").." # # Delete all lines that begin with !include and also delete the following line # # if it is empty or contains only whitespace. @@ -4364,15 +4548,268 @@ blank_line # modify /usr/local/dovecot/etc/dovecot/conf.d/10-mail.conf # # +_failed=false +_conf_file="/usr/local/dovecot-${_version}/etc/dovecot/conf.d/10-mail.conf" if [[ $dovecot_major_version -gt 2 ]] \ || ( [[ $dovecot_major_version -eq 2 ]] && [[ $dovecot_minor_version -gt 3 ]] ); then - echononl " Modify file '10-mail.conf'.." - echo -e "$rc_not_yet_implemented" + echononl " Modify file '$(basename "${_conf_file}")'.." + + # modify /usr/local/dovecot/etc/dovecot/conf.d/10-mail.conf + # + # namespace inbox { + # type = private + # separator = / + # hidden = no + # list = yes + # subscriptions = yes + # } + + if grep -qE "^\s*namespace\s+inbox\s*{" "${_conf_file}"; then + + read -r -d '' NEW_BLOCK <