I have just installed dbmail (yesterday) - other than the README and EXTRAS
files that came with the install (which in all honesty I do not even fully
understand), what is the best way of getting it going?  Is there any kind of
tutorial/reference yet?

Mmm. Try reading the manpages maybe ? Especially dbmail-adduser will be of interest I suspect. I've written a simple dialog based gui once. Nothing fancy, and far from web-based. But it works as well as dbmail-adduser :-/

Try it. It doth require dialog which I expect to be available on OSX as well.

Keep the faith. Getting a grip on unix is not as difficult as many hard-ass geeks make it out to be. The learning curve maybe somewhat steeper than for most run of the mill guis. But then again, learning to write was also definitely more of a hassle than drawing, way back in elementary school, I'm sure.

--
  ________________________________________________________________
  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.2 2003/03/18 13:40:52 paul Exp $

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"
        return $?
}       
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.
        pw=`pwgen -nac 7 1 2>/dev/null`
        [ -n "$pw" ] && { echo $pw; return $?; }
        pw=`mkpasswd --chars 6 2>/dev/null`
        [ -n "$pw" ] && { echo $pw; 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

Reply via email to