diff --git a/install_update_dovecot-2.4.sh b/install_update_dovecot-2.4.sh index 27181e1..12f3f85 100755 --- a/install_update_dovecot-2.4.sh +++ b/install_update_dovecot-2.4.sh @@ -182,7 +182,7 @@ else fi if [[ -z "$systemd_support" ]] ; then - if $SYSTEMD_EXISTS ; then + if $SYSTEMD_EXISTS ; then systemd_support=true else systemd_support=false @@ -303,7 +303,7 @@ _version_short="${_version%-*}" #clean_up 0 -# 'expire plugin'was rRemoved in version 2.3.14: This plugin is not needed. +# 'expire plugin'was rRemoved in version 2.3.14: This plugin is not needed. # Use mailbox { autoexpunge } Mailbox settings instead. # if [[ $dovecot_major_version -gt 2 ]] \ @@ -329,21 +329,29 @@ fi _log_dir=${_src_base_dir}/log-dovecot-$_version -echo "" -echo -e "\033[32m--\033[m" -echo "" -echo "Version Number of Pigeonhole to install" -echo "" -echo "" -_pigeonhole= -while [ "X$_pigeonhole" = "X" ] -do - echononl "Pigeonhole Version: " - read _pigeonhole - if [ "X$_pigeonhole" = "X" ]; then - echo -e "\n\t\033[33m\033[1mA version number is required!\033[m\n" - fi -done +if [[ $dovecot_major_version -eq 2 ]] && [[ $dovecot_minor_version -lt 4 ]] ; then + + echo "" + echo -e "\033[32m--\033[m" + echo "" + echo "Version Number of Pigeonhole to install" + echo "" + echo "" + _pigeonhole= + while [ "X$_pigeonhole" = "X" ] + do + echononl "Pigeonhole Version: " + read _pigeonhole + if [ "X$_pigeonhole" = "X" ]; then + echo -e "\n\t\033[33m\033[1mA version number is required!\033[m\n" + fi + done + +else + + _pigeonhole=${_version} + +fi echo "" @@ -360,12 +368,12 @@ if [[ -n "$_update" ]]; then echo -e "[1] Update" echo -e "\033[37m\033[1m[2] New Installation\033[m" fi - echo "" + echo "" echononl "Choose a number or press for highlighted value: " else echo -e "[1] Update" echo "[2] New Installation" - echo "" + echo "" echononl "Choose a Number: " fi update="" @@ -390,13 +398,13 @@ while [[ "$update" != "true" && "$update" != "false" ]] ; do fi ;; *) update="" - echo "" + echo "" if [[ -n "$_IS_RELAY_HOST" ]]; then echo -e "\tWrong entry! [ 1 = Update ; 2 = New Installation ] or type " else - echo -e "\tWrong entry! [ 1 = Update ; 2 = New Installation ]" + echo -e "\tWrong entry! [ 1 = Update ; 2 = New Installation ]" fi - echo "" + echo "" echononl "Reentry: " ;; esac @@ -413,7 +421,7 @@ done clear; echo "" -if $update ;then +if $update ;then echo -e "\tUpdate Dovecot................: $update" else echo -e "\tInstall Dovecot first time....: Yes" @@ -452,7 +460,7 @@ echo "" echo -e "\tCertificat base directory.....: $cert_base_dir" echo -e "\tServer certificate............: $server_cert" echo -e "\tServer key....................: $server_key" -if [[ $dovecot_major_version -ge 3 ]] \ +if [[ $dovecot_major_version -gt 2 ]] \ || ( [[ $dovecot_major_version -eq 2 ]] && [[ $dovecot_minor_version -ge 3 ]] ); then echo -e "\tDH Parameters file............: $dh_pem_file" fi @@ -476,6 +484,186 @@ echo "" echo -e "\tInstall Plugin 'expire'.......: $plugin_expire" echo "" +INSTALL_UPDATE_ENVIRONMENT_FILE="${_src_base_dir}/conf/install_update_dovecot-2.4..env" +cat < ${INSTALL_UPDATE_ENVIRONMENT_FILE} +#!/usr/bin/env bash + +EOF + +echo "_version=\"${_version}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +cat <> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +log_file="${log_file}" + +backup_date="${backup_date}" + +_backup_crontab_file="${_backup_crontab_file}" + +rc_done="${rc_done}" +rc_failed="${rc_failed}" +rc_skipped="${rc_skipped}" +rc_wait="${rc_wait}" + +clean_up() { + + + if [[ -f "\$_backup_crontab_file" ]]; then + + echononl "(Re)Install previously saved crontab from '\$_backup_crontab_file'.." + + crontab \$_backup_crontab_file >> \$log_file 2>&1 + + if [[ \$? -eq 0 ]]; then + echo -e "\$rc_done" + else + echo -e "\$rc_failed" + error "\$(cat \$log_file)" + fi + + fi + + # Perform program exit housekeeping + rm -f $log_file + blank_line + exit $1 +} + +echononl(){ + echo X\\c > /tmp/shprompt\$\$ + if [ \`wc -c /tmp/shprompt\$\$ | awk '{print \$1}'\` -eq 1 ]; then + echo -e "\$*\\c" 1>&2 + else + echo -en "\$*" 1>&2 + fi + rm /tmp/shprompt\$\$ +} + +fatal(){ + echo "" + echo -e "\t[ \033[31m\033[1mFatal\033[m ]: \033[37m\033[1m\$*\033[m" + echo "" + echo -e "\t\033[31m\033[1m Skript wird abgebrochen\033[m\033[m\n" + rm -f \$log_file + clean_up 1 +} + +error(){ + echo "" + echo -e "\t[ \033[31m\033[1mError\033[m ]: \$*" + echo "" +} + +warn(){ + echo "" + echo -e "\t[ \033[33m\033[1mWarning\033[m ]: \$*" + echo "" +} + +info(){ + echo "" + echo -e "\t[ \033[32m\033[1mInfo\033[m ]: \$*" + echo "" +} + + +blank_line() { + echo "" +} + +echo_ok() { + echo -e "\033[71G[ \033[32mok\033[m ]" +} +echo_failed(){ + echo -e "\033[71G[ \033[1;31mfailed\033[m ]" +} +echo_skipped() { + echo -e "\033[71G[ \033[33m\033[1mskipped\033[m ]" +} + +EOF + + +echo "dovecot_main_version=${dovecot_main_version}" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "dovecot_major_version=${dovecot_major_version}" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "dovecot_minor_version=${dovecot_minor_version}" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "dovecot_patch_level=${dovecot_patch_level}" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "dovecot_minor_patch_level=${dovecot_minor_patch_level}" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "_pigeonhole=\"${_pigeonhole}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "postmaster_address=\"${postmaster_address}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "systemd_support=${systemd_support}" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "_src_base_dir=\"${_src_base_dir}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "postfix_main_cf=\"${postfix_main_cf}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "hostname=\"${hostname}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "ipv4=\"${ipv4}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "ipv6"=\"${ipv6}\" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "imap_listener_adresses=\"${imap_listener_adresses}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "imaps_listener_adresses=\"${imaps_listener_adresses}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "pop_listener_adresses=\"${pop_listener_adresses}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "pops_listener_adresses=\"${pops_listener_adresses}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "xmpp_listener=${xmpp_listener}" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +if $xmpp_listener ; then + echo "xmpp_listener_addresses=\"${xmpp_listener_addresses}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + echo "xmpp_listener_port=\"${xmpp_listener_port}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +fi + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "database=\"${database}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "dbhost=\"${dbhost}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "dbname=\"${dbuser}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "dbuser=\"${dbuser}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "dbpassword=\"${dbpassword}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "PGPASSWORD=\"${dbpassword}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "MYSQL_CREDENTIALS=\"${DEFAULT_MYSQL_CREDENTIALS}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + + +echo "default_pass_scheme=\"${default_pass_scheme}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "cert_base_dir=\"${cert_base_dir}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "server_cert=\"${server_cert}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "server_key=\"${server_key}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +if [[ $dovecot_major_version -ge 3 ]] \ + || ( [[ $dovecot_major_version -eq 2 ]] && [[ $dovecot_minor_version -ge 3 ]] ); then + echo "dh_pem_file=\"${dh_pem_file}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +fi +echo "imap_cert=\"${imap_cert}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "imap_key=\"${imap_key}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "pop_cert=\"${pop_cert}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "pop_key=\"${pop_key}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "spam_folder=\"${spam_folder}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} +echo "max_userip_connections"=${max_userip_connections} >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +echo "plugin_expire=${plugin_expire}" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + +#echo "" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + if ! $update ;then if [[ "$database" = "psql" ]] || [[ "$database" = "postgres" ]]; then warn "Take care, your PostgreSQL configuration (pg_hba.conf) contains the following line:\n\n\t pg_hba.conf:\n\t \033[1mlocal all postfix trust\033[m" @@ -505,7 +693,7 @@ export MAKEFLAGS=-j$(expr `grep "^processor" /proc/cpuinfo | sort -u | wc -l` - echo "" -if $update ;then +if $update ;then _new=false; else _new=true; @@ -563,53 +751,10 @@ if $_new ; then echo "" echo "" -# echo "" -# echo "--" -# echo "" -# echo "Gib den Benutzernamen des/eines MySQL root user an.." -# echo "" -# _MYSQL_ROOT_USER=root -# MYSQL_ROOT_USER= -# while [ "X$MYSQL_ROOT_USER" = "X" ] -# do -# echononl "MySQL-User [${_MYSQL_ROOT_USER}]: " -# read MYSQL_ROOT_USER -# if [ "X$MYSQL_ROOT_USER" = "X" ]; then -# MYSQL_ROOT_USER=$_MYSQL_ROOT_USER -# fi -# done -# -# -# echo "" -# echo "--" -# echo "" -# echo "Gib ein Passwort für den root user an.." -# echo "" -# _MYSQL_ROOT_PW_1="X" -# _MYSQL_ROOT_PW_2="Y" -# while [ "$_MYSQL_ROOT_PW_1" != "$_MYSQL_ROOT_PW_2" ] -# do -# echononl "Passworteingabe: " -# read -s _MYSQL_ROOT_PW_1 -# echo -# if [ "X$_MYSQL_ROOT_PW_1" = "X" ]; then -# echo -e "\n\t\033[33m\033[1mPassworteingabe erforderlich!\033[m\n" -# continue -# fi -# echononl "Passwortwiederholung: " -# read -s _MYSQL_ROOT_PW_2 -# echo -# if [ "X$_MYSQL_ROOT_PW_2" = "X" ]; then -# echo -e "\n\t\033[33m\033[1mPasswortwiederholung erforderlich!\033[m\n" -# continue -# fi -# if [ "$_MYSQL_ROOT_PW_1" != "$_MYSQL_ROOT_PW_2" ];then -# echo -e "\n\t\033[33m\033[1mPassworteingaben sind nicht identisch!\033[m\n" -# else -# MYSQL_ROOT_PW=$_MYSQL_ROOT_PW_1 -# fi -# done -# MYSQL_CREDENTIALS="-u ${MYSQL_ROOT_USER} -p${MYSQL_ROOT_PW}" + if [[ "${MYSQL_CREDENTIALS}" != "${DEFAULT_MYSQL_CREDENTIALS}" ]] ; then + echo "MYSQL_CREDENTIALS=\"${MYSQL_CREDENTIALS}\"" >> ${INSTALL_UPDATE_ENVIRONMENT_FILE} + fi + fi fi @@ -681,7 +826,7 @@ mkdir -p $_log_dir ## ----------------- -## --- Download +## --- Download cd ${_src_base_dir} @@ -1069,7 +1214,7 @@ fi ## - if [ -d $checkdir ]; then ## - PATH=$PATH:$checkdir ## - fi -## - +## - echononl "\tAdd /usr/local/dovecot/bin to PATH variable.." if ! grep "checkdir=\"/usr/local/dovecot/bin\"" /etc/profile > /dev/null ; then perl -i -n -p -e "s#^(\s*)(export\ +PATH)#checkdir=\"/usr/local/dovecot/bin\"\nif [ -d \\\$checkdir ]; then\n PATH=\\\$PATH:\\\$checkdir\nfi\n\n\1\2#" /etc/profile @@ -1102,7 +1247,7 @@ fi cd ${_src_base_dir} echo "" -echononl "\tExtracting dovecot-${dovecot_main_version}-pigeonhole-${_pigeonhole}.tar.gz.." +echononl "\tExtracting ${dovecot_pigeonhole_archiv}.." gunzip < ${_src_base_dir}/${dovecot_pigeonhole_archiv} | tar -C ${_src_base_dir} -xf - if [ "$?" = 0 ]; then echo -e "$rc_done" @@ -1146,16 +1291,42 @@ fi ## ----------------- ## --- Configure dovecot services -_failed=false -echo "" -echo -e "\033[1mConfigure Dovecot\033[m.." +#echo "" +#echo -e "\033[1mConfigure Dovecot\033[m.." + +blank_line + ## - Copy example config files to the config directory ## - -cp -r /usr/local/dovecot-${_version}/share/doc/dovecot/example-config/* \ - /usr/local/dovecot-${_version}/etc/dovecot/ - +echononl "Copy example config files to the config directory.." +if [[ ${dovecot_major_version} -eq 2 ]] && [[ ${dovecot_minor_version} -lt 4 ]] ; then + cp -r /usr/local/dovecot-${_version}/share/doc/dovecot/example-config/* \ + /usr/local/dovecot-${_version}/etc/dovecot/ > /dev/null 2>&1 + if [ "$?" = 0 ]; then + echo -e "$rc_done" + else + echo -e "$rc_failed" + error Compiling Pigeonhole ManageSieve failed + fi +else + echo -e "$rc_skipped" +fi + +echononl "Backup main configuration file 'dovecot.conf'.." +if [[ -f "/usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf" ]] ; then + cp -a /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf \ + /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf.ORIG > /dev/null 2>&1 + if [ "$?" = 0 ]; then + echo -e "$rc_done" + else + echo -e "$rc_failed" + error Compiling Pigeonhole ManageSieve failed + fi +else + echo -e "$rc_skipped" +fi blank_line @@ -1173,49 +1344,237 @@ done [[ $OK = "yes" ]] || fatal "Abbruch durch User" +_failed=false +if [[ $dovecot_major_version -gt 2 ]] \ + || ( [[ $dovecot_major_version -eq 2 ]] && [[ $dovecot_minor_version -gt 3 ]] ); then + # - edit /usr/local/dovecot/etc/dovecot/dovecot.conf + # - + # - protocols { + # - imap = yes + # - lmtp = yes + # - pop3 = yes + # - sieve = yes + # - } + # - + # - base_dir = /run/dovecot + # - state_dir = /run/dovecot + # - + # - listen = $ipv4 $ipv6 + # - + # - mail_home = /var/vmail/%{user | domain}/%{user | username} + # - mail_path = ~/Maildir + # - mail_driver = Maildir + # - + # - shutdown_clients = no + # - + _conf_file="/usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf" + + _protocols_block="protocols {\n imap = yes\n lmtp = yes\n pop3 = yes\n sieve = yes\n}" + if [[ -n "$ipv6" ]]; then + _listen="$ipv4 $ipv6" + else + _listen="$ipv4" + fi + _base_dir="/run/dovecot" + _state_dir="/run/dovecot" + + _mail_home="/var/vmail/%{user | domain}/%{user | username}" + _mail_driver="Maildir" + _mail_path="~/Maildir" + + _shutdown_clients="no" + + echononl "\tAdjust file dovecot.conf.." + +# # Delete all lines that begin with !include and also delete the following line +# # if it is empty or contains only whitespace. +# # +# sed -i '/^!include/ { +# N +# /^\(!include.*\n[[:space:]]*\)$/d +# /^!include.*/d +# }' "${_conf_file}" || _failed=true + + # Delete all lines beginning with !include, together with all comment lines + # directly preceding it (#...) - even several in a row, and also the line + # following it if it is empty or only contains whitespace. + # + awk ' + { + zeile[NR] = $0 + typ[NR] = "keep" + if ($0 ~ /^[[:space:]]*#/) typ[NR] = "comment" + if ($0 ~ /^[[:space:]]*$/) typ[NR] = "empty" + if ($0 ~ /^[[:space:]]*!include/) typ[NR] = "include" + } + + END { + for (i = 1; i <= NR; i++) { + if (typ[i] == "include") { + # Vorherige Kommentarzeilen löschen + j = i - 1 + while (j > 0 && typ[j] == "comment") { + typ[j] = "delete" + j-- + } + # Include-Zeile löschen + typ[i] = "delete" + # Nachfolgende Leerzeile löschen (falls vorhanden) + if (typ[i+1] == "empty") { + typ[i+1] = "delete" + } + } + } + + for (i = 1; i <= NR; i++) { + if (typ[i] != "delete") print zeile[i] + } + } + ' "${_conf_file}" > "${_conf_file}.tmp" && mv "${_conf_file}.tmp" "${_conf_file}" + + if grep -qE '^\s*protocols\s*{' "${_conf_file}"; then + sed -i "/^\s*protocols\s*{/,/^}/c\ + ${_protocols_block}" ${_conf_file} || _failed=true + else + echo -e "\n${_protocols_block}" >> "${_conf_file}" || _failed=true + fi + + if grep -qE '^\s*listen\s*=' "${_conf_file}"; then + perl -i -n -p -e "s#^(\s*)\#?\ ?(listen\ ?=.*)#listen = ${_listen}#g" \ + "${_conf_file}" || _failed=true + else + echo -e "\nlisten = ${_listen}" >> "${_conf_file}" || _failed=true + fi + + if grep -qE '^\s*base_dir\s*=' "${_conf_file}"; then + perl -i -n -p -e "s#^(\s*)\#?\ ?(base_dir\ ?=.*)#base_dir = ${_base_dir}#g" \ + "${_conf_file}" || _failed=true + else + echo -e "\nbase_dir = ${_base_dir}" >> "${_conf_file}" || _failed=true + fi + + if grep -qE '^\s*state_dir\s*=' "${_conf_file}"; then + perl -i -n -p -e "s#^(\s*)\#?\ ?(state_dir\ ?=.*)#state_dir = ${_state_dir}#g" \ + "${_conf_file}" || _failed=true + else + echo -e "\nstate_dir = ${_state_dir}" >> "${_conf_file}" || _failed=true + fi + + if grep -qE '^\s*mail_home\s*=' "${_conf_file}"; then + perl -i -n -p -e "s#^(\s*)\#?\ ?(mail_home\ ?=.*)#mail_home = ${_mail_home}#g" \ + "${_conf_file}" || _failed=true + else + echo -e "\nmail_home = ${_mail_home}" >> "${_conf_file}" || _failed=true + fi + + if grep -qE '^\s*mail_path\s*=' "${_conf_file}"; then + perl -i -n -p -e "s#^(\s*)\#?\ ?(mail_path\ ?=.*)#mail_path = ${_mail_path}#g" \ + "${_conf_file}" || _failed=true + else + echo -e "\nmail_path = ${_mail_driver}" >> "${_conf_file}" || _failed=true + fi + + if grep -qE '^\s*mail_driver\s*=' "${_conf_file}"; then + perl -i -n -p -e "s#^(\s*)\#?\ ?(mail_driver\ ?=.*)#mail_driver = ${_mail_driver}#g" \ + "${_conf_file}" || _failed=true + else + echo -e "\nmail_driver = ${_mail_driver}" >> "${_conf_file}" || _failed=true + fi + + if grep -qE '^\s*shutdown_clients\s*=' "${_conf_file}"; then + perl -i -n -p -e "s#^(\s*)\#?\ ?(shutdown_clients\ ?=.*)#shutdown_clients = ${_shutdown_clients}#g" \ + "${_conf_file}" || _failed=true + else + echo -e "\nshutdown_clients = ${_shutdown_clients}" >> "${_conf_file}" || _failed=true + fi + + cat <> "${_conf_file}" + +# Most of the actual configuration gets included below. The filenames are +# first sorted by their ASCII value and parsed in that order. The 00-prefixes +# in filenames are intended to make it easier to understand the ordering. +!include_try conf.d/*.conf + +# A config file can also tried to be included without giving an error if +# it's not found: +!include_try local.conf + +EOF + + if ! $_failed ; then + echo -e "$rc_done" + else + echo -e "$rc_failed" + error "Adjusting Adjusting file /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf failed" + + echo "" + echononl "continue anyway [yes/no]: " + read OK + OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" + while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK + done + [[ $OK = "yes" ]] || fatal "Interupted by user" + + fi -## - edit /usr/local/dovecot/etc/dovecot/dovecot.conf -## - -## - protocols = imap pop3 sieve -## - listen = $ipv4 $ipv6 -## - base_dir =/run/dovecot/ -## - state_dir = /run/dovecot -## - shutdown_clients = no -## - -## - dict { -## - expire = $db_driver:/usr/local/dovecot/etc/dovecot/sql-dict.conf.ext -## - } -## - -echononl "\tAdjust file dovecot.conf.." -if [[ -n "$ipv6" ]]; then - perl -i.ORIG -n -p -e "s#^([ ]*)\#?\ ?(listen\ ?=.*)#\1\#\# \2\n\1listen = $ipv4 $ipv6#g" \ - /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf || _failed=true else - perl -i.ORIG -n -p -e "s#^([ ]*)\#?\ ?(listen\ ?=.*)#\1\#\# \2\n\1listen = $ipv4#g" \ + + ## - edit /usr/local/dovecot/etc/dovecot/dovecot.conf + ## - + ## - protocols = imap pop3 sieve + ## - listen = $ipv4 $ipv6 + ## - base_dir =/run/dovecot/ + ## - state_dir = /run/dovecot + ## - shutdown_clients = no + ## - + ## - dict { + ## - expire = $db_driver:/usr/local/dovecot/etc/dovecot/sql-dict.conf.ext + ## - } + ## - + echononl "\tAdjust file dovecot.conf.." + if [[ -n "$ipv6" ]]; then + perl -i.ORIG -n -p -e "s#^([ ]*)\#?\ ?(listen\ ?=.*)#\1\#\# \2\n\1listen = $ipv4 $ipv6#g" \ + /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf || _failed=true + else + perl -i.ORIG -n -p -e "s#^([ ]*)\#?\ ?(listen\ ?=.*)#\1\#\# \2\n\1listen = $ipv4#g" \ + /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf || _failed=true + fi + perl -i -n -p -e "s#^([ ]*)\#?\ ?(protocols\ ?=.*)#\1\#\# \2\n\1protocols = imap pop3 sieve#g" \ /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf || _failed=true -fi -perl -i -n -p -e "s#^([ ]*)\#?\ ?(protocols\ ?=.*)#\1\#\# \2\n\1protocols = imap pop3 sieve#g" \ - /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf || _failed=true -perl -i -n -p -e "s#^([ ]*)\#?\ ?(base_dir\ ?=.*)#\1\#\# \2\n\1base_dir = /run/dovecot/\n\nstate_dir = /run/dovecot#g" \ - /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf || _failed=true -perl -i -n -p -e "s#^([ ]*)\#?\ ?(shutdown_clients\ ?=.*)#\1\#\# \2\n\1shutdown_clients = no#g" \ - /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf || _failed=true - -if $plugin_expire ; then - perl -i -n -p \ - -e "s#^([ ]*)(dict\ +{.*)#\1\2\n\1 expire = $db_driver:/usr/local/dovecot/etc/dovecot/sql-dict.conf.ext#g" \ + perl -i -n -p -e "s#^([ ]*)\#?\ ?(base_dir\ ?=.*)#\1\#\# \2\n\1base_dir = /run/dovecot/\n\nstate_dir = /run/dovecot#g" \ /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf || _failed=true + perl -i -n -p -e "s#^([ ]*)\#?\ ?(shutdown_clients\ ?=.*)#\1\#\# \2\n\1shutdown_clients = no#g" \ + /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf || _failed=true + + if $plugin_expire ; then + perl -i -n -p \ + -e "s#^([ ]*)(dict\ +{.*)#\1\2\n\1 expire = $db_driver:/usr/local/dovecot/etc/dovecot/sql-dict.conf.ext#g" \ + /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf || _failed=true + fi + + if ! $_failed ; then + echo -e "$rc_done" + else + echo -e "$rc_failed" + fatal "Adjusting Adjusting file /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf failed" + fi + fi -if ! $_failed ; then - echo -e "$rc_done" -else - echo -e "$rc_failed" - fatal "Adjusting Adjusting file /usr/local/dovecot-${_version}/etc/dovecot/dovecot.conf failed" -fi +blank_line +echononl "Proceed instllation [yes/no]: " +read OK +OK="$(echo "$OK" | tr '[:upper:]' '[:lower:]')" +while [[ "$OK" != "yes" ]] && [[ "$OK" != "no" ]] ; do + echononl "Wrong entry! - repeat [yes/no]: " + read OK +done +[[ $OK = "yes" ]] || fatal "Abbruch durch User" if $_new ; then @@ -1269,7 +1628,7 @@ if $_new ; then echononl "\tCreate table expires in database ${dbname}.." if $plugin_expire ; then cat << EOF | psql -U$dbuser $dbname > ${_log_dir}/error.log 2>&1 - + CREATE TABLE IF NOT EXISTS expires ( username varchar(100) not null, mailbox varchar(255) not null, @@ -1411,7 +1770,7 @@ EOF echononl "\tCreate table expires in database ${dbname}.." if $plugin_expire ; then cat << EOF | mysql -u$dbuser -p$dbpassword $dbname > /dev/null 2>&1 - + CREATE TABLE IF NOT EXISTS expires ( username varchar(100) not null, mailbox varchar(255) not null, @@ -1466,7 +1825,7 @@ connect = host=$dbhost user=$dbuser password=$dbpassword dbname=$dbname # END IF; # END; # \$\$ LANGUAGE plpgsql; -# +# # CREATE TRIGGER mergeexpires BEFORE INSERT ON expires # FOR EACH ROW EXECUTE PROCEDURE merge_expires(); @@ -1521,7 +1880,7 @@ EOF echo -e "$rc_failed" fatal "Creating file sql-dict.conf.ext failed" fi - fi + fi else echo -e "$rc_skipped" fi @@ -1535,15 +1894,15 @@ fi ## - default_vsz_limit = 512M ## - ## - !! Bemerkung !! -## - -## - Das Hochsetzen des default_client_limit Parameters auf einen Wert größer -## - als 1024 geht nur dann wenn auch die Anzahl der zulässigen "open files" -## - (default = 1024) geändert wird. +## - +## - Das Hochsetzen des default_client_limit Parameters auf einen Wert größer +## - als 1024 geht nur dann wenn auch die Anzahl der zulässigen "open files" +## - (default = 1024) geändert wird. ## - ## - ## - Systemd System: ## - =============== -## - +## - ## - In der service datei (z.Bsp. /etc/systemd/system/multi-user.target.wants/dovecot.service) ## - den Wert 'LimitNOFILE' hochsetzen: ## - @@ -1552,15 +1911,15 @@ fi ## - systemctl daemon-reload ## - systemctl restart dovecot.service ## - -## - Im Falle von LX containern muss zusätzlich auf dem hostsystem -## - in der datei '/etc/systemd/system.conf' der Wert für 'DefaultLimitNOFILE' +## - Im Falle von LX containern muss zusätzlich auf dem hostsystem +## - in der datei '/etc/systemd/system.conf' der Wert für 'DefaultLimitNOFILE' ## - hochgesetzt werden. ## - ## - System V systems: ## - ================= -## - Das Hochsetzen des default_client_limit Parameters auf einen Wert größer -## - als 1024 geht nur dann wenn auch die Anzahl der zulässigen "open files" -## - (default = 1024) geändert wird. Z.Bsp. in der Datei /etc/init.d/dovecot +## - Das Hochsetzen des default_client_limit Parameters auf einen Wert größer +## - als 1024 geht nur dann wenn auch die Anzahl der zulässigen "open files" +## - (default = 1024) geändert wird. Z.Bsp. in der Datei /etc/init.d/dovecot ## - durch Einfügen der zeile: ## - ulimit -n 32768 ## - @@ -1612,10 +1971,10 @@ fi ## - address = $imaps_listener_adresses ## - .. ## - } -## - +## - ## - process_min_avail = 16 ## - } -## - +## - ## - service pop3-login { ## - inet_listener pop3 { ## - address = $pop_listener_adresses @@ -1694,7 +2053,7 @@ fi ## - permanently on filesystem. So we have to create such a file ## - ## - openssl dhparam -out /etc/postfix/ssl/dh_4096.pem` -## - +## - if [[ $dovecot_major_version -ge 3 ]] \ || ( [[ $dovecot_major_version -eq 2 ]] && [[ $dovecot_minor_version -ge 3 ]] ); then @@ -1703,7 +2062,7 @@ if [[ $dovecot_major_version -ge 3 ]] \ echo -en "$rc_wait" if [[ "$os_dist" = "debian" ]] && [[ $os_version -gt 11 ]] ; then openssl dhparam -out "$dh_pem_file" 4096 > /dev/null 2>&1 - else + else openssl dhparam -dsaparam -out "$dh_pem_file" 4096 > /dev/null 2>&1 fi if [[ $? -eq 0 ]]; then @@ -1800,7 +2159,7 @@ fi ## - edit /usr/local/dovecot/etc/dovecot/conf.d/10-mail.conf -## - +## - ## - mail_location = maildir:/var/vmail/%d/%n/Maildir ## - ## - mail_uid = vmail @@ -1810,7 +2169,7 @@ fi ## - last_valid_uid = 5000 ## - ## - mail_temp_dir = /var/vmail/tmp -## - +## - ## - first_valid_gid = 5000 ## - last_valid_gid = 5000 ## - @@ -1858,7 +2217,7 @@ else echo -e "$rc_failed" fatal "Adjusting file '10-mail.conf' failed" fi - + echononl "\tCreate TEMP directory '/var/vmail/tmp' .." @@ -1953,7 +2312,7 @@ fi ## - ## - Add namespaces type private ## - -## - Add: +## - Add: ## - namespace inbox { ## - type = private ## - separator = / @@ -1973,7 +2332,7 @@ namespace inbox { # Hierarchy separator to use. You should use the same separator for all # namespaces or some clients get confused. '/' is usually a good one. # The default however depends on the underlying mail storage format. - #separator = + #separator = separator = / # Prefix required to access this namespace. This needs to be different for @@ -2023,12 +2382,12 @@ fi ## - auto = subscribe ## - special_use = \Drafts ## - } -## - +## - ## - mailbox Trash { ## - auto = subscribe ## - special_use = \Trash ## - } -## - +## - ## - mailbox Sent { ## - auto = subscribe ## - special_use = \Sent @@ -2088,7 +2447,7 @@ fi ## - ## - disable_plaintext_auth = no ## - auth_mechanisms = $auth_mechanisms -## - !include auth-sql.conf.ext # comment all other includes +## - !include auth-sql.conf.ext # comment all other includes ## - auth_username_translation = "%@" ## - _failed=false @@ -2117,14 +2476,14 @@ fi ## - ## - passdb { ## - driver = sql -## - -## - +## - +## - ## - # path for sql configuration file, see example-config/dovecot-sql.conf.ext ## - args = /usr/local/dovecot/etc/dovecot/sql-connect.conf.ext ## - } -## - +## - ## - .. -## - +## - ## - userdb { ## - driver = sql ## - args = /usr/local/dovecot/etc/dovecot/sql-connect.conf.ext @@ -2210,14 +2569,14 @@ fi ## - if running inetd-script: ## - ## - log_path = /var/log/dovecot/dovecot.log -## - +## - ## - or for example ## - ## - log_path = syslog ## - syslog_facility = local1 ## - auth_verbose = yes ## - auth_verbose_passwords = plain -## - +## - ## - in conjunction with the the following entries in /etc/rsyslog.conf ## - ## - local1.* -/var/log/dovecot.log @@ -2326,7 +2685,7 @@ fi ## - hostname = $hostname ## - sendmail_path = /usr/sbin/sendmail ## - lda_mailbox_autocreate = no -## - mail_plugins = $mail_plugins sieve +## - mail_plugins = $mail_plugins sieve ## - _failed=false echononl "\tAdjusting file 15-lda.conf" @@ -2422,7 +2781,7 @@ fi ## - edit /usr/local/dovecot/etc/dovecot/conf.d/90-plugin.conf ## - ## - Note: -## - Setting "autocreate", "autosubscribe" here is depricated. Use mailbox { auto } setting instead. +## - Setting "autocreate", "autosubscribe" here is depricated. Use mailbox { auto } setting instead. ## - ## - expire = Trash ## - expire2 = Trash/* @@ -2435,7 +2794,7 @@ fi ## - # it's better to enable it only after you've verified that the expire plugin is ## - # working as wanted. (v2.2.16+) ## - expire_cache = yes -## - +## - _failed=false echononl "\tAdjusting file 90-plugin.conf" if $plugin_expire ; then @@ -2499,7 +2858,7 @@ while IFS='' read -r _line || [[ -n $_line ]] ; do cat <> "$_tmp_file" - # Add Setting 'sieve_vacation_send_from_recipient' from (included) + # Add Setting 'sieve_vacation_send_from_recipient' from (included) # # Pigeonhole Sieve: Vacation Extension # ==================================== @@ -2579,7 +2938,7 @@ else fi -## - NOTICE: if you pre-compile your (global) scripts, you will increase +## - NOTICE: if you pre-compile your (global) scripts, you will increase ## - performance ## - echononl "\tPrecompile global sieve script" @@ -2617,8 +2976,8 @@ if $systemd_support; then ## - # - ## - echononl "\tAdjust Systemd service file, set PrivateTmp=false.." ## - if [[ -f "/etc/systemd/system/dovecot.service" ]] ; then - ## - - ## - if $(grep -o -E "PrivateTmp\s*=\s*[^[:blank:]]+" /etc/systemd/system/dovecot.service | grep -q true 2> /dev/null ) ; then + ## - + ## - if $(grep -o -E "PrivateTmp\s*=\s*[^[:blank:]]+" /etc/systemd/system/dovecot.service | grep -q true 2> /dev/null ) ; then ## - perl -i -n -p -e "s/(PrivateTmp\s*=\s*)true/\1false/" /etc/systemd/system/dovecot.service ## - if [[ $? -eq 0 ]]; then ## - echo -e "$rc_done" @@ -2636,9 +2995,9 @@ if $systemd_support; then ## - ## - here: ## - LimitNOFILE=32768 - ## - + ## - if [[ -f "/lib/systemd/system/dovecot.service" ]] \ - && $(grep -q -E "^LimitNOFILE=" /lib/systemd/system/dovecot.service) ; then + && $(grep -q -E "^LimitNOFILE=" /lib/systemd/system/dovecot.service) ; then _LimitNOFILE="$(grep -E "^LimitNOFILE=[[:digit:]]+" /lib/systemd/system/dovecot.service | cut -d'=' -f2)" @@ -2708,7 +3067,7 @@ else fi fi - + if $_new ; then @@ -2723,7 +3082,7 @@ if $_new ; then ## - running dovecot service via init-script ## - cat < /etc/init.d/dovecot -#! /bin/sh +#! /bin/sh ### BEGIN INIT INFO # Provides: dovecot # Required-Start: \$syslog \$postgresql @@ -2915,7 +3274,7 @@ EOF echo -e "$rc_failed" fatal "Creating init script for dovecot failed" fi - + chmod 755 /etc/init.d/dovecot else @@ -2926,7 +3285,7 @@ EOF fi ## - Add a cronjob to restart dovecot after booting the system. - ## - + ## - ## - Notice: ## - On normal start, dovecot started its service even if ipv6 is not ## - yet present and dovecot cannot bind to ipv6 listeners. @@ -2980,10 +3339,10 @@ EOF ## - add/uncomment: ## - ## - smtpd_tls_auth_only - ## - + ## - ## - smtpd_sasl_type = dovecot ## - smtpd_sasl_path = private/dovecot-auth - ## - + ## - ## - virtual_transport = dovecot ## - dovecot_destination_recipient_limit = 1 ## - @@ -3188,22 +3547,22 @@ echo -e "\033[1mConfigure quota support for dovecot\033[m" ## - take care quota plugins (quota,imap-quota) will ## - be loaded: -## - +## - ## - there are two quota related plugins: -## - +## - ## - * quota: implements the actual quota handling and includes also all the quota backends. -## - * imap_quota: for reporting quota information via imap. -## - +## - * imap_quota: for reporting quota information via imap. +## - ## - enable them in configuration files, e.g.: -## - +## - ## - conf.d/10-mail.conf: -## - +## - ## - # space separated list of plugins to load for all services. plugins specific to ## - # imap, lda, etc. are added to this list in their own .conf files. ## - mail_plugins = $mail_plugins quota -## - +## - ## - conf.d/20-imap.conf: -## - +## - ## - protocol imap { ## - # space separated list of plugins to load (default is global mail_plugins). ## - mail_plugins = $mail_plugins imap_quota @@ -3238,7 +3597,7 @@ fi ## - edit /usr/local/dovecot/etc/dovecot/dovecot.conf -## - +## - ## - add: ## - ## - dict { @@ -3385,7 +3744,7 @@ connect = host=$dbhost user=$dbuser password=$dbpassword dbname=$dbname # END IF; # return NEW; # END IF; -# +# # LOOP # UPDATE quota2 SET bytes = bytes + NEW.bytes, # messages = messages + NEW.messages @@ -3393,7 +3752,7 @@ connect = host=$dbhost user=$dbuser password=$dbpassword dbname=$dbname # IF found THEN # RETURN NULL; # END IF; -# +# # BEGIN # IF NEW.messages = 0 THEN # INSERT INTO quota2 (bytes, messages, username) VALUES (NEW.bytes, NULL, NEW.username); @@ -3407,10 +3766,10 @@ connect = host=$dbhost user=$dbuser password=$dbpassword dbname=$dbname # END LOOP; # END; # \$\$; -# -# +# +# # ALTER FUNCTION public.merge_quota2() OWNER TO postfix; -# +# # CREATE TRIGGER mergequota2 # BEFORE INSERT ON quota2 # FOR EACH ROW @@ -3460,7 +3819,7 @@ EOF # END IF; # END; # \$\$ LANGUAGE plpgsql; -# +# # CREATE TRIGGER mergeexpires BEFORE INSERT ON expires # FOR EACH ROW EXECUTE PROCEDURE merge_expires(); @@ -3489,7 +3848,7 @@ EOF fi ## - you also have to update the userdb's query in file - ## - "/usr/local/dovecot/etc/dovecot/sql-connect.conf.ext" to + ## - "/usr/local/dovecot/etc/dovecot/sql-connect.conf.ext" to ## - support extra variable "quota_rule" ## - echononl "\tRenew file sql-connect.conf.ext" @@ -3586,7 +3945,7 @@ EOF fi ## - you also have to update the userdb's query in file - ## - "/usr/local/dovecot/etc/dovecot/sql-connect.conf.ext" to + ## - "/usr/local/dovecot/etc/dovecot/sql-connect.conf.ext" to ## - support extra variable "quota_rule" ## - echononl "\tRenew file sql-connect.conf.ext" @@ -3713,20 +4072,20 @@ fi ## - edit /usr/local/dovecot/etc/dovecot/conf.d/90-quota.conf -## - +## - ## - add to the end of file or in seperate plugin-blocks ## - as designed in that file: ## - plugin { ## - # sql backend: ## - quota = dict:user quota::proxy::quota -## - +## - ## - quota_rule = *:storage=1g ## - quota_rule2 = trash:storage=+100m ## - ## - quota_warning = storage=80%% quota-warning 80 %u ## - quota_warning2 = storage=95%% quota-warning 95 %u ## - } -## - +## - ## - service quota-warning { ## - executable = script /usr/local/bin/quota-warning.sh ## - user = vmail @@ -3741,7 +4100,7 @@ cp -a /usr/local/dovecot-${_version}/etc/dovecot/conf.d/90-quota.conf \ /usr/local/dovecot-${_version}/etc/dovecot/conf.d/90-quota.conf.ORIG cat <>/usr/local/dovecot-${_version}/etc/dovecot/conf.d/90-quota.conf -## - +## - plugin { # SQL backend: quota = dict:User quota::proxy::quota @@ -3848,7 +4207,7 @@ fi ## - edit /usr/local/dovecot/etc/dovecot/conf.d/10-mail.conf ## - ## - Add namespaces type shared to 10-mail.conf -## - Take care to enable ACL plugin also, otherwise all users can access all the shared +## - Take care to enable ACL plugin also, otherwise all users can access all the shared ## - mailboxes, assuming they have permissions on filesystem level to do so. ## - we will do that later.. ## - namespace { @@ -3910,7 +4269,7 @@ else fi ## - edit /usr/local/dovecot/etc/dovecot/conf.d/10-mail.conf -## - +## - ## - mail_plugins = quota expire acl ## - _failed=false @@ -3977,7 +4336,7 @@ fi ## - ## - plugin { ## - ## acl = vfile:/etc/dovecot/global-acls:cache_secs=300 -## - +## - ## - # Without global ACLs: ## - acl = vfile ## - .. @@ -4110,8 +4469,8 @@ connect = host=$dbhost user=$dbuser password=$dbpassword dbname=$dbname ## - NOTE: ## - ## - All changes on database (CREATE TABLE / CREATE TRIGGER / what else..) -## - need to be done as the dbuser (here postfix) under whom dovecot -## - accesses the database. If not, you have to change the permissiond to allow +## - need to be done as the dbuser (here postfix) under whom dovecot +## - accesses the database. If not, you have to change the permissiond to allow ## - dovecot dbuser to access the createt table/trigger/... ## - @@ -4141,7 +4500,7 @@ connect = host=$dbhost user=$dbuser password=$dbpassword dbname=$dbname # END IF; # return NEW; # END IF; -# +# # LOOP # UPDATE quota2 SET bytes = bytes + NEW.bytes, # messages = messages + NEW.messages @@ -4149,7 +4508,7 @@ connect = host=$dbhost user=$dbuser password=$dbpassword dbname=$dbname # IF found THEN # RETURN NULL; # END IF; -# +# # BEGIN # IF NEW.messages = 0 THEN # INSERT INTO quota2 (bytes, messages, username) VALUES (NEW.bytes, NULL, NEW.username); @@ -4163,10 +4522,10 @@ connect = host=$dbhost user=$dbuser password=$dbpassword dbname=$dbname # END LOOP; # END; # \$\$; -# -# +# +# # ALTER FUNCTION public.merge_quota2() OWNER TO postfix; -# +# # CREATE TRIGGER mergequota2 # BEFORE INSERT ON quota2 # FOR EACH ROW @@ -4216,7 +4575,7 @@ EOF # END IF; # END; # \$\$ LANGUAGE plpgsql; -# +# # CREATE TRIGGER mergeexpires BEFORE INSERT ON expires # FOR EACH ROW EXECUTE PROCEDURE merge_expires(); @@ -4246,7 +4605,7 @@ EOF # primary key (from_user, to_user) # ); # COMMENT ON TABLE user_shares IS 'User from_user shares folders to user to_user.'; -# +# # CREATE TABLE anyone_shares ( # from_user varchar(100) not null, # dummy char(1) DEFAULT '1', -- always '1' currently @@ -4352,7 +4711,7 @@ EOF # dummy char(1) DEFAULT '1', -- always '1' currently # primary key (from_user, to_user) # ) COMMENT = 'User from_user shares folders to user to_user.'; -# +# # CREATE TABLE anyone_shares ( # from_user varchar(100) not null, # dummy char(1) DEFAULT '1', -- always '1' currently @@ -4592,7 +4951,7 @@ fi blank_line echononl "\tSet '_update=true' in file '$(basename "$conf_file")'.." if grep -q -E "^\s*_update=false" "$conf_file" 2> /dev/null ; then - perl -i -n -p -e "s/^\s*_update=.*/_update=true/" "$conf_file" + perl -i -n -p -e "s/^\s*_update=.*/_update=true/" "$conf_file" if [ "$?" = 0 ]; then echo -e "$rc_done" else