189 lines
5.7 KiB
Django/Jinja
189 lines
5.7 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-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 "$@"
|