mirror of
https://github.com/docker-mailserver/docker-mailserver.git
synced 2025-08-02 09:05:14 +02:00
chore(scripts): Removing flock so NFS works (#1980)
Co-authored-by: Casper <casperklein@users.noreply.github.com> Co-authored-by: Georg Lauterbach <44545919+georglauterbach@users.noreply.github.com>
This commit is contained in:
parent
ba32943986
commit
5becce8064
8 changed files with 302 additions and 273 deletions
|
@ -35,31 +35,41 @@ function __usage
|
|||
|
||||
[[ ${1:-} == 'help' ]] && { __usage ; exit 0 ; }
|
||||
|
||||
USER="${1}"
|
||||
FULL_EMAIL="${1}"
|
||||
shift
|
||||
PASSWD="${*}"
|
||||
|
||||
[[ -z ${USER} ]] && { __usage ; errex 'No username specified' ; }
|
||||
[[ "${USER}" =~ .*\@.* ]] || { __usage ; errex 'Username must include the domain' ; }
|
||||
[[ -z ${FULL_EMAIL} ]] && { __usage ; errex 'No username specified' ; }
|
||||
[[ "${FULL_EMAIL}" =~ .*\@.* ]] || { __usage ; errex 'Username must include the domain' ; }
|
||||
|
||||
# Protect config file with lock to avoid race conditions
|
||||
touch "${DATABASE}"
|
||||
(
|
||||
flock -e 200
|
||||
create_lock "$(basename "$0")"
|
||||
if grep -qi "^$(escape "${FULL_EMAIL}")|" "${DATABASE}"
|
||||
then
|
||||
echo "User '${FULL_EMAIL}' already exists."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if grep -qi "^$(escape "${USER}")|" "${DATABASE}" 2>/dev/null
|
||||
then
|
||||
echo "User '${USER}' already exists."
|
||||
exit 1
|
||||
fi
|
||||
if [[ -z ${PASSWD} ]]
|
||||
then
|
||||
read -r -s -p "Enter Password: " PASSWD
|
||||
echo
|
||||
[[ -z ${PASSWD} ]] && errex "Password must not be empty"
|
||||
fi
|
||||
|
||||
if [[ -z ${PASSWD} ]]
|
||||
then
|
||||
read -r -s -p "Enter Password: " PASSWD
|
||||
echo
|
||||
[[ -z ${PASSWD} ]] && errex "Password must not be empty"
|
||||
fi
|
||||
HASH="$(doveadm pw -s SHA512-CRYPT -u "${FULL_EMAIL}" -p "${PASSWD}")"
|
||||
echo "${FULL_EMAIL}|${HASH}" >> "${DATABASE}"
|
||||
|
||||
HASH="$(doveadm pw -s SHA512-CRYPT -u "${USER}" -p "${PASSWD}")"
|
||||
echo "${USER}|${HASH}" >> "${DATABASE}"
|
||||
) 200< "${DATABASE}"
|
||||
USER="${FULL_EMAIL%@*}"
|
||||
DOMAIN="${FULL_EMAIL#*@}"
|
||||
|
||||
# Tests fail if the creation of /var/mail/${DOMAIN}/${USER} doesn't happen fast enough after addmailuser executes (check-for-changes.sh race-condition)
|
||||
if [[ -e "/tmp/docker-mailserver-config-chksum" ]] # Prevent infinite loop in tests like "checking accounts: user3 should have been added to /tmp/docker-mailserver/postfix-accounts.cf even when that file does not exist"
|
||||
then
|
||||
while [[ ! -d "/var/mail/${DOMAIN}/${USER}" ]]
|
||||
do
|
||||
echo "Waiting for dovecot to create /var/mail/${DOMAIN}/${USER}..."
|
||||
sleep 1
|
||||
done
|
||||
fi
|
||||
|
|
|
@ -86,81 +86,77 @@ then
|
|||
fi
|
||||
fi
|
||||
|
||||
(
|
||||
flock -e 200
|
||||
create_lock "$(basename "$0")"
|
||||
for EMAIL in "${@}"
|
||||
do
|
||||
ERROR=false
|
||||
|
||||
for EMAIL in "${@}"
|
||||
do
|
||||
ERROR=false
|
||||
# very simple plausibility check
|
||||
[[ ${EMAIL} != *@*.* ]] && errex "No valid email address: ${EMAIL}"
|
||||
|
||||
# very simple plausibility check
|
||||
[[ ${EMAIL} != *@*.* ]] && errex "No valid address: ${EMAIL}"
|
||||
USER="${EMAIL%@*}"
|
||||
DOMAIN="${EMAIL#*@}"
|
||||
|
||||
USER="${EMAIL%@*}"
|
||||
DOMAIN="${EMAIL#*@}"
|
||||
# ${EMAIL} must not contain /s and other syntactic characters
|
||||
UNESCAPED_EMAIL="${EMAIL}"
|
||||
EMAIL=$(escape "${EMAIL}")
|
||||
|
||||
# ${EMAIL} must not contain /s and other syntactic characters
|
||||
UNESCAPED_EMAIL="${EMAIL}"
|
||||
EMAIL=$(escape "${EMAIL}")
|
||||
|
||||
if [[ -f ${DATABASE} ]]
|
||||
if [[ -f ${DATABASE} ]]
|
||||
then
|
||||
if ! sed -i "/^${EMAIL}|/d" "${DATABASE}"
|
||||
then
|
||||
if ! sed -i "/^${EMAIL}|/d" "${DATABASE}"
|
||||
then
|
||||
echo "${UNESCAPED_EMAIL} couldn't be deleted in ${DATABASE}." >&2
|
||||
ERROR=true
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -f ${ALIAS_DATABASE} ]]
|
||||
then
|
||||
# delete all aliases where the user is the only recipient( " ${EMAIL}" )
|
||||
# delete user only for all aliases that deliver to multiple recipients ( ",${EMAIL}" "${EMAIL,}" )
|
||||
if sed -i \
|
||||
-e "/ ${EMAIL}$/d" -e "s/,${EMAIL}//g" -e "s/${EMAIL},//g" \
|
||||
"${ALIAS_DATABASE}"
|
||||
then
|
||||
echo "${UNESCAPED_EMAIL} and potential aliases deleted."
|
||||
else
|
||||
echo "Aliases for ${UNESCAPED_EMAIL} couldn't be deleted in ${ALIAS_DATABASE}." >&2
|
||||
ERROR=true
|
||||
fi
|
||||
fi
|
||||
|
||||
# remove quota directives
|
||||
if [[ -f ${QUOTA_DATABASE} ]]
|
||||
then
|
||||
if ! sed -i -e "/^${EMAIL}:.*$/d" "${QUOTA_DATABASE}"
|
||||
then
|
||||
echo "Quota for ${UNESCAPED_EMAIL} couldn't be deleted in ${QUOTA_DATABASE}." >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
if ! ${MAILDEL}
|
||||
then
|
||||
echo "Leaving the mailbox untouched.
|
||||
If you want to delete it at a later point,
|
||||
use 'sudo docker exec mailserver rm -R /var/mail/${DOMAIN}/${USER}'"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ -e "/var/mail/${DOMAIN}/${USER}" ]]
|
||||
then
|
||||
if rm -R "/var/mail/${DOMAIN}/${USER}"
|
||||
then
|
||||
echo "Mailbox deleted."
|
||||
else
|
||||
echo "Mailbox couldn't be deleted." >&2
|
||||
ERROR=true
|
||||
fi
|
||||
else
|
||||
echo "Mailbox directory '/var/mail/${DOMAIN}/${USER}' did not exist." >&2
|
||||
echo "${UNESCAPED_EMAIL} couldn't be deleted in ${DATABASE}." >&2
|
||||
ERROR=true
|
||||
fi
|
||||
fi
|
||||
|
||||
${ERROR} && errex 'See the messages above.'
|
||||
done
|
||||
if [[ -f ${ALIAS_DATABASE} ]]
|
||||
then
|
||||
# delete all aliases where the user is the only recipient( " ${EMAIL}" )
|
||||
# delete user only for all aliases that deliver to multiple recipients ( ",${EMAIL}" "${EMAIL,}" )
|
||||
if sed -i \
|
||||
-e "/ ${EMAIL}$/d" -e "s/,${EMAIL}//g" -e "s/${EMAIL},//g" \
|
||||
"${ALIAS_DATABASE}"
|
||||
then
|
||||
echo "${UNESCAPED_EMAIL} and potential aliases deleted."
|
||||
else
|
||||
echo "Aliases for ${UNESCAPED_EMAIL} couldn't be deleted in ${ALIAS_DATABASE}." >&2
|
||||
ERROR=true
|
||||
fi
|
||||
fi
|
||||
|
||||
) 200< "${DATABASE}"
|
||||
# remove quota directives
|
||||
if [[ -f ${QUOTA_DATABASE} ]]
|
||||
then
|
||||
if ! sed -i -e "/^${EMAIL}:.*$/d" "${QUOTA_DATABASE}"
|
||||
then
|
||||
echo "Quota for ${UNESCAPED_EMAIL} couldn't be deleted in ${QUOTA_DATABASE}." >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
if ! ${MAILDEL}
|
||||
then
|
||||
echo "Leaving the mailbox untouched.
|
||||
If you want to delete it at a later point,
|
||||
use 'sudo docker exec mailserver rm -R /var/mail/${DOMAIN}/${USER}'"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ -e "/var/mail/${DOMAIN}/${USER}" ]]
|
||||
then
|
||||
if rm -R "/var/mail/${DOMAIN}/${USER}"
|
||||
then
|
||||
echo "Mailbox deleted."
|
||||
else
|
||||
echo "Mailbox couldn't be deleted." >&2
|
||||
ERROR=true
|
||||
fi
|
||||
rmdir "/var/mail/${DOMAIN}" 2>/dev/null || true
|
||||
else
|
||||
echo "Mailbox directory '/var/mail/${DOMAIN}/${USER}' did not exist." >&2
|
||||
ERROR=true
|
||||
fi
|
||||
|
||||
${ERROR} && errex 'See the messages above.'
|
||||
done
|
||||
exit 0
|
||||
|
|
|
@ -33,24 +33,21 @@ then
|
|||
fi
|
||||
|
||||
# Protect config file with lock to avoid race conditions
|
||||
create_lock "$(basename "$0")"
|
||||
|
||||
touch "${DATABASE}"
|
||||
(
|
||||
flock -e 200
|
||||
if [ -z "${QUOTA}" ]; then
|
||||
read -r -s "Enter quota (e.g. 10M): " QUOTA
|
||||
echo
|
||||
[[ -z "${QUOTA}" ]] && errex "Quota must not be empty. Use 0 for unlimited quota"
|
||||
fi
|
||||
|
||||
if [ -z "${QUOTA}" ]; then
|
||||
read -r -s "Enter quota (e.g. 10M): " QUOTA
|
||||
echo
|
||||
[[ -z "${QUOTA}" ]] && errex "Quota must not be empty. Use 0 for unlimited quota"
|
||||
fi
|
||||
|
||||
# check quota
|
||||
if [[ -n ${QUOTA} ]] && ! echo "${QUOTA}" | grep -qE "^([0-9]+(B|k|M|G|T)|0)\$"
|
||||
then
|
||||
usage
|
||||
errex "invalid quota format. e.g. 302M (B (byte), k (kilobyte), M (megabyte), G (gigabyte) or T (terabyte))"
|
||||
fi
|
||||
|
||||
delquota "${USER}"
|
||||
echo "${USER}:${QUOTA}" >>"${DATABASE}"
|
||||
) 200< "${DATABASE}"
|
||||
# check quota
|
||||
if [[ -n ${QUOTA} ]] && ! echo "${QUOTA}" | grep -qE "^([0-9]+(B|k|M|G|T)|0)\$"
|
||||
then
|
||||
usage
|
||||
errex "invalid quota format. e.g. 302M (B (byte), k (kilobyte), M (megabyte), G (gigabyte) or T (terabyte))"
|
||||
fi
|
||||
|
||||
delquota "${USER}"
|
||||
echo "${USER}:${QUOTA}" >>"${DATABASE}"
|
||||
|
|
|
@ -28,8 +28,7 @@ fi
|
|||
HASH="$(doveadm pw -s SHA512-CRYPT -u "${USER}" -p "${PASSWD}")"
|
||||
|
||||
# Protect config file with lock to avoid race conditions
|
||||
(
|
||||
flock -e 200
|
||||
grep -qi "^$(escape "${USER}")|" "${DATABASE}" 2>/dev/null || errex "User \"${USER}\" does not exist"
|
||||
sed -i "s ^""${USER}""|.* ""${USER}""|""${HASH}"" " "${DATABASE}"
|
||||
) 200< "${DATABASE}"
|
||||
touch "${DATABASE}"
|
||||
create_lock "$(basename "$0")"
|
||||
grep -qi "^$(escape "${USER}")|" "${DATABASE}" 2>/dev/null || errex "User \"${USER}\" does not exist"
|
||||
sed -i "s ^""${USER}""|.* ""${USER}""|""${HASH}"" " "${DATABASE}"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue