2019-07-30 13:03:36 +00:00
#!/bin/bash
2017-10-10 06:15:18 +00:00
2020-06-30 20:43:22 +00:00
. /usr/local/bin/helper_functions.sh
2017-10-18 05:43:30 +00:00
# create date for log output
log_date = $( date +"%Y-%m-%d %H:%M:%S " )
echo " ${ log_date } Start check-for-changes script. "
2017-10-10 06:15:18 +00:00
# change directory
cd /tmp/docker-mailserver
# Check postfix-accounts.cf exist else break
if [ ! -f postfix-accounts.cf ] ; then
2017-10-18 05:43:30 +00:00
echo " ${ log_date } postfix-accounts.cf is missing! This should not run! Exit! "
exit
2019-08-01 07:58:22 +00:00
fi
# Verify checksum file exists; must be prepared by start-mailserver.sh
CHKSUM_FILE = /tmp/docker-mailserver-config-chksum
if [ ! -f $CHKSUM_FILE ] ; then
echo " ${ log_date } ${ CHKSUM_FILE } is missing! Start script failed? Exit! "
exit
fi
2017-10-10 06:15:18 +00:00
2019-07-23 14:12:12 +00:00
# Determine postmaster address, duplicated from start-mailserver.sh
# This script previously didn't work when POSTMASTER_ADDRESS was empty
if [ [ -n " ${ OVERRIDE_HOSTNAME } " ] ] ; then
DOMAINNAME = $( echo " ${ OVERRIDE_HOSTNAME } " | sed s/[ ^.] *.//)
else
DOMAINNAME = " $( hostname -d) "
fi
PM_ADDRESS = " ${ POSTMASTER_ADDRESS : =postmaster@ ${ DOMAINNAME } } "
echo " ${ log_date } Using postmaster address ${ PM_ADDRESS } "
2019-08-01 07:58:22 +00:00
# Create an array of files to monitor, must be the same as in start-mailserver.sh
2018-11-01 19:17:07 +00:00
declare -a cf_files = ( )
2020-07-07 19:26:53 +00:00
for file in postfix-accounts.cf postfix-virtual.cf postfix-aliases.cf dovecot-quotas.cf /etc/letsencrypt/acme.json " /etc/letsencrypt/live/ $HOSTNAME /key.pem " " /etc/letsencrypt/live/ $HOSTNAME /fullchain.pem " ; do
2018-11-01 19:17:07 +00:00
[ -f " $file " ] && cf_files += ( " $file " )
done
2019-08-01 07:58:22 +00:00
# Wait to make sure server is up before we start
2019-08-01 17:39:25 +00:00
sleep 10
2018-11-01 19:17:07 +00:00
2017-10-18 05:43:30 +00:00
# Run forever
while true; do
# recreate logdate
log_date = $( date +"%Y-%m-%d %H:%M:%S " )
2017-10-10 06:15:18 +00:00
2019-08-01 17:39:25 +00:00
# Get chksum and check it, no need to lock config yet
2019-07-30 13:03:36 +00:00
chksum = $( sha512sum -c --ignore-missing $CHKSUM_FILE )
2017-10-10 06:15:18 +00:00
2018-11-01 19:17:07 +00:00
if [ [ $chksum = = *"FAIL" * ] ] ; then
echo " ${ log_date } Change detected "
2019-07-23 14:12:12 +00:00
# Bug alert! This overwrites the alias set by start-mailserver.sh
# Take care that changes in one script are propagated to the other
2019-08-01 07:58:22 +00:00
# Also note that changes are performed in place and are not atomic
# We should fix that and write to temporary files, stop, swap and start
2019-07-23 14:12:12 +00:00
2019-08-01 17:39:25 +00:00
# Lock configuration while working
# Not fixing indentation yet to reduce diff (fix later in separate commit)
(
flock -e 200
2020-06-30 20:43:22 +00:00
if [ [ $chksum = = *"/etc/letsencrypt/acme.json: FAILED" * ] ] ; then
2020-07-07 19:30:40 +00:00
for certdomain in $SSL_DOMAIN $HOSTNAME $DOMAINNAME ; do
if extractCertsFromAcmeJson " $certdomain " ; then
break
fi
done
2020-06-30 20:43:22 +00:00
fi
2018-11-01 19:17:07 +00:00
#regen postix aliases.
2019-07-23 14:12:12 +00:00
echo " root: ${ PM_ADDRESS } " > /etc/aliases
2018-11-01 19:17:07 +00:00
if [ -f /tmp/docker-mailserver/postfix-aliases.cf ] ; then
cat /tmp/docker-mailserver/postfix-aliases.cf>>/etc/aliases
fi
postalias /etc/aliases
#regen postfix accounts.
2017-10-10 06:15:18 +00:00
echo -n > /etc/postfix/vmailbox
echo -n > /etc/dovecot/userdb
if [ -f /tmp/docker-mailserver/postfix-accounts.cf -a " $ENABLE_LDAP " != 1 ] ; then
sed -i 's/\r//g' /tmp/docker-mailserver/postfix-accounts.cf
echo "# WARNING: this file is auto-generated. Modify config/postfix-accounts.cf to edit user list." > /etc/postfix/vmailbox
# Checking that /tmp/docker-mailserver/postfix-accounts.cf ends with a newline
sed -i -e '$a\' /tmp/docker-mailserver/postfix-accounts.cf
chown dovecot:dovecot /etc/dovecot/userdb
chmod 640 /etc/dovecot/userdb
sed -i -e '/\!include auth-ldap\.conf\.ext/s/^/#/' /etc/dovecot/conf.d/10-auth.conf
sed -i -e '/\!include auth-passwdfile\.inc/s/^#//' /etc/dovecot/conf.d/10-auth.conf
2018-04-02 08:45:58 +00:00
# rebuild relay host
if [ ! -z " $RELAY_HOST " ] ; then
# keep old config
echo -n > /etc/postfix/sasl_passwd
echo -n > /etc/postfix/relayhost_map
if [ ! -z " $SASL_PASSWD " ] ; then
echo " $SASL_PASSWD " >> /etc/postfix/sasl_passwd
fi
# add domain-specific auth from config file
if [ -f /tmp/docker-mailserver/postfix-sasl-password.cf ] ; then
2020-05-06 17:26:47 +00:00
( grep -v " ^\s* $\|^\s*\# " /tmp/docker-mailserver/postfix-sasl-password.cf || true ) | while read line; do
2018-04-02 08:45:58 +00:00
if ! echo " $line " | grep -q -e "\s*#" ; then
echo " $line " >> /etc/postfix/sasl_passwd
fi
2020-05-06 17:26:47 +00:00
done
2018-04-02 08:45:58 +00:00
fi
# add default relay
if [ ! -z " $RELAY_USER " ] && [ ! -z " $RELAY_PASSWORD " ] ; then
echo " [ $RELAY_HOST ]: $RELAY_PORT $RELAY_USER : $RELAY_PASSWORD " >> /etc/postfix/sasl_passwd
fi
# add relay maps from file
if [ -f /tmp/docker-mailserver/postfix-relaymap.cf ] ; then
2020-05-06 17:26:47 +00:00
( grep -v " ^\s* $\|^\s*\# " /tmp/docker-mailserver/postfix-relaymap.cf || true ) | while read line; do
2018-04-02 08:45:58 +00:00
if ! echo " $line " | grep -q -e "\s*#" ; then
echo " $line " >> /etc/postfix/relayhost_map
fi
2020-05-06 17:26:47 +00:00
done
2018-04-02 08:45:58 +00:00
fi
fi
2017-10-10 06:15:18 +00:00
# Creating users
# 'pass' is encrypted
# comments and empty lines are ignored
grep -v " ^\s* $\|^\s*\# " /tmp/docker-mailserver/postfix-accounts.cf | while IFS = $'|' read login pass
do
# Setting variables for better readability
user = $( echo ${ login } | cut -d @ -f1)
domain = $( echo ${ login } | cut -d @ -f2)
2020-04-24 12:55:32 +00:00
user_attributes = ""
# test if user has a defined quota
if [ -f /tmp/docker-mailserver/dovecot-quotas.cf ] ; then
user_quota = ( $( grep " ${ user } @ ${ domain } : " -i /tmp/docker-mailserver/dovecot-quotas.cf | tr ':' '\n' ) )
if [ ${# user_quota [@] } -eq 2 ] ; then
user_attributes = " ${ user_attributes } userdb_quota_rule=*:bytes= ${ user_quota [1] } "
fi
fi
2017-10-10 06:15:18 +00:00
# Let's go!
echo " ${ login } ${ domain } / ${ user } / " >> /etc/postfix/vmailbox
# User database for dovecot has the following format:
# user:password:uid:gid:(gecos):home:(shell):extra_fields
# Example :
# ${login}:${pass}:5000:5000::/var/mail/${domain}/${user}::userdb_mail=maildir:/var/mail/${domain}/${user}
2020-04-24 12:55:32 +00:00
echo " ${ login } : ${ pass } :5000:5000::/var/mail/ ${ domain } / ${ user } :: ${ user_attributes } " >> /etc/dovecot/userdb
2019-10-17 07:04:14 +00:00
mkdir -p /var/mail/${ domain } /${ user }
2020-04-24 12:55:32 +00:00
2017-10-10 06:15:18 +00:00
# Copy user provided sieve file, if present
test -e /tmp/docker-mailserver/${ login } .dovecot.sieve && cp /tmp/docker-mailserver/${ login } .dovecot.sieve /var/mail/${ domain } /${ user } /.dovecot.sieve
echo ${ domain } >> /tmp/vhost.tmp
2018-04-02 08:45:58 +00:00
# add domains to relayhost_map
if [ ! -z " $RELAY_HOST " ] ; then
if ! grep -q -e " ^@ ${ domain } \s " /etc/postfix/relayhost_map; then
echo " @ ${ domain } [ $RELAY_HOST ]: $RELAY_PORT " >> /etc/postfix/relayhost_map
fi
fi
2017-10-10 06:15:18 +00:00
done
fi
2018-04-02 08:45:58 +00:00
if [ -f /etc/postfix/sasl_passwd ] ; then
chown root:root /etc/postfix/sasl_passwd
chmod 0600 /etc/postfix/sasl_passwd
fi
if [ -f /etc/postfix/relayhost_map ] ; then
chown root:root /etc/postfix/relayhost_map
chmod 0600 /etc/postfix/relayhost_map
fi
2017-10-18 05:43:30 +00:00
if [ -f postfix-virtual.cf ] ; then
2018-11-01 19:17:07 +00:00
# regen postfix aliases
echo -n > /etc/postfix/virtual
2017-10-10 06:15:18 +00:00
echo -n > /etc/postfix/regexp
if [ -f /tmp/docker-mailserver/postfix-virtual.cf ] ; then
# Copying virtual file
cp -f /tmp/docker-mailserver/postfix-virtual.cf /etc/postfix/virtual
2020-05-06 17:26:47 +00:00
( grep -v " ^\s* $\|^\s*\# " /tmp/docker-mailserver/postfix-virtual.cf || true ) | while read from to
2017-10-10 06:15:18 +00:00
do
# Setting variables for better readability
uname = $( echo ${ from } | cut -d @ -f1)
domain = $( echo ${ from } | cut -d @ -f2)
2018-11-01 19:17:07 +00:00
# if they are equal it means the line looks like: "user1 other@domain.tld"
2017-10-10 06:15:18 +00:00
test " $uname " != " $domain " && echo ${ domain } >> /tmp/vhost.tmp
2020-05-06 17:26:47 +00:00
done
2017-10-10 06:15:18 +00:00
fi
if [ -f /tmp/docker-mailserver/postfix-regexp.cf ] ; then
# Copying regexp alias file
cp -f /tmp/docker-mailserver/postfix-regexp.cf /etc/postfix/regexp
sed -i -e ' /^virtual_alias_maps/{
s/ regexp:.*//
s/$/ regexp:\/ etc\/ postfix\/ regexp/
} ' /etc/postfix/main.cf
fi
2017-10-18 05:43:30 +00:00
fi
2020-05-06 17:26:47 +00:00
# Set vhost
2017-10-10 06:15:18 +00:00
if [ -f /tmp/vhost.tmp ] ; then
cat /tmp/vhost.tmp | sort | uniq > /etc/postfix/vhost && rm /tmp/vhost.tmp
fi
2020-05-06 17:26:47 +00:00
2018-11-01 19:17:07 +00:00
# Set right new if needed
2017-10-10 06:15:18 +00:00
if [ ` find /var/mail -maxdepth 3 -a \( \! -user 5000 -o \! -group 5000 \) | grep -c .` != 0 ] ; then
chown -R 5000:5000 /var/mail
fi
2020-05-06 17:26:47 +00:00
2018-11-01 19:17:07 +00:00
# Restart of the postfix
supervisorctl restart postfix
2020-05-06 17:26:47 +00:00
2018-11-01 19:17:07 +00:00
# Prevent restart of dovecot when smtp_only=1
if [ ! $SMTP_ONLY = 1 ] ; then
supervisorctl restart dovecot
2020-05-06 17:26:47 +00:00
fi
2017-10-10 06:15:18 +00:00
2018-11-01 19:17:07 +00:00
echo " ${ log_date } Update checksum "
2019-07-30 13:03:36 +00:00
sha512sum ${ cf_files [@]/#/--tag } >$CHKSUM_FILE
2019-08-01 17:39:25 +00:00
) 200<postfix-accounts.cf # end lock
2017-10-10 06:15:18 +00:00
fi
sleep 1
done