#!/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() { echo TODO } add_user() { local username local userdomain local userpass local userpasscheck local userquota read -rp "Username: " username read -rp "Domain: " userdomain while [ "$(list_domains | grep -c "^\s*${userdomain}$")" -eq 0 ]; do echo "Domain '$userdomain' does not exit!" read -rp "Domain: " userdomain done 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 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 username="${username%@*}@${userdomain}" # clean username userpass=$(doveadm pw -s BLF-CRYPT -p "$userpass") # hash password 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 "$@"