diff --git a/install_opendkim.sh b/install_opendkim.sh index 24308da..ec6eaba 100755 --- a/install_opendkim.sh +++ b/install_opendkim.sh @@ -13,6 +13,9 @@ echo -e "\n \033[32mStart Installation of OpenDKIM..\033[m" #conf_file="${_src_base_dir}/conf/install_opendkim.conf" log_file="$(mktemp)" +tmp_main_cf_file="$(mktemp)" + +main_cf_file="/etc/postfix/main.cf" backup_date="$(date +%Y-%m-%d-%H%M)" @@ -27,6 +30,8 @@ postfix_spool_dir="/var/spool/postfix" opendkim_socket_dir="${postfix_spool_dir}/opendkim" opendkim_socket_file="${opendkim_socket_dir}/opendkim.sock" +opendkim_socket_string="local:/opendkim/opendkim.sock" + postfix_needs_restart=false opendkim_needs_restart=false @@ -87,6 +92,82 @@ echo_skipped() { echo -e "\033[80G[ \033[37mskipped\033[m ]" } +# Funktion stellt sicher, dass in /etc/postfix/main.cf +# - smtpd_milters +# - non_smtpd_milters +# den Wert "local:/opendkim/opendkim.sock" enthalten. +# +# Logik: +# 1) Existiert eine aktive Zeile (nicht auskommentiert)? → anpassen +# 2) Sonst: existiert eine auskommentierte Zeile? → ersetzen (entkommentieren) +# 3) Sonst: Variable am Ende der Datei hinzufügen +# + +ensure_dkim_var() { + local var="$1" + + awk -v var="$var" -v dkim="$opendkim_socket_string" ' + # trim helper + function trim(s) { + sub("^[[:space:]]+", "", s) + sub("[[:space:]]+$", "", s) + return s + } + + # Normalisiert aktive Werte: + # - wenn leer -> nur dkim + # - wenn dkim schon enthalten -> unverändert + # - sonst -> dkim vorne dran + function normalize_active_value(v) { + v = trim(v) + if (v == "") return dkim + if (index(v, dkim) > 0) return v + return dkim "," v + } + + BEGIN { found_active=0; replaced_commented=0 } + + ################################################################# + # FALL 1: Aktive Zeile (nicht auskommentiert): var = + ################################################################# + $0 ~ "^[[:space:]]*"var"[[:space:]]*=" && $0 !~ "^[[:space:]]*#" { + found_active=1 + + # rechten Teil extrahieren (nach "=") + v=$0 + sub("^[[:space:]]*"var"[[:space:]]*=[[:space:]]*", "", v) + + print var" = " normalize_active_value(v) + next + } + + ################################################################# + # FALL 2: Auskommentierte Zeile: # var = + # Sonderregel: ersetzen mit NUR DKIM, unabhängig vom Kommentarinhalt + ################################################################# + $0 ~ "^[[:space:]]*#[[:space:]]*"var"[[:space:]]*=" \ + && found_active==0 && replaced_commented==0 { + replaced_commented=1 + print var" = " dkim + next + } + + ################################################################# + # Sonst: Zeile unverändert ausgeben + ################################################################# + { print } + + ################################################################# + # FALL 3: Variable nicht vorhanden → am Ende hinzufügen + ################################################################# + END { + if (found_active==0 && replaced_commented==0) { + print var" = " dkim + } + } + ' "$main_cf_file" +} + # ------------- # - Some pre-installation tasks @@ -610,19 +691,15 @@ else fi echononl " Activate processing of e-mail through the OpenDKIM daemon.." -if grep -q -E "milter_default_action\s*=\s*accept" /etc/postfix/main.cf ; then - echo_skipped - warn "Postfix (main.cf) seems already be configured for milters" - echononl " Delete previosly saved Postfix configuration.." - rm /etc/postfix/main.cf.$backup_date 2> $log_file - if [[ $? -eq 0 ]] ; then - echo_ok - else - echo_failed - error "$(cat $log_file)" - fi +if grep -q -E "^\s*#?\s*smtpd_milters\s*=" ${main_cf_file} ; then + + ensure_dkim_var "smtpd_milters" > "${tmp_main_cf_file}" + cp "${tmp_main_cf_file}" "${main_cf_file}" + else - cat <> /etc/postfix/main.cf 2> $log_file + + cat <> /etc/postfix/main.cf 2> $log_file + # ======= Milter configuration ======= @@ -642,8 +719,19 @@ milter_protocol = 6 # 'smtpd_milters = local:/opendkim/opendkim.sock' here and add to # localhost:10025 section in master.cf: 'smtpd_milters=' # -#smtpd_milters = local:/opendkim/opendkim.sock -smtpd_milters = local:/opendkim/opendkim.sock +smtpd_milters = $opendkim_socket_string +EOF + +fi + +if grep -q -E "^\s*#?\s*non_smtpd_milters\s*=" ${main_cf_file} ; then + + ensure_dkim_var "non_smtpd_milters" > "${tmp_main_cf_file}" + cp "${tmp_main_cf_file}" "${main_cf_file}" + +else + + cat <> /etc/postfix/main.cf 2> $log_file # Was sind non_smtpd_milters? # @@ -673,15 +761,15 @@ smtpd_milters = local:/opendkim/opendkim.sock # # # DKIM soll auch die ausgehenden Mails signieren, die nicht über smtpd daemon versendet werden. -non_smtpd_milters = local:/opendkim/opendkim.sock +non_smtpd_milters = $opendkim_socket_string EOF - postfix_needs_restart=true - if [[ $? -eq 0 ]] ; then - echo_ok - else - echo_failed - error "$(cat $log_file)" - fi +fi +postfix_needs_restart=true +if [[ $? -eq 0 ]] ; then + echo_ok +else + echo_failed + error "$(cat $log_file)" fi @@ -816,4 +904,5 @@ fi echo "" rm -f "$log_file" +rm -f "$tmp_main_cf_file" exit 0