#! /bin/bash # shellcheck disable=SC2094 # ? 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 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" MAILDEL=false function usage { echo "Usage: delmailuser [-y] []" } while getopts ":yY" OPT do case ${OPT} in y | Y ) MAILDEL=true ;; * ) usage exit 1 ;; esac done shift $((OPTIND-1)) [[ -z ${*} ]] && { usage ; errex "No user specifed" ; } [[ -s ${DATABASE} ]] || exit 0 if ! ${MAILDEL} then read -r -p "Do you want to delete the mailbox as well (removing all mails) ? [Y/n] " MAILDEL_CHOSEN [[ ${MAILDEL_CHOSEN} =~ (y|Y| ) ]] && MAILDEL=true fi ( 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#*@}" # ${USER} must not contain /s and other syntactic characters USER=$(escape "${USER}") if [[ -f ${DATABASE} ]] then if ! sed -i "/^${USER}|/d" "${DATABASE}" then errex "${USER} couldn't be deleted in ${DATABASE}. ${?}" fi fi if [[ -f ${ALIAS_DATABASE} ]] then # 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." else errex "Aliases for ${USER} couldn't be deleted in ${ALIAS_DATABASE}." fi fi # remove quota directives if [[ -f ${QUOTA_DATABASE} ]] then if ! sed -i -e "/^${USER}:.*$/d" "${QUOTA_DATABASE}" then errex "Quota for ${USER} couldn't be deleted in ${QUOTA_DATABASE}." fi fi if ! ${MAILDEL} then echo "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]}'" exit 0 fi if [[ -d "/var/mail/${MAILARR[1]}/${MAILARR[0]}" ]] then if rm -r -f "/var/mail/${MAILARR[1]}/${MAILARR[0]}" then echo "Mailbox deleted." else errex "Mailbox couldn't be deleted." fi else echo "Mailbox directory '/var/mail/${MAILARR[1]}/${MAILARR[0]}' did not exist." fi done ) 200< "${DATABASE}"