#! /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/helpers/index.sh source /usr/local/bin/helpers/index.sh DATABASE='/tmp/docker-mailserver/dovecot-quotas.cf' USER_DATABASE='/tmp/docker-mailserver/postfix-accounts.cf' USER="${1}" shift QUOTA="${*}" function __usage { echo 'Usage: setquota []' ; } [[ -z ${USER} ]] && { __usage ; _exit_with_error "No username specified" ; } [[ ${USER} =~ .*\@.* ]] || { __usage ; _exit_with_error "Username must include the domain" ; } grep -qE "^${USER}\|" "${USER_DATABASE}" || _exit_with_error "User '${USER}' does not exist" if [[ -z ${QUOTA} ]] then read -r -s 'Enter quota (e.g. 10M): ' QUOTA echo [[ -z "${QUOTA}" ]] && _exit_with_error 'Quota must not be empty (use 0 for unlimited quota)' fi # check quota if ! grep -qE "^([0-9]+(B|k|M|G|T)|0)\$" <<< "${QUOTA}" then __usage _exit_with_error 'Invalid quota format. e.g. 302M (B (byte), k (kilobyte), M (megabyte), G (gigabyte) or T (terabyte))' fi _create_lock # Protect config file with lock to avoid race conditions touch "${DATABASE}" delquota "${USER}" echo "${USER}:${QUOTA}" >>"${DATABASE}"