Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .creds.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/bin/bash
###################################################
################ DEFINITIONS ####################
database_name=vmail
database_user=root
database_password="password"
new_user_quota=2048 #in MB
new_user_enabled=1
new_user_sendonly=0
new_user_autosent=0
max_quota=4096 #in MB
init_database_user=vmail #User which will read the database

###################################################
################ MENUS ##########################
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.creds
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ Further, as `vmail-admin` is written in Bash, you should have bash installed.
* Make it executable with "chmod +x vmail-admin.sh".
* Run it with "./vmail-admin.sh".

* Copy .creds.example over to .creds file and make your changes

# Usage

You can change the parameters for the script under Definitions in the script.
Expand All @@ -35,7 +37,8 @@ Menu items are:
2. Delete user
3. Change user password
4. Change user quota
5. Back to main menu
5. Change autosent status #wether or not to auto bcc when sent from. Use this for accounts where emails are sent via smtp and not a IMAP client
6. Back to main menu
2. Domain Management
1. Add Domain
2. Delete Domain
Expand Down
102 changes: 57 additions & 45 deletions vmail-admin.sh
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,17 +1,8 @@
#!/bin/bash

###################################################
################ DEFINITIONS ####################
database_name=vmail
database_user=root
new_user_quota=2048 #in MB
new_user_enabled=1
new_user_sendonly=0
max_quota=4096 #in MB
init_database_user=vmail #User which will read the database
# Load creds: path to .creds file
source /root/scripts/vmail-admin/.creds

###################################################
################ MENUS ##########################
menu()
{
printline
Expand Down Expand Up @@ -58,7 +49,8 @@ user_menu()
echo "2) Delete user"
echo "3) Change user password"
echo "4) Change user quota"
echo "5) Back to main menu"
echo "5) Cange autosent status"
echo "6) Back to main menu"
printline
read choose

Expand All @@ -78,8 +70,11 @@ user_menu()
4)
change_quota
;;

5)
change_autosent
;;

6)
menu
;;

Expand Down Expand Up @@ -260,7 +255,7 @@ switch_case_submenu()

