#!/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-random-alias Adds a new random alias, useful for hiding email addresses." 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." echo " rm-user [user] Remove a user." } 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-random-alias' ] && add_random_alias && exit 0 [ "$1" = 'add-user' ] && add_user && exit 0 [ "$1" = 'rm-user' ] && rm_user "$2" && 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_random_alias() { local srcaddress local srcdomain local dstaddress # Generate random address, 13 characters long srcaddress=$(tr -dc A-Za-z0-9 < /dev/urandom | head -c 13) read -rp "Source domain: " srcdomain 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 } rm_user() { local username if [ -z "$1" ]; then read -rp "User: " username else username="$1" fi while [ "$(list_users | grep -c "^\s*${username}$")" -eq 0 ]; do echo "User '$username' does not exist!" read -rp "User: " username done echo "DELETE FROM virtual_users WHERE email = '$username';" | connect } connect() { PGPASSWORD="$password" psql -h 127.0.0.1 -d "$database" -U "${user}" -w -t || exit 1 } main "$@"