#!/bin/sh # Custom start/stop script for ClamAV, MIMEDefang, and sendmail ############################################################################### ## ## Copyright (c) 2003 arr@oceanwave.com ## All rights reserved. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted provided that the following conditions ## are met: ## ## 1. Redistributions of source code must retain the above copyright ## notice, this list of conditions and the following disclaimer. ## 2. Redistributions in binary form must reproduce the above copyright ## notice, this list of conditions and the following disclaimer in the ## documentation and/or other materials provided with the distribution. ## 3. The name of the author may not be used to endorse or promote products ## derived from this software without specific prior written permission. ## ## THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ## IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ## OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN ## NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ## TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ## PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ## LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ## NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ## ############################################################################### TMPDIR=/tmp export TMPDIR ############################################################################### # ClamAV configuration and functions ############################################################################### CLAMAVPROG='clamd' CLAMAVDIR='/usr/local/sbin' CLAMAVCONF='/usr/local/etc/clamav.conf' CLAMAVPS=`pgrep $CLAMAVPROG` ##################################### clamav_stop() { ##################################### if [ "X$CLAMAVPS" != "X" ]; then pkill $CLAMAVPROG; echo "Shutting down $CLAMAVPROG" fi } ##################################### clamav_start() { ##################################### clamav_stop if [ -f $CLAMAVCONF -a -f $CLAMAVDIR/$CLAMAVPROG ]; then $CLAMAVDIR/$CLAMAVPROG && echo "Starting $CLAMAVPROG" return 0 else echo "Missing $CLAMAVCONF or $CLAMAVDIR/$CLAMAVPROG" return 1 fi } ##################################### clamav_restart() { ##################################### if [ -f $CLAMAVCONF -a -f $CLAMAVDIR/$CLAMAVPROG ]; then $CLAMAVDIR/$CLAMAVPROG reload && echo "Reloaded $CLAMAVPROG" return 0 else echo "Missing $CLAMAVCONF or $CLAMAVDIR/$CLAMAVPROG" return 1 fi } ############################################################################### # MIMEDefang configuration and functions ############################################################################### DEFANGRETVAL=0 MDEFANGPROG='mimedefang' MDEFANGSPOOL='/var/spool/MIMEDefang' MDEFANGPID="$MDEFANGSPOOL/$MDEFANGPROG.pid" MXMDEFANGPID="$MDEFANGSPOOL/$MDEFANGPROG-multiplexor.pid" # Is the mimedefang executable? We search in /usr/bin and /usr/local/bin. if [ -x /usr/local/bin/$MDEFANGPROG ] ; then MDEFANGDIR=/usr/local/bin elif [ -x /usr/bin/$MDEFANGPROG ] ; then MDEFANGDIR=/usr/bin elif [ -x /usr/local/bin/$MDEFANGPROG ] ; then MDEFANGDIR=/usr/local/bin else exit 0 fi # Locale should be set to "C" for generating valid date headers LC_ALL=C export LC_ALL MX_USER=defang MX_LOG=yes MX_MINIMUM=2 MX_MAXIMUM=10 MX_BUSY=600 # Source configuration if [ -f /etc/mail/$MDEFANGPROG.conf ] ; then . /etc/mail/$MDEFANGPROG.conf fi # Make sure required vars are set SOCKET=${SOCKET:=$MDEFANGSPOOL/$MDEFANGPROG.sock} MX_SOCKET=${MX_SOCKET:=$MDEFANGSPOOL/$MDEFANGPROG-multiplexor.sock} ##################################### mdefang_stop() { ##################################### # Stop daemon if test -f "$MDEFANGPID" ; then kill `cat $MDEFANGPID` DEFANGRETVAL=$? else DEFANGRETVAL=1 fi if [ $DEFANGRETVAL = 0 ] ; then echo "Shutting down $MDEFANGPROG" rm -f $MDEFANGPID > /dev/null 2>&1 rm -f $SOCKET > /dev/null 2>&1 fi # Stop daemon if test -f "$MXMDEFANGPID" ; then kill `cat $MXMDEFANGPID` DEFANGRETVAL=$? else DEFANGRETVAL=1 fi if [ $DEFANGRETVAL = 0 ] ; then echo "Shutting down $MDEFANGPROG-multiplexor" rm -f $MXMDEFANGPID > /dev/null 2>&1 rm -f $MX_SOCKET > /dev/null 2>&1 fi } ##################################### mdefang_start() { ##################################### mdefang_stop sleep 5 if [ "$MX_EMBED_PERL" = "yes" ] ; then EMBEDFLAG=-E else EMBEDFLAG="" fi $MDEFANGDIR/$MDEFANGPROG-multiplexor -p $MXMDEFANGPID \ $EMBEDFLAG \ `[ -n "$FILTER" ] && echo "-f $FILTER"` \ `[ -n "$SYSLOG_FACILITY" ] && echo "-S $SYSLOG_FACILITY"` \ `[ -n "$SUBFILTER" ] && echo "-F $SUBFILTER"` \ `[ -n "$MX_MINIMUM" ] && echo "-m $MX_MINIMUM"` \ `[ -n "$MX_MAXIMUM" ] && echo "-x $MX_MAXIMUM"` \ `[ -n "$MX_LOG_SLAVE_STATUS_INTERVAL" ] && echo "-L $MX_LOG_SLAVE_STATUS_INTERVAL"` \ `[ -n "$MX_USER" ] && echo "-U $MX_USER"` \ `[ -n "$MX_IDLE" ] && echo "-i $MX_IDLE"` \ `[ -n "$MX_BUSY" ] && echo "-b $MX_BUSY"` \ `[ -n "$MX_REQUESTS" ] && echo "-r $MX_REQUESTS"` \ `[ -n "$MX_SLAVE_DELAY" ] && echo "-w $MX_SLAVE_DELAY"` \ `[ -n "$MX_MIN_SLAVE_DELAY" ] && echo "-W $MX_MIN_SLAVE_DELAY"` \ `[ -n "$MX_MAX_RSS" ] && echo "-R $MX_MAX_RSS"` \ `[ -n "$MX_MAX_AS" ] && echo "-M $MX_MAX_AS"` \ `[ "$MX_LOG" = "yes" ] && echo "-l"` \ `[ "$MX_STATS" = "yes" ] && echo "-t /var/log/mimedefang/stats"` \ `[ "$MX_STATS" = "yes" -a "$MX_FLUSH_STATS" = "yes" ] && echo "-u"` \ `[ "$MX_STATS_SYSLOG" = "yes" ] && echo "-T"` \ `[ -n "$MX_QUEUE_SIZE" ] && echo "-q $MX_QUEUE_SIZE"` \ `[ -n "$MX_QUEUE_TIMEOUT" ] && echo "-Q $MX_QUEUE_TIMEOUT"` \ -s $MX_SOCKET DEFANGRETVAL=$? if [ $DEFANGRETVAL = 0 ] ; then echo "Starting $MDEFANGPROG-multiplexor" else echo "Starting $MDEFANGPROG-multiplexor FAILED" return 1 fi # Start mimedefang rm -f $SOCKET > /dev/null 2>&1 $MDEFANGDIR/$MDEFANGPROG -P $MDEFANGPID \ -m $MX_SOCKET \ `[ -n "$MX_USER" ] && echo "-U $MX_USER"` \ `[ -n "$SYSLOG_FACILITY" ] && echo "-S $SYSLOG_FACILITY"` \ `[ "$MX_RELAY_CHECK" = "yes" ] && echo "-r"` \ `[ "$MX_SENDER_CHECK" = "yes" ] && echo "-s"` \ `[ "$MX_RECIPIENT_CHECK" = "yes" ] && echo "-t"` \ `[ "$KEEP_FAILED_DIRECTORIES" = "yes" ] && echo "-k"` \ `[ "$MD_EXTRA" != "" ] && echo $MD_EXTRA` \ -p $SOCKET DEFANGRETVAL=$? if [ $DEFANGRETVAL = 0 ] ; then echo "Starting $MDEFANGPROG" else kill `cat $MXMDEFANGPID` return 1 fi return 0 } ##################################### mdefang_restart() { ##################################### if [ -r $MXMDEFANGPID ] ; then kill -INT `cat $MXMDEFANGPID` DEFANGRETVAL=$? if [ $DEFANGRETVAL = 0 ] ; then echo "Reloaded $MDEFANGPROG-multiplexor filter rules" else echo "Could not signal $MDEFANGPROG-multiplexor" fi else DEFANGRETVAL=1 echo "Could not find process-ID of $MDEFANGPROG-multiplexor" fi } ############################################################################### # sendmail configuration and functions ############################################################################### ERRMSG1='WARNING: /var/mail is NFS-mounted without setting actimeo=0,' ERRMSG2='this can cause mailbox locking and access problems.' SM_SERVER_PID_FILE="/var/run/sendmail.pid" SM_CLIENT_PID_FILE="/var/spool/clientmqueue/sm-client.pid" SM_DEFAULT_FILE="/etc/default/sendmail" SM_PS=`pgrep sendmail` ALIASES_FILE="/etc/mail/aliases" ##################################### check_queue_interval_syntax() { ##################################### default="15m" if [ $# -lt 1 ]; then answer=$default return fi if echo $1 | egrep '^([0-9]*[1-9][0-9]*[smhdw])+$' >/dev/null 2>&1; then answer=$1 else answer=$default fi } ##################################### sendmail_stop() { ##################################### if [ -f $SM_SERVER_PID_FILE ]; then kill `head -1 $SM_SERVER_PID_FILE` && echo "Shutting down sendmail daemon" rm -f $SM_SERVER_PID_FILE fi if [ -f $SM_CLIENT_PID_FILE ]; then kill `head -1 $SM_CLIENT_PID_FILE` && echo "Shutting down sendmail clientmqueue" rm -f $SM_CLIENT_PID_FILE fi if [ "X$SM_PS" != "X" ]; then /usr/bin/pkill -x -u 0 sendmail fi } ##################################### sendmail_start() { ##################################### sendmail_stop if [ -f /usr/lib/sendmail -a -f /etc/mail/sendmail.cf ]; then if [ ! -d /var/spool/mqueue ]; then /usr/bin/mkdir -m 0750 /var/spool/mqueue /usr/bin/chown root:bin /var/spool/mqueue fi if [ ! -f $ALIASES_FILE.db ] && [ ! -f $ALIASES_FILE.dir ] \ && [ ! -f $ALIASES_FILE.pag ]; then /usr/bin/newaliases fi MODE="-bd" [ -f $SM_DEFAULT_FILE ] && . $SM_DEFAULT_FILE if [ -n "$QUEUEOPTION" -a "$QUEUEOPTION" != "p" ]; then QUEUEOPTION="" fi if [ -z "$QUEUEOPTION" -o -n "$QUEUEINTERVAL" ]; then check_queue_interval_syntax $QUEUEINTERVAL QUEUEINTERVAL=$answer fi check_queue_interval_syntax $CLIENTQUEUEINTERVAL CLIENTQUEUEINTERVAL=$answer /usr/lib/sendmail $MODE -q$QUEUEOPTION$QUEUEINTERVAL $OPTIONS & /usr/lib/sendmail -Ac -q$CLIENTQUEUEINTERVAL $CLIENTOPTIONS & for i in $ETRN_HOSTS; do SERVER=`echo $i | /usr/bin/sed -e 's/:.*$//'` CLIENTS=`echo $i | /usr/bin/sed -n -e 's/,/ /g' \ -e '/:/s/^.*://p'` /usr/sbin/etrn $SERVER $CLIENTS >/dev/null 2>&1 & done echo "Starting sendmail" fi if /usr/bin/nawk 'BEGIN{s = 1} $2 == "/var/mail" && $3 == "nfs" && $4 !~ /actimeo=0/ && $4 !~ /noac/{s = 0} END{exit s}' /etc/mnttab; then /usr/bin/logger -p mail.crit "$ERRMSG1" /usr/bin/logger -p mail.crit "$ERRMSG2" fi } ##################################### sendmail_restart() { ##################################### [ -f $SM_SERVER_PID_FILE ] && kill -1 `head -1 $SM_SERVER_PID_FILE` && \ echo "Reloaded sendmail daemon" [ -f $SM_CLIENT_PID_FILE ] && kill -1 `head -1 $SM_CLIENT_PID_FILE` && \ echo "Reloaded sendmail clientmqueue" } # See how we were called. case "$1" in start) clamav_start && mdefang_start && sendmail_start ;; stop) clamav_stop mdefang_stop sendmail_stop ;; restart|reload|reread) clamav_restart && mdefang_restart && sendmail_restart ;; stop-clamav) clamav_stop ;; start-clamav) clamav_start ;; restart-clamav) clamav_restart ;; stop-mdefang) mdefang_stop ;; start-mdefang) mdefang_start ;; restart-mdefang) mdefang_restart ;; stop-sendmail) sendmail_stop ;; start-sendmail) sendmail_start ;; restart-sendmail) sendmail_restart ;; *) echo "Usage: $0 {start|stop|restart|{start-|stop-|restart-{clamav|mdefang|sendmail}}}" esac