check_user_exists()
{
user_exists=`mysql -u $database_user -D $database_name -e "select * from accounts where username='$1' and domain='$2';"`
user_exists=`mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from accounts where username='$1' and domain='$2';"`
if [ "$user_exists" == "" ]; then
echo "User $1@$2 doesn't exist in database!"
switch_case_submenu $3
Expand All @@ -269,16 +264,16 @@ check_user_exists()

check_user_not_existing()
{
user_exists=`mysql -u $database_user -D $database_name -e "select * from accounts where username='$1' and domain='$2';"`
user_exists=`mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from accounts where username='$1' and domain='$2';"`
if [ "$user_exists" != "" ]; then
echo "User $1@$2 doesn't exist in database!"
echo "User $1@$2 does exist in database!"
switch_case_submenu $3
fi
}

check_domain_exists()
{
domain_exists=`mysql -u $database_user -D $database_name -e "select * from domains where domain='$1';"`
domain_exists=`mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from domains where domain='$1';"`
if [ "$domain_exists" == "" ]; then
echo "Domain $1 doesn't exist in database!"
switch_case_submenu $2
Expand All @@ -305,15 +300,15 @@ read_alias_input()
export_database()
{
check_database_exists
mysqldump -u $database_user -p$database_password $database_name | gzip > $database_name-export.sql.gz
mysqldump -u $database_user -p"${database_password}" $database_name | gzip > $database_name-export.sql.gz
echo "Database has been exported as $database_name-export.sql.gz"
database_menu
}

import_database()
{

database_exists=`mysql -e "show databases like '$database_name';"`
database_exists=`mysql -u $database_user -p"${database_password}" -e "show databases like '$database_name';"`
if [ "$database_exists" == "" ]; then
echo "Seems the database $database_name doesn't exist. Creating..."
mysql -u $database_user -e "create database $database_name CHARACTER SET 'utf8';";
Expand All @@ -337,7 +332,7 @@ import_database()

delete_database()
{
database_exists=`mysql -e "show databases like '$database_name';"`
database_exists=`mysql -u $database_user -p"${database_password}" -e "show databases like '$database_name';"`
if [ "$database_exists" != "" ]; then
echo "Are you sure you want to delete database $database_name? Type \"YES\""
read ack
Expand All @@ -353,7 +348,7 @@ delete_database()

init_database()
{
database_exists=`mysql -e "show databases like '$database_name';"`
database_exists=`mysql -u $database_user -p"${database_password}" -e "show databases like '$database_name';"`
if [ "$database_exists" != "" ]; then
echo "The database allready exists!"
echo "Returning to menu."
Expand All @@ -377,17 +372,17 @@ init_database()
echo "Passwords don't match!"
fi
done
mysql -u $database_user -D $database_name -e "CREATE TABLE domains ( id int unsigned NOT NULL AUTO_INCREMENT, domain varchar(255) NOT NULL, PRIMARY KEY (id),UNIQUE KEY (domain));"
mysql -u $database_user -p"${database_password}" -D $database_name -e "CREATE TABLE domains ( id int unsigned NOT NULL AUTO_INCREMENT, domain varchar(255) NOT NULL, PRIMARY KEY (id),UNIQUE KEY (domain));"

mysql -u $database_user -D $database_name -e "CREATE TABLE accounts ( id int unsigned NOT NULL AUTO_INCREMENT, username varchar(64) NOT NULL,
mysql -u $database_user -p"${database_password}" -D $database_name -e "CREATE TABLE accounts ( id int unsigned NOT NULL AUTO_INCREMENT, username varchar(64) NOT NULL,
domain varchar(255) NOT NULL, password varchar(255) NOT NULL, quota int unsigned DEFAULT '0', enabled boolean DEFAULT '0', sendonly boolean DEFAULT '0',
PRIMARY KEY (id), UNIQUE KEY (username, domain), FOREIGN KEY (domain) REFERENCES domains (domain));"

mysql -u $database_user -D $database_name -e "CREATE TABLE aliases ( id int unsigned NOT NULL AUTO_INCREMENT, source_username varchar(64) NOT NULL, source_domain varchar(255) NOT NULL,
mysql -u $database_user -p"${database_password}" -D $database_name -e "CREATE TABLE aliases ( id int unsigned NOT NULL AUTO_INCREMENT, source_username varchar(64) NOT NULL, source_domain varchar(255) NOT NULL,
destination_username varchar(64) NOT NULL, destination_domain varchar(255) NOT NULL, enabled boolean DEFAULT '0', PRIMARY KEY (id),
UNIQUE KEY (source_username, source_domain, destination_username, destination_domain), FOREIGN KEY (source_domain) REFERENCES domains (domain));"

mysql -u $database_user -D $database_name -e "CREATE TABLE tlspolicies ( id int unsigned NOT NULL AUTO_INCREMENT, domain varchar(255) NOT NULL,
mysql -u $database_user -p"${database_password}" -D $database_name -e "CREATE TABLE tlspolicies ( id int unsigned NOT NULL AUTO_INCREMENT, domain varchar(255) NOT NULL,
policy enum('none', 'may', 'encrypt', 'dane', 'dane-only', 'fingerprint', 'verify', 'secure') NOT NULL, params varchar(255), PRIMARY KEY (id), UNIQUE KEY (domain));"

echo "Database $database_name created and initialized."
Expand All @@ -402,7 +397,7 @@ add_alias()
{
check_database_exists
read_alias_input
mysql -u $database_user -D $database_name -e "insert into aliases (source_username, source_domain, destination_username, destination_domain, enabled) values ('$source_username', '$source_domain', '$destination_username', '$destination_domain', true);"
mysql -u $database_user -p"${database_password}" -D $database_name -e "insert into aliases (source_username, source_domain, destination_username, destination_domain, enabled) values ('$source_username', '$source_domain', '$destination_username', '$destination_domain', true);"
echo "Alias $source_username@$source_domain -> $destination_username@$destination_domain has been added"
aliases_menu
}
Expand All @@ -416,7 +411,7 @@ delete_alias()
read ack

if [ "$ack" == "YES" ]; then
mysql -u $database_user -D $database_name -e "delete from aliases where source_username='$source_username' and source_domain='$source_domain' and destination_username='$destination_username'
mysql -u $database_user -p"${database_password}" -D $database_name -e "delete from aliases where source_username='$source_username' and source_domain='$source_domain' and destination_username='$destination_username'
and destination_domain='$destination_domain';"
echo "Alias deleted."
aliases_menu
Expand All @@ -429,25 +424,25 @@ show_alias_domain()
check_database_exists
read_domain
check_domain_exists $domain "aliases_menu"
show_alias=`mysql -u $database_user -D $database_name -e "select * from aliases where source_domain='$domain' or destination_domain='$domain';"`
show_alias=`mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from aliases where source_domain='$domain' or destination_domain='$domain';"`
if [ "$show_alias" == "" ]; then
echo "Now aliases for that domain in database!"
aliases_menu
fi

mysql -u $database_user -D $database_name -e "select * from aliases where source_domain='$domain' or destination_domain='$domain';"
mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from aliases where source_domain='$domain' or destination_domain='$domain';"
aliases_menu
}

show_all_aliases()
{
check_database_exists
check_aliases=`mysql -u $database_user -D $database_name -e "select * from aliases;"`
check_aliases=`mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from aliases;"`
if [ "$check_aliases" == "" ];then
echo "No aliases in database!"
aliases_menu
fi
mysql -u $database_user -D $database_name -e "select * from aliases;"
mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from aliases;"
aliases_menu
}

Expand All @@ -465,7 +460,7 @@ add_user()

hash=`doveadm pw -s SHA512-CRYPT`

mysql -u $database_user -D $database_name -e "insert into accounts (username, domain, password, quota, enabled, sendonly) values ('$username', '$domain', '$hash', '$new_user_quota', '$new_user_enabled', '$new_user_sendonly');"
mysql -u $database_user -p"${database_password}" -D $database_name -e "insert into accounts (username, domain, password, quota, enabled, sendonly, autosent) values ('$username', '$domain', '$hash', '$new_user_quota', '$new_user_enabled', '$new_user_sendonly', '$new_user_autosent');"

printline
echo "User $username@$domain has been added!"
Expand All @@ -488,14 +483,31 @@ change_pass()
echo "Changing password"
echo "Type in your new password"
hash=`doveadm pw -s SHA512-CRYPT`
mysql -u $database_user -D $database_name -e "update accounts set password='$hash' where username='$user';"
echo "Password of user $user changed!"
mysql -u $database_user -p"${database_password}" -D $database_name -e "update accounts set password='$hash' where username='$username' and domain='$domain';"
echo "Password of user $username@$domain changed with password $hash!"
user_menu
else
user_menu
fi
}

change_autosent()
{
check_database_exists
read_username
read_domain
check_domain_exists $domain "user_menu"
check_user_exists $username $domain "user_menu"

echo "Editing $username@$domain auto sent status!"

echo "What do you want to change the autosent status to?"
read autoSentStatus
mysql -u $database_user -p"${database_password}" -D $database_name -e "update accounts set autosent=$autoSentStatus where username = '$username' AND domain = '$domain';"
echo "autosent satus of user $username@$domain has changed to $autoSentStatus!"
user_menu
}

delete_user()
{
check_database_exists
Expand All @@ -513,7 +525,7 @@ delete_user()
user_menu
fi

mysql -u $database_user -D $database_name -e "delete from accounts where username='$username' and domain='$domain';"
mysql -u $database_user -p"${database_password}" -D $database_name -e "delete from accounts where username='$username' and domain='$domain';"

printline
echo "User $username@$domain deleted!"
Expand All @@ -538,7 +550,7 @@ change_quota()

printline
echo "Changing quota for $username@$domain to $quota MB!"
mysql -u $database_user -D $database_name -e "update accounts set quota='$quota' where username='$username' and domain='$domain';"
mysql -u $database_user -p"${database_password}" -D $database_name -e "update accounts set quota='$quota' where username='$username' and domain='$domain';"
user_menu
}

Expand All @@ -547,12 +559,12 @@ change_quota()
show_domains()
{
check_database_exists
domains_exist=`mysql -u $database_user -D $database_name -e "select * from domains;"`
domains_exist=`mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from domains;"`
if [ "$domains_exist" == "" ]; then
echo "No domains in database!"
domain_menu
else
mysql -u $database_user -D $database_name -e "select * from domains;"
mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from domains;"
domain_menu
fi
}
Expand All @@ -561,7 +573,7 @@ show_domain_users()
{
read_domain
check_domain_exists $domain "domain_menu"
mysql -u $database_user -D $database_name -e "select * from accounts where domain='$domain';"
mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from accounts where domain='$domain';"
domain_menu
}

Expand All @@ -571,14 +583,14 @@ delete_domain()
read_domain
check_domain_exists $domain "domain_menu"

domain_user_exists=`mysql -u $database_user -D $database_name -e "select * from accounts where domain='$domain';"`
domain_user_exists=`mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from accounts where domain='$domain';"`
if [ "$domain_user_exists" != "" ]; then
echo "There are still users for that domain!"
echo "Please delete those users first!"
domain_menu
fi

alias_exists=`mysql -u $database_user -D $database_name -e "select * from aliases where source_domain='$domain' or destination_domain='$domain';"`
alias_exists=`mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from aliases where source_domain='$domain' or destination_domain='$domain';"`
if [ "$alias_exists" != "" ]; then
echo "There are still aliases for that domain!"
echo "Please delete those aliases first!"
Expand All @@ -593,7 +605,7 @@ delete_domain()
domain_menu
fi

mysql -u $database_user -D $database_name -e "delete from domains where domain='$domain';"
mysql -u $database_user -p"${database_password}" -D $database_name -e "delete from domains where domain='$domain';"

printline
echo "Domain $domain has been deleted!"
Expand All @@ -605,12 +617,12 @@ add_domain()
check_database_exists
read_domain

domain_exists=`mysql -u $database_user -D $database_name -e "select * from domains where domain='$domain';"`
domain_exists=`mysql -u $database_user -p"${database_password}" -D $database_name -e "select * from domains where domain='$domain';"`
if [ "$domain_exists" != "" ]; then
echo "Domain $domain exists!"
domain_menu
fi
mysql -u $database_user -D $database_name -e "insert into domains (domain) values ('$domain');"
mysql -u $database_user -p"${database_password}" -D $database_name -e "insert into domains (domain) values ('$domain');"
printline
echo "Domain $domain has been added"
domain_menu
Expand All @@ -626,7 +638,7 @@ if [ $database_user == "root" ]; then
fi
fi

database_exists=`mysql -e "show databases like '$database_name';"`
database_exists=`mysql -u $database_user -p"${database_password}" -e "show databases like '$database_name';"`
if [ "$database_exists" == "" ]; then
echo "It seems the database $database_name doesn't exist."
echo "You can initialize the database in the Database Management Menu"
Expand Down