From 97c8ccf4014ae445a1504cbb09e4810061249e24 Mon Sep 17 00:00:00 2001 From: angus Date: Wed, 23 Mar 2016 16:24:32 +0100 Subject: [PATCH] Allow already configured user databases, with passwords already setup. * Dockerfile: added script to generate-user-databases * generate-user-databases: script can be called to generate DBs from account.cf file and export them to the host * start-mailserver.sh: implemented logic for managing users provided in account.cf files or in user databases --- Dockerfile | 2 ++ bin/generate-user-databases | 23 ++++++++++++++++ start-mailserver.sh | 54 ++++++++++++++++++++++++++++--------- 3 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 bin/generate-user-databases diff --git a/Dockerfile b/Dockerfile index 4c893e81..e86fb8f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -49,7 +49,9 @@ ADD postfix/main.cf /etc/postfix/main.cf ADD postfix/master.cf /etc/postfix/master.cf ADD postfix/sasl/smtpd.conf /etc/postfix/sasl/smtpd.conf ADD bin/generate-ssl-certificate /usr/local/bin/generate-ssl-certificate +ADD bin/generate-user-databases /usr/local/bin/generate-user-databases RUN chmod +x /usr/local/bin/generate-ssl-certificate +RUN chmod +x /usr/local/bin/generate-user-databases # Get LetsEncrypt signed certificate RUN curl https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > /etc/ssl/certs/lets-encrypt-x1-cross-signed.pem diff --git a/bin/generate-user-databases b/bin/generate-user-databases new file mode 100644 index 00000000..e098928e --- /dev/null +++ b/bin/generate-user-databases @@ -0,0 +1,23 @@ +#!/bin/bash + +# Generate the courier and sasl databases +if [ -f /tmp/postfix/accounts.cf ]; then + # Checking that /tmp/postfix/accounts.cf ends with a newline + sed -i -e '$a\' /tmp/postfix/accounts.cf + + # Creating users + while IFS=$'|' read login pass + do + # Setting variables for better readability + user=$(echo ${login} | cut -d @ -f1) + domain=$(echo ${login} | cut -d @ -f2) + # Let's go! + echo "user '${user}' for domain '${domain}' with password '********'" + /usr/sbin/userdb ${login} set uid=5000 gid=5000 home=/var/mail/${domain}/${user} mail=/var/mail/${domain}/${user} + echo "${pass}" | userdbpw -md5 | userdb ${login} set systempw + echo "${pass}" | saslpasswd2 -p -c -u ${domain} ${login} + done < /tmp/postfix/accounts.cf + cp /etc/courier/userdb /tmp/postfix/userdb + cp /etc/sasldb2 /tmp/postfix/sasldb2 + echo "Courier and Sasl databases populated with user accounts" +fi diff --git a/start-mailserver.sh b/start-mailserver.sh index 46f1ff45..76386ffd 100644 --- a/start-mailserver.sh +++ b/start-mailserver.sh @@ -5,6 +5,22 @@ die () { exit 1 } +mkpaths () { + test ! -z "$1" && domain=$1 || die "mkpaths: no domain provided... Exiting" + test ! -z "$2" && user=$2 || die "mkpaths: no user provided... Exiting" + + mkdir -p /var/mail/${domain} + if [ ! -d "/var/mail/${domain}/${user}" ]; then + maildirmake "/var/mail/${domain}/${user}" + maildirmake "/var/mail/${domain}/${user}/.Sent" + maildirmake "/var/mail/${domain}/${user}/.Trash" + maildirmake "/var/mail/${domain}/${user}/.Drafts" + echo -e "INBOX\nINBOX.Sent\nINBOX.Trash\nInbox.Drafts" >> "/var/mail/${domain}/${user}/courierimapsubscribed" + touch "/var/mail/${domain}/${user}/.Sent/maildirfolder" + fi + echo ${domain} >> /tmp/vhost.tmp +} + if [ -f /tmp/postfix/accounts.cf ]; then echo "Regenerating postfix 'vmailbox' and 'virtual' for given users" echo "# WARNING: this file is auto-generated. Modify accounts.cf in postfix directory on host" > /etc/postfix/vmailbox @@ -24,21 +40,35 @@ if [ -f /tmp/postfix/accounts.cf ]; then /usr/sbin/userdb ${login} set uid=5000 gid=5000 home=/var/mail/${domain}/${user} mail=/var/mail/${domain}/${user} echo "${pass}" | userdbpw -md5 | userdb ${login} set systempw echo "${pass}" | saslpasswd2 -p -c -u ${domain} ${login} - mkdir -p /var/mail/${domain} - if [ ! -d "/var/mail/${domain}/${user}" ]; then - maildirmake "/var/mail/${domain}/${user}" - maildirmake "/var/mail/${domain}/${user}/.Sent" - maildirmake "/var/mail/${domain}/${user}/.Trash" - maildirmake "/var/mail/${domain}/${user}/.Drafts" - echo -e "INBOX\nINBOX.Sent\nINBOX.Trash\nInbox.Drafts" >> "/var/mail/${domain}/${user}/courierimapsubscribed" - touch "/var/mail/${domain}/${user}/.Sent/maildirfolder" - - fi - echo ${domain} >> /tmp/vhost.tmp + # Create the expected maildir paths + mkpaths ${domain} ${user} done < /tmp/postfix/accounts.cf makeuserdb else - echo "==> Warning: '/tmp/postfix/accounts.cf' is not provided. No mail account created." + CDB="/etc/courier/userdb" + SASLDB="/etc/sasldb2" + if [ -f /tmp/postfix/userdb -a -f /tmp/postfix/sasldb2 ]; then + # User databases have been already prepared + echo "Found user databases already setup" + cp /tmp/postfix/userdb ${CDB} + chown root:root ${CDB} + chmod 600 ${CDB} + cp /tmp/postfix/sasldb2 ${SASLDB} + chown postfix:sasl ${SASLDB} + chmod 660 ${SASLDB} + echo "Regenerating postfix 'vmailbox' and 'virtual' for given users" + echo "# WARNING: this file is auto-generated. Modify accounts.cf in postfix directory on host" > /etc/postfix/vmailbox + # Create the expected maildir paths + awk '{u=substr($1,1,index($1,"@")-1); d=substr($1,index($1,"@")+1,length($1)); print u" "d}' ${CDB} | \ + while read user domain; do + mkpaths ${domain} ${user} + echo "${user}@${domain} ${domain}/${user}/" >> /etc/postfix/vmailbox + done + makeuserdb + else + echo "==> Accounts: '/tmp/postfix/accounts.cf' OR '/tmp/postfix/userdb' and '/tmp/postfix/sasldb2'" + echo "==> Warning: None of those files are provided. No mail account created." + fi fi if [ -f /tmp/postfix/virtual ]; then