#! /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/dovecot-quotas.cf} USER_DATABASE=${USER_DATABASE:-/tmp/docker-mailserver/postfix-accounts.cf} USER="${1}" shift QUOTA="${*}" function usage { echo "Usage: setquota []" ; } [[ -z ${USER} ]] && { usage ; errex "no username specified" ; } [[ "${USER}" =~ .*\@.* ]] || { usage ; errex "username must include the domain" ; } if ! grep -qE "^${USER}\|" "${USER_DATABASE}" then usage; errex "user ${USER} does not exist" 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 # Protect config file with lock to avoid race conditions 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 # 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}"