#! /bin/bash # ? This is done to ignore the message "Make sure not to read and write # ? the same file in the same pipeline", which is a result of ${DATABASE} # ? being used below. (This disables the message file-wide.) # shellcheck disable=SC2094 # shellcheck source=../scripts/helper-functions.sh . /usr/local/bin/helper-functions.sh DATABASE=${DATABASE:-/tmp/docker-mailserver/postfix-accounts.cf} ALIAS_DATABASE="/tmp/docker-mailserver/postfix-virtual.cf" QUOTA_DATABASE="/tmp/docker-mailserver/dovecot-quotas.cf" function usage { echo "Usage: delmailuser <-y> ..." echo " -y: don't prompt for confirmations" } while getopts ":y" OPT do case ${OPT} in y) MAILDEL="y" ;; \?) usage errex "Invalid option: -${OPTARG}" ;; *) usage errex "Invalid option: -${OPTARG}" ;; esac done shift $((OPTIND-1)) [[ -z ${*} ]] && { usage ; errex "No user specifed" ; } [[ -s ${DATABASE} ]] || exit 0 # Protect config file with lock to avoid race conditions ( flock -e 200 for USER in "${@}" do # very simple plausibility check [[ ${USER} != *"@"*"."* ]] && errex "No valid address: ${USER}" declare -a MAILARR MAILARR[0]="${USER%@*}" MAILARR[1]="${USER#*@}" # XXX ${USER} must not contain /s and other syntactic characters USER=$(escape "${USER}") if ! sed -i "/^""${USER}""|/d" "${DATABASE}" then errex "${USER} couldn't be deleted in ${DATABASE}. ${?}" fi # Delete all aliases where the user is the only recipient( " ${USER$}" ) # Delete user only for all aliases that deliver to multiple recipients ( ",${USER}" "${USER,}" ) if sed -i -e "/ ""${USER}""$/d" \ -e "s/,""${USER}""//g" \ -e "s/""${USER}"",//g" "${ALIAS_DATABASE}" then echo "${USER} and potential aliases deleted." || errex "Aliases for ${USER} couldn't be deleted in ${ALIAS_DATABASE}. ${?}" fi # remove quota directives if [[ -f ${QUOTA_DATABASE} ]] then sed -i -e "/^${USER}:.*$/d" "${QUOTA_DATABASE}" || errex "Quota for ${USER} couldn't be deleted in ${QUOTA_DATABASE}. ${?}" fi if [[ ${MAILDEL} != "y" ]] then read -r -p "Do you want to delete the mailbox as well(all mails will be removed)?(y/n) " MAILDEL echo fi [[ ${MAILDEL} != "y" ]] && errex "Leaving the mailbox untouched. If you want to delete it at a later point use \"sudo docker exec mail rm -R /var/mail/${MAILARR[1]}/${MAILARR[0]}\"" if rm -r -f "/var/mail/${MAILARR[1]}/${MAILARR[0]}" then echo "Mailbox deleted." || errex "Mailbox couldn't be deleted: ${?}" fi done ) 200< "${DATABASE}"