#!/bin/bash 
# $Id: setmailrelay,v 1.7 2003/12/07 11:21:25 andrew Exp $
#
# This script was written originally by Jos Visser http://www.josv.com/~josv/
# and I have modified it a little to make it slightly more generic
#    - Andrew McMillan 10 August 1999
# Postfix support by Chris Halls, August 2001
# Exim support by Auke Jilderda, October 2002
# qmail support by Patrice Neff, October 2003
#
# Usage:
#   setmailrelay none   
#       - You have a permanent internet connection, do not use a mail relay
#   setmailrelay <relay>
#       - Relay to specified host
#   setmailrelay queue [<relay>]
#       - Do not send, place on the queue.  When the queue is flushed, mail
#         will be relayed to <relay>, or $DEFAULT_RELAY if not specified


# Where are the config files for your mailer?  Can override in mail-relay.conf
SENDMAIL_CONFFILE=/etc/mail/sendmail.cf
POSTFIX_CONFFILE=/etc/postfix/main.cf
EXIM_CONFFILE=/etc/exim/exim.conf
QMAIL_CONFDIR=/etc/qmail/

# Where we get MAIL_SERVER and DEFAULT_RELAY from
. /etc/whereami/mail-relay.conf

RELAY="${1:-none}"
QUEUE_RELAY="${2:-${DEFAULT_RELAY}}"

# check for a "parameter=" line in a file, add it if it does not exist
#    check_for_line(file, parameter)
check_for_parameter()
{
    FILE="$1"
    PARAM="$2"

    if egrep -q "^$PARAM *=" "$FILE" ; then :
    else
        echo "$PARAM=" >> "$FILE"
    fi
}

if [ "$MAIL_SERVER" = "" ]; then
  # Go for some reasonable choices
  if [ -f $SENDMAIL_CONFFILE ] ; then
    MAIL_SERVER=sendmail
  elif [ -f $POSTFIX_CONFFILE ] ; then
    MAIL_SERVER=postfix
  elif [ -f $EXIM_CONFFILE ] ; then
    MAIL_SERVER=exim
  elif [ -d $QMAIL_CONFDIR ] ; then
    MAIL_SERVER=qmail
  else
    echo "Unsupported mail server configuration check /etc/whereami/mail-relay.conf"
    echo "or advise awm@debian.org, hopefully including a patch!"
    exit 1
  fi
fi

echo "Setting mail relay host ($RELAY)" 


case "$MAIL_SERVER" in
  sendmail)
        /etc/init.d/sendmail stop

        if [ "$RELAY" = "none" ]; then 
                MODE=background 
                QUEUE_RUN="-q5m" 
                RELAY=""
        elif [ "$RELAY" = "queue" ]; then 
                MODE=deferred 
                QUEUE_RUN="" 
                RELAY="smtp:${DEFAULT_RELAY}"
        else 
                MODE=background 
                QUEUE_RUN="-q5m" 
                RELAY="smtp:$RELAY" 
        fi


        sed -e "s/^DS.*\$/DS$RELAY/" \
            -e "s/^O DeliveryMode=.*\$/O DeliveryMode=$MODE/" \
            <$SENDMAIL_CONFFILE >$SENDMAIL_CONFFILE.N

        # Make a backup copy
        mv -f $SENDMAIL_CONFFILE $SENDMAIL_CONFFILE.whereami

        mv $SENDMAIL_CONFFILE.N $SENDMAIL_CONFFILE

        /etc/init.d/sendmail start
        if [ "$QUEUE_RUN" = "-q5m"]; then
                /etc/init.d/sendmail runq
        fi
    ;;

  postfix)
        if [ "$RELAY" = "none" ]; then 
                DEFER=""
                DISABLE_LOOKUPS="no"
                RELAY=""
        elif [ "$RELAY" = "queue" ]; then 
                DEFER="smtp"
                DISABLE_LOOKUPS="yes"
                RELAY="$DEFAULT_RELAY"
        else 
                DEFER=""
                DISABLE_LOOKUPS="yes"
                MODE=background 
                RELAY="$RELAY"
        fi

        # Add paramters to config file if they do not exist
        check_for_parameter $POSTFIX_CONFFILE "defer_transports"
        check_for_parameter $POSTFIX_CONFFILE "disable_dns_lookups"
        check_for_parameter $POSTFIX_CONFFILE "relayhost"

        sed -e "s/^defer_transports *=.*\$/defer_transports=$DEFER/" \
            -e "s/^disable_dns_lookups *=.*\$/disable_dns_lookups=$DISABLE_LOOKUPS/" \
            -e "s/^relayhost *=.*\$/relayhost=$RELAY/" \
            < $POSTFIX_CONFFILE > $POSTFIX_CONFFILE.N

        # Make a backup copy
        mv -f $POSTFIX_CONFFILE $POSTFIX_CONFFILE.whereami

        mv $POSTFIX_CONFFILE.N $POSTFIX_CONFFILE

        # Reload config
        /etc/init.d/postfix reload

        if [ "$RELAY" != "queue" ]; then
            # Run mail queue
            /etc/init.d/postfix flush
        fi
    ;;

  exim)
        if [ "$RELAY" = "none" ]; then 
                DEFER="# queue_remote_domains = *"
                RELAY="$DEFAULT_RELAY"
        elif [ "$RELAY" = "queue" ]; then 
                DEFER="queue_remote_domains = ! *"
                RELAY="$DEFAULT_RELAY"
        else 
                DEFER="# queue_remote_domains = *"
                RELAY="$RELAY"
        fi

        # add parameters to configuration file if they do not exist
        #check_for_parameter $EXIM_CONFFILE "queue_remote_domains"
        #check_for_parameter $EXIM_CONFFILE "route_list"

        sed -e "s/^.*queue_remote_domains *=.*\$/$DEFER/" \
            -e "s/route_list *=.*\$/route_list = \"* $RELAY bydns_a\"/" \
            < $EXIM_CONFFILE > $EXIM_CONFFILE.N

        # make a backup copy of configuration file
        mv -f $EXIM_CONFFILE $EXIM_CONFFILE.whereami
        mv $EXIM_CONFFILE.N $EXIM_CONFFILE

        # reload configuration
        /etc/init.d/exim reload

        if [ "$RELAY" != "queue" ]; then
            # flush queued mails
            exim -qff
        fi
    ;;

  qmail)
        QMAIL_CONFFILE="${QMAIL_CONFDIR}smtproutes"
        QMAIL_CONFFILE_NEW="${QMAIL_CONFFILE}.setmailrelay"
	        
        if [ "$RELAY" = "none" ]; then 
                DELIVERIES="20"
                RELAY="$DEFAULT_RELAY"
        elif [ "$RELAY" = "queue" ]; then 
                DELIVERIES="0"
                RELAY="$DEFAULT_RELAY"
        else 
                DELIVERIES="20"
                RELAY="$RELAY"
        fi

        if [ -e $QMAIL_CONFFILE ]; then
	        grep -v ':[^:]*' $QMAIL_CONFFILE >$QMAIL_CONFFILE_NEW
        else
	        >$QMAIL_CONFFILE_NEW
	fi
	[ -n "$RELAY" ] && echo "$RELAY" >>$QMAIL_CONFFILE_NEW
	mv $QMAIL_CONFFILE_NEW $QMAIL_CONFFILE
	echo $DELIVERIES >"${QMAIL_CONFDIR}concurrencyremote"
	/etc/init.d/qmail restart
    ;;

  *)
      echo "Unrecognised mail server type"
    ;;
esac

