self-hosting/roles/mailserver_database/templates/mailserver-manage.sh.j2

141 lines
4.2 KiB
Django/Jinja

#!/bin/bash
# {{ ansible_managed }}
database='{{ mailserver_database.db }}'
user='{{ mailserver_database.admin_user.name }}'
password='{{ mailserver_database.admin_user.pwd }}'
usage() {
echo "Usage: $0 [options]"
echo " options:"
echo " add-alias Adds a new alias, needed information will be prompted."
echo " add-user Adds a new user, needed information will be prompted."
echo " list-domains List all configured virtual domains."
echo " list-aliases [user] List all aliases optionally restricting to user."
echo " list-users [domain] List all mailboxes optionally restricting to domain."
}
main() {
[ $# -eq 0 ] && usage && exit 1
[ "$1" = '-h' ] && usage && exit 1
[ "$1" = '--help' ] && usage && exit 1
[ "$1" = 'list-domains' ] && list_domains && exit 0
[ "$1" = 'list-aliases' ] && list_aliases "$2" && exit 0
[ "$1" = 'list-users' ] && list_users "$2" && exit 0
[ "$1" = 'add-alias' ] && add_alias && exit 0
[ "$1" = 'add-user' ] && add_user && exit 0
usage && exit 1 # not supposed to get here
}
add_alias() {
local srcaddress
local srcdomain
local dstaddress
read -rp "Source: " srcaddress
if [[ "$srcaddress" =~ '@' ]]; then
srcdomain=$(echo "$srcaddress" | awk -F@ '{print $2}')
else
read -rp "Source domain:" srcdomain
fi
while [ "$(list_domains | grep -c "^\s*${srcdomain}$")" -eq 0 ]; do
echo "Domain '$srcdomain' does not exist!"
read -rp "Source domain:" srcdomain
done
srcaddress="${srcaddress%@*}@${srcdomain}" # clean srcaddress
echo "You can add multiple destinations separated by spaces."
read -rp "Destination(s): " dstaddress
for dst in $dstaddress; do
echo "INSERT INTO virtual_aliases (domain_id, source, destination) VALUES (" \
"(SELECT id FROM virtual_domains WHERE name = '$srcdomain')," \
"'$srcaddress'," \
"'$dst'," \
") ON CONFLICT (source, destination) DO NOTHING;" | connect
done
}
add_user() {
local username
local userdomain
local userpass
local userpasscheck
local userquota
read -rp "Username: " username
if [[ "$username" =~ '@' ]]; then
userdomain=$(echo "$username" | awk -F@ '{print $2}')
else
read -rp "Domain: " userdomain
fi
while [ "$(list_domains | grep -c "^\s*${userdomain}$")" -eq 0 ]; do
echo "Domain '$userdomain' does not exist!"
read -rp "Domain: " userdomain
done
username="${username%@*}@${userdomain}" # clean username
read -srp "Password: " userpass; echo
read -srp "Password (again): " userpasscheck; echo
while [ "$userpass" != "$userpasscheck" ]; do
echo "Passwords do not match!"
read -srp "Password: " userpass; echo
read -srp "Password (again): " userpasscheck; echo
done
userpass=$(doveadm pw -s BLF-CRYPT -p "$userpass") # hash password
echo "Quota:"
echo " 0: infinity"
echo " 42: 42 bytes"
echo " 42k: 42 kilobytes"
echo " 42m: 42 megabytes"
echo " 42g: 42 gigabytes"
read -rp "Quota: " userquota
if [[ "$userquota" = *k ]]; then
userquota="${userquota//k/}"
userquota=$(( userquota * 1024 ))
elif [[ "$userquota" = *m ]]; then
userquota="${userquota//m/}"
userquota=$(( userquota * 1024 * 1024 ))
elif [[ "$userquota" = *g ]]; then
userquota="${userquota//g/}"
userquota=$(( userquota * 1024 * 1024 * 1024 ))
fi
echo "INSERT INTO virtual_users (domain_id, email, password, quota) VALUES (" \
"(SELECT id FROM virtual_domains WHERE name = '$userdomain')," \
"'$username'," \
"'$userpass'," \
"$userquota" \
") ON CONFLICT (email) DO UPDATE SET password = EXCLUDED.password, quota = EXCLUDED.quota;" | connect
}
list_domains() {
echo 'SELECT name FROM virtual_domains;' | connect
}
list_aliases() {
if [ -z "$1" ]; then
echo 'SELECT source, destination FROM virtual_aliases;' | connect
else
echo "SELECT source, destination FROM virtual_aliases WHERE destination='$1';" | connect
fi
}
list_users() {
if [ -z "$1" ]; then
echo 'SELECT email FROM virtual_users;' | connect
else
echo "SELECT email FROM virtual_users WHERE domain_id=(SELECT id FROM virtual_domains WHERE name='$1');" | connect
fi
}
connect() {
PGPASSWORD="$password" psql -h 127.0.0.1 -d "$database" -U "${user}" -w -t || exit 1
}
main "$@"