mirror of
https://github.com/docker-mailserver/docker-mailserver
synced 2024-12-18 14:04:17 +01:00
105 lines
3.2 KiB
Bash
Executable File
105 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# shellcheck source=../scripts/helpers/index.sh
|
|
source /usr/local/bin/helpers/index.sh
|
|
|
|
# Workaround to support ENABLE_QUOTAS toggling during tests:
|
|
# shellcheck source=/dev/null
|
|
source /etc/dms-settings 2>/dev/null
|
|
|
|
function _main() {
|
|
local DATABASE_ACCOUNTS='/tmp/docker-mailserver/postfix-accounts.cf'
|
|
local DATABASE_VIRTUAL='/tmp/docker-mailserver/postfix-virtual.cf'
|
|
|
|
_list_entries "${DATABASE_ACCOUNTS}"
|
|
}
|
|
|
|
function _list_entries() {
|
|
local DATABASE=${1}
|
|
_db_should_exist_with_content "${DATABASE}"
|
|
|
|
local ENTRY_TO_DISPLAY
|
|
while read -r LINE; do
|
|
ENTRY_TO_DISPLAY=$(_format_list_item "${LINE}")
|
|
|
|
echo -e "* ${ENTRY_TO_DISPLAY}\n"
|
|
done < <(_get_valid_lines_from_file "${DATABASE}")
|
|
}
|
|
|
|
function _format_list_item() {
|
|
local LINE=${1}
|
|
|
|
local MAIL_ACCOUNT
|
|
MAIL_ACCOUNT=$(echo "${LINE}" | cut -d'|' -f1)
|
|
|
|
local WITH_QUOTA
|
|
WITH_QUOTA=$(_quota_show_for "${MAIL_ACCOUNT}")
|
|
|
|
local WITH_ALIASES
|
|
WITH_ALIASES=$(_alias_list_for_account "${MAIL_ACCOUNT}")
|
|
|
|
local ACCOUNT_ENTRY="${MAIL_ACCOUNT}"
|
|
[[ -n ${WITH_QUOTA} ]] && ACCOUNT_ENTRY+=" ${WITH_QUOTA}"
|
|
[[ -n ${WITH_ALIASES} ]] && ACCOUNT_ENTRY+="\n [ aliases -> ${WITH_ALIASES} ]"
|
|
|
|
echo "${ACCOUNT_ENTRY}"
|
|
}
|
|
|
|
function _quota_show_for() {
|
|
local MAIL_ACCOUNT=${1}
|
|
|
|
[[ ${ENABLE_QUOTAS} -ne 1 ]] && return 0
|
|
|
|
local QUOTA_INFO
|
|
# Matches a line where the 3rd column is `type='STORAGE'` - returning the next three column values:
|
|
IFS=' ' read -r -a QUOTA_INFO <<< "$(doveadm quota get -u "${MAIL_ACCOUNT}" | tail +2 | awk '{ if ($3 == "STORAGE") { print $4" "$5" "$6 } }')"
|
|
|
|
local CURRENT_SIZE SIZE_LIMIT PERCENT_USED
|
|
# Format the extracted quota storage columns:
|
|
CURRENT_SIZE="$(_bytes_to_human_readable_size "${QUOTA_INFO[0]}")"
|
|
SIZE_LIMIT="$(_bytes_to_human_readable_size "${QUOTA_INFO[1]}")"
|
|
PERCENT_USED="${QUOTA_INFO[2]}%"
|
|
|
|
echo "( ${CURRENT_SIZE} / ${SIZE_LIMIT} ) [${PERCENT_USED}]"
|
|
}
|
|
|
|
function _bytes_to_human_readable_size() {
|
|
# `-` represents a non-applicable value (eg: Like when `SIZE_LIMIT` is not set):
|
|
if [[ ${1:-} == '-' ]]; then
|
|
echo '~'
|
|
# Otherwise a value in KibiBytes (1024 bytes == 1k) is expected (Dovecots internal representation):
|
|
elif [[ ${1:-} =~ ^[0-9]+$ ]]; then
|
|
# kibibytes to bytes, converted to approproate IEC unit (eg: MiB):
|
|
echo $(( 1024 * ${1} )) | numfmt --to=iec
|
|
else
|
|
_exit_with_error "Supplied non-number argument '${1:-}' to '_bytes_to_human_readable_size()'"
|
|
fi
|
|
}
|
|
|
|
# Returns a comma delimited list of aliases associated to a recipient (ideally the recipient is a mail account):
|
|
function _alias_list_for_account() {
|
|
local GREP_OPTIONS
|
|
local MAIL_ACCOUNT=${1}
|
|
|
|
# postfix-virtual.cf sample lines:
|
|
#
|
|
# all@example.com foo@example.com
|
|
# all@example.com foo@example.com,another@example.com
|
|
# all@example.com another@example.com,foo@example.com,yetanother@example.com
|
|
# all@example.com another@example.com,foo@example.com
|
|
|
|
GREP_OPTIONS=(
|
|
--ignore-case
|
|
--extended-regexp
|
|
-e "\s${MAIL_ACCOUNT}($|,)" # match first and second sample line
|
|
-e ",${MAIL_ACCOUNT}($|,)" # match third and fourth sample line
|
|
"${DATABASE_VIRTUAL}"
|
|
)
|
|
|
|
if grep --quiet --no-messages "${GREP_OPTIONS[@]}"; then
|
|
grep "${GREP_OPTIONS[@]}" | awk '{print $1;}' | sed ':a;N;$!ba;s/\n/, /g'
|
|
fi
|
|
}
|
|
|
|
_main
|