Hi all,
Here's another dialog based management tool for dbmail inspired by
Alejandro's posting of dbmail.sh yesterday. I decided to follow up
on it by writing my own version to satisfy my own tastes, needs and
coding style, and probably be useful to some of you as well.
It doesn't require postfix to run. Nor does it try to be smart about
multiple domain issues. I'm not convinced those issues belong in dbmail
proper given that a dbmail instance might well be on a host other than
the relavant mta host. It does however try to give a friendlier face to
all aspects of dbmail-adduser and dbmail-maintenance.
Hope you like it.
give it a whirl if you please :-)
--
________________________________________________________________
Paul Stevens mailto:[EMAIL PROTECTED]
NET FACILITIES GROUP PGP: finger [EMAIL PROTECTED]
The Netherlands________________________________http://www.nfg.nl
#!/bin/sh
# dbmailctl
#
# Simple dialog based wrapper for the dbmail-adduser usermanagement
# utility for dbmail (www.dbmail.org)
#
# Licence: GPL (www.gnu.org)
# Author: Paul J Stevens <[EMAIL PROTECTED]>
#
# (c) 2003, NFG Net Facilities Group BV, Utrecht NL.
#
# $Id: dbmailctl,v 1.1.2.10 2003/03/13 23:38:01 paul Exp $
umask 0266
LOGFILE="/var/log/dbmail/dbmailctl.log"
[ -d `dirname "$LOGFILE"` ] || install -d -m 0700 -o root -g root `dirname
$LOGFILE` &>/dev/null
[ -e "$LOGFILE" ] || install -m 0600 -o root -g root /dev/null $LOGFILE
&>/dev/null
# some basic helpers
call() {
_cmd="$*"
dolog "$_cmd"
eval "$_cmd"
}
dolog() {
# record all transactions
[ -w "$LOGFILE" ] || abort "$LOGFILE in unwriteable"
_msg="$*"
now=`date +"%b %d %H:%M:%S"`
echo "$now $HOST "`basename $0`"[$$] $_msg" >> $LOGFILE
}
abort() {
echo "ABORT: $*"; exit
}
simple_password() {
# very weak password (more like a PIN)
tmpfile=`tempfile`
date +%N > $tmpfile; md5sum $tmpfile|sed 's/[0-9]//g'|cut -b -4
rm -f $tmpfile
}
init_password() {
# select a nice password generator.
# first sucessfull one wins, fallback to
# internal gobbledeegook generator.
call "pwgen -nac 7 1" 2>/dev/null && return
call "mkpasswd --chars 6" 2>/dev/null && return
# fallback
simple_password
}
## dialog GUI functions
set_title() {
export TITLE="$*"
}
get_dialog_opts() {
OPTS="--backtitle \"DBMAIL Management\" --cr-wrap"
[ -n "$TITLE" ] && OPTS="$OPTS --title \"$TITLE\""
export OPTS
}
# widgets
input() {
_var=$1; shift; _msg="$*"
get_dialog_opts
result=`tempfile`
eval "old_var=\$$_var"
eval "dialog $OPTS --inputbox \"\n$_msg\n\" 10 70 \"$old_var\""
2>$result || return 1
_new=`cat $result`
eval "$_var=\"$_new\""
rm -f $result
}
confirm() {
_msg="$*"
get_dialog_opts
[ -e "$_msg" ] && _msg=`cat $_msg`
eval "dialog $OPTS --yesno \"\n$_msg\n\" 10 70"
return $?
}
message() {
_msg="$*"
get_dialog_opts
boxtype="--msgbox \"\n$_msg\n\""
[ -e "$_msg" ] && boxtype="--tailbox $_msg"
eval "dialog $OPTS $boxtype 25 70"
}
menu() {
_var=$1; shift;
_opt=""
_idx=1
eval "text=\$TEXT"
while `true`; do
label="$1"; shift
[ -n "$label" ] || break
help=""
eval "help=\$HELP_$label"
_opt="$_opt $_idx $label \"$help\""
eval "item[$_idx]=$label"
let _idx=_idx+1
done
get_dialog_opts
result=`tempfile`
eval "dialog --item-help $OPTS --menu \"\n$text\n\" 10 70 0 $_opt"
2>$result || return 1
_sel=`cat $result`
rm -f $result
eval "$_var=${item[$_sel]}"
}
## DBMAIL
main_menu() {
dolog "Start dbmailctl session: `whoami`"
dbmail-adduser quiet s &>/dev/null || abort "Unable to communicate with
the dbmail server"
HELP_maintenance="Do integrity checking and cleaning up of tables"
HELP_users="Perform all sorts of user maintenance"
while `true`; do
TITLE="DBMAIL Main Menu"
TEXT="Welcome to dbmailctl"
menu "manage" maintenance users || break
eval "manage_$manage"
done
dolog "Finish dbmailctl session: `whoami`"
}
manage_maintenance() {
HELP_vacuum="performs internal cleaning-up on the tables"
HELP_integrity="checks integrity"
HELP_repair="checks integrity and tries to fix problems"
HELP_purge="purge messages have the DELETE status set"
HELP_delete="set DELETE status for deleted messages"
while `true`; do
TITLE="DBMAIL Maintenance"
TEXT=$HELP_maintenance
menu "maintain" vacuum integrity repair purge delete || return 1
eval "maintain_$maintain" || return 1
done
}
maintain_vacuum() {
tmpfile=`tempfile`
TITLE=$HELP_vacuum
dbmail-maintenance -c &> $tmpfile
message $tmpfile
}
maintain_integrity() {
tmpfile=`tempfile`
TITLE=$HELP_integrity
dbmail-maintenance -i &> $tmpfile
message $tmpfile
}
maintain_repair() {
tmpfile=`tempfile`
TITLE=$HELP_repair
dbmail-maintenance -f &> $tmpfile
message $tmpfile
}
maintain_purge() {
tmpfile=`tempfile`
TITLE=$HELP_purge
dbmail-maintenance -p &> $tmpfile
message $tmpfile
}
maintain_delete() {
tmpfile=`tempfile`
TITLE=$HELP_delete
dbmail-maintenance -d &> $tmpfile
message $tmpfile
}
manage_users() {
HELP_add="add a user"
HELP_edit="change user attributes"
HELP_delete="remove a user and associated mailboxes"
while `true`; do
TITLE="DBMAIL Usermanagement"
TEXT=$HELP_users
menu "users" add edit delete || break
eval "users_$users"
done
}
users_add() {
username=""
aliases=""
password=`init_password`
clientid=0; maxmail=0
while `true`; do
while `true`; do
input username "Username" || return 1
valid_username "$username" && break
message "$username is already in use"
done
input password "Password" || return 1
input clientid "Client id" || return 1
input maxmail "Email quota in MB. Use 0 for no quota limit." ||
return 1
maxmail=`echo $maxmail|sed 's/[ [:alpha:]]//g'`M
input aliases "Email address" || return 1
msg=`tempfile`
cat >> $msg << EOM
-----------------------------------------------------------------
confirm dbmail user setup:
-----------------------------------------------------------------
login : $username
password : $password
clientid : $clientid
maxmail : $maxmail
aliases : $aliases
-----------------------------------------------------------------
EOM
confirm $msg && break
confirm "re-edit ?" && continue
return 1
done
call dbmail-adduser quiet a "$username" "{crypt:}$password" "$clientid"
"$maxmail" "$aliases"
case "$?" in
0) message "user succesfully added"; break;;
1) message "adding user failed"; break;;
esac
return 0
}
users_edit() {
user_select
[ -n "$username" ] || return 1
HELP_username="change username"
HELP_password="change password"
HELP_clientid="change clientid"
HELP_maxmail="change maximum mail quotum"
HELP_aliases="change aliases"
while `true`; do
TITLE="Manage user"
TEXT=$HELP_edit
menu "attributes" username password clientid maxmail aliases ||
break
eval "edit_${attributes} $username" || return 1
done
}
users_delete() {
user_select
[ -n "$username" ] || return 1
confirm "empty mailboxes owned by user: $username?" && call
dbmail-adduser quiet e "$username"
confirm "delete user: $username?" && call dbmail-adduser quiet d
"$username"
}
edit_username() {
username="$1"
oldname=$username
while `true`; do
input username "new username" || return 1
valid_username "$username" && break
message "$username already in use"
done
call dbmail-adduser quiet c "$oldname" -u "$username"
}
edit_password() {
username="$1"
password=`init_password`
input password "new password" || return 1
call dbmail-adduser quiet c "$username" +p "$password"
}
edit_clientid() {
username="$1"
clientid=`get_client_id $username`
input clientid "new clientid" || return 1
call dbmail-adduser quiet c "$username" -c "$clientid"
}
edit_maxmail() {
username="$1"
maxmail=`get_max_mail $username`
input maxmail "new mail quota in MB" || return 1
maxmail=`echo $mailmail | sed 's/[ [:alpha:]]//g'`
call dbmail-adduser quiet c "$username" -q "${maxmail}M"
}
edit_aliases() {
username="$1"
HELP_add="add alias for $username"
HELP_delete="Remove alias for $username"
while `true`; do
TITLE="Manage aliases"
TEXT=$HELP_aliases
menu "aliases" add delete || break
eval "alias_$aliases $username"
done
}
alias_add() {
username="$1"
input newalias "new alias for $username" || return 1
call dbmail-adduser quiet c "$username" +a "$newalias"
}
alias_delete() {
username="$1"
menu "delete_alias" `get_aliases $username` || return 1
confirm "delete address [$delete_alias] for $username ?" || return 1
call dbmail-adduser quiet c "$username" -a "$delete_alias"
}
user_select() {
username=""
TEXT="Select a username"
menu "username" `get_user_list` || return 1
}
# some query functions
get_user_list() {
dbmail-adduser s | tail +7 | sed 's/\[\(.*\)\]/\1/g'
}
get_client_id() {
username="$1"
dbmail-adduser s $username | grep -i 'client id' | cut -f2 -d: | sed
's/ //g'
}
get_max_mail() {
username="$1"
dbmail-adduser s "$username" | grep -i '^max.' | cut -f2 -d: | sed 's/[
[:alpha:]]//g'
}
get_aliases() {
username="$1"
dbmail-adduser s "$username" | sed --silent '/^Aliases/,//p' | tail
+2|grep -v '^$'
}
valid_username() {
username="$1"
err_username=""
for u in `get_user_list`; do
if [ "$u" == "$username" ]; then
err_username="$username"
break;
fi
done
[ -n "$err_username" ] && return 1
return 0
}
[ `basename $0` == "dbmailctl" ] && main_menu
exit 0
# gui testcode
menu "simple" itemA itemB itemC
name="test"; input name "new name"
confirm "show file?" && file="$0"; message $file
#EOF