#!/bin/sh # Description: Script to remotely add, remove or list qmail alias addresses: # http://netdevice.com/qmail/patch/qtool-06.script # Run from an OS X machine, assumes that ssh passphraseless # public key authentication has been set up. # Needs qaset-06.script running from cron on the mailservers. # Usage: ~/qtool-06.script # Author: Eben Pratt, goodrcptto at netdevice dot com # 2003-09-02 01: Original version. # 2003-10-04 02: Added support for protected accept client addresses. # User to domain mapping is contained in the staged alias file. # 2003-11-07 03: Disable X11 forwarding to suppress notice regarding xauth, when # X11 forwarding is set to be requested by default on OS X 10.3. # 2004-01-12 04: The list option correctly displays dotted recipient addresses. # 2004-05-16 05: This script updates the primary, rsynced to the secondary. # 2004-09-28 06: Updated to allow off network functionality. # User specific edit required; USR='maryjane' DOM='example.com' # MS0='example.com' MS1='sun01' MS2='sun02' LIS='/bin/ls' RMV='/bin/rm' SED='/bin/sed' NUL='/dev/null' CUT='/bin/cut -d' TRA='/usr/bin/tr' EGR='/usr/bin/egrep' IFC='/usr/sbin/ifconfig hme0' SSH='/usr/bin/ssh -x -l '${USR}'' QMA='/var/qmail/alias/.qmail-' QMS='/var/qmail/stage/*/.qmail-' QMN='/var/qmail/stage/normal' QMP='/var/qmail/stage/protected' SHO='/var/qmail/bin/qmail-showctl' echo "" if [ `${SSH} ${MS0} "/bin/cat /etc/nodename" 2>${NUL}` = ${MS1} ] ; then echo "The mail server is running on ${MS1}." elif [ `${SSH} ${MS0} "/bin/cat /etc/nodename" 2>${NUL}` = ${MS2} ] ; then echo "The mail server is running on ${MS2}." else echo "The mail server is unreachable, please try again." exit 0 fi qtool() { printf "\nOptions are to [a]dd, [r]emove, or [l]ist your alias addresses: " read RES if [ "${RES}" = a ] ; then printf "\nOptions are to add a [n]ormal or [p]rotected alias address: " read ADD if [ "${ADD}" = n ] ; then printf "\nAdd [ ]@"${DOM}": " read NOR ALA=`echo ${NOR} | ${TRA} -d '[:space:]'` if [ `echo ${ALA} | ${EGR} '@'` ] ; then echo "" echo "Please only enter the part before the @ character." echo "" exit 0 elif [ `echo ${ALA} | ${EGR} '[^a-zA-Z0-9._-]'` ] ; then echo "" echo "Please only use letters, numbers, dots, underscores or dashes." echo "" exit 0 elif [ `echo ${ALA} | ${EGR} '[a-zA-Z0-9._-]'` ] ; then ALS=`echo ${ALA} | ${TRA} '[:upper:]' '[:lower:]' | ${TRA} '.' ':'` if [ `${SSH} ${MS0} "${LIS} ${QMS}* | ${EGR} .qmail-"${ALS}"$" 2>${NUL}` \ ] ; then OWN=`${SSH} ${MS0} "${LIS} -o ${QMS}"${ALS}$" | ${CUT} ' ' -f 5" \ 2>${NUL}` echo "" echo "That alias already exists, "${OWN}" is using it." echo "" exit 0 else ${SSH} ${MS0} "echo \&"${USR}"@"${DOM}" > ${QMN}/.qmail-"${ALS}"" \ 2>${NUL} YES=0 while [ ${YES} -ne 1 ] do sleep 10 if [ `${SSH} ${MS0} "${LIS} ${QMA}* | ${EGR} .qmail-"${ALS}"$" \ 2>${NUL}` ] ; then sleep 10 echo "" ${SSH} ${MS0} "${SHO} | ${EGR} ' ${ALA}'@'${DOM}'." 2>${NUL} echo "" YES=1 fi done fi else echo "" exit 0 fi elif [ "${ADD}" = p ] ; then printf "\nPlease remove the normal alias, then add it as a protected one. Messages will be rejected to this address unless the qmail administrator has responded to your request to allow the sender's IPs. Add [ ]@"${DOM}": " read PRO ALA=`echo ${PRO} | ${TRA} -d '[:space:]'` if [ `echo ${ALA} | ${EGR} '@'` ] ; then echo "" echo "Please only enter the part before the @ character." echo "" exit 0 elif [ `echo ${ALA} | ${EGR} '[^a-zA-Z0-9._-]'` ] ; then echo "" echo "Please only use letters, numbers, dots, underscores or dashes." echo "" exit 0 elif [ `echo ${ALA} | ${EGR} '[a-zA-Z0-9._-]'` ] ; then ALS=`echo ${ALA} | ${TRA} '[:upper:]' '[:lower:]' | ${TRA} '.' ':'` if [ `${SSH} ${MS0} "${LIS} ${QMS}* | ${EGR} .qmail-"${ALS}"$" 2>${NUL} \ ` ] ; then OWN=`${SSH} ${MS0} "${LIS} -o ${QMS}"${ALS}$" | ${CUT} ' ' -f 5" \ 2>${NUL}` echo "" echo "That alias already exists, "${OWN}" is using it." echo "" exit 0 else ${SSH} ${MS0} "echo \&"${USR}"@"${DOM}" > ${QMP}/.qmail-"${ALS}"" \ 2>${NUL} YES=0 while [ ${YES} -ne 1 ] do sleep 10 if [ `${SSH} ${MS0} "${LIS} ${QMA}* | ${EGR} .qmail-"${ALS}"$"` \ 2>${NUL} ] ; then sleep 10 echo "" ${SSH} ${MS0} "${SHO} | ${EGR} ' ${ALA}'@'${DOM}'." 2>${NUL} echo "" YES=1 fi done fi else echo "" exit 0 fi else echo "" exit 0 fi elif [ "${RES}" = r ] ; then printf "\nRemove [ ]@"${DOM}": " read REM ALR=`echo ${REM} | ${TRA} -d '[:space:]'` if [ `echo ${ALR} | ${EGR} '@'` ] ; then echo "" echo "Please only enter the part before the @ character." echo "" exit 0 elif [ `echo ${ALR} | ${EGR} '[^a-zA-Z0-9._-]'` ] ; then echo "" echo "Please only use letters, numbers, dots, underscores or dashes." echo "" exit 0 elif [ `echo ${ALR} | ${EGR} '[a-zA-Z0-9._-]'` ] ; then ALS=`echo ${REM} | ${TRA} '[:upper:]' '[:lower:]' | ${TRA} '.' ':'` if [ `${SSH} ${MS0} "${LIS} ${QMS}* | ${EGR} .qmail-"${ALS}"$" 2>${NUL}` \ ] ; then OWN=`${SSH} ${MS0} "${LIS} -o ${QMS}"${ALS}$" | ${CUT} ' ' -f 5" \ 2>${NUL}` if [ "${OWN}" = "${USR}" ] ; then ${SSH} ${MS0} "${RMV} ${QMS}${ALS}" 2>${NUL} YES=0 while [ ${YES} -ne 1 ] do sleep 10 if [ `${SSH} ${MS0} "${LIS} ${QMA}* | ${EGR} .qmail-"${ALS}"$" \ 2>${NUL}` ] ; then sleep 10 else echo "" echo "Alias removed." echo "" YES=1 fi done else echo "" echo "That alias is owned by "${OWN}"." echo "" exit 0 fi else echo "" echo "That alias doesn't exist." echo "" exit 0 fi else echo "" exit 0 fi elif [ "${RES}" = l ] ; then echo "" echo "Normal:" for LIN in `${SSH} ${MS0} "${EGR} \&"${USR}"@"${DOM}" ${QMN}/.qmail-* \ | ${CUT}- -f2- | ${SED} 's/:&/@/g' | ${CUT}@ -f1 | ${TRA} ':' '.'" 2>${NUL}` do echo "SMTP clients may send to ${LIN}@${DOM}." done echo "" echo "Protected:" for LIN in `${SSH} ${MS0} "${EGR} \&"${USR}"@"${DOM}" ${QMP}/.qmail-* \ | ${CUT}- -f2- | ${SED} 's/:&/@/g' | ${CUT}@ -f1 | ${TRA} ':' '.'" 2>${NUL}` do echo "SMTP accept clients may send to ${LIN}@${DOM}." done echo "" else echo "" exit 0 fi } qtool