-#!/bin/sh
-
-# amavisd-cn /etc/init.d/ initscript wrapper for CARNetized amavisd-new
-#
-# Start and stop Amavis, ClamAV and Postfix/Sendmail
-
-### BEGIN INIT INFO
-# Provides: amavisd-cn
-# Required-Start: $local_fs $remote_fs $syslog $named $network $time
-# Required-Stop: $local_fs $remote_fs $syslog $named $network
-# Should-Start:
-# Should-Stop:
-# Default-Start: 2 3 4 5
-# Default-Stop: 0 1 6
-# Short-Description: start and stop Amavis, ClamAV and Postfix/Sendmail
-# Description: wrapper for starting/stopping MTA and related services
-### END INIT INFO
-
-set -e
-
-# options for daemons:
-# name init.d/script user ps name for pgrep -f pidfile, relative to /var/run num-fds last-fd-name
-options='
-clamd clamav-daemon clamav /usr/sbin/clamd clamav/clamd.pid 5 clamav.log
-amavis amavis.amavisd-new amavis amavisd \\(master\\) amavis/amavisd.pid 5 socket
-'
-# note: pgrep -f takes a regexp, and this is shell expanded once, hence \\
-
-start () {
- local daemon IFSOLD name script user psname pidfile num fdname
- daemon="$1"
- IFSOLD="$IFS"
- IFS=" " # tab
- read name script user psname pidfile num fdname <<-EOPTS
- $(echo "$options" | sed 's/ */ /g' | grep ^$daemon)
- EOPTS
- IFS="$IFSOLD"
- /etc/init.d/$script start
- wait_for_fds "$daemon"
-}
-
-stop () {
- local daemon IFSOLD name script user psname pidfile num fdname
- daemon="$1"
- n=10
- IFSOLD="$IFS"
- IFS=" " # tab
- read name script user psname pidfile num fdname <<-EOPTS
- $(echo "$options" | sed 's/ */ /g' | grep ^$daemon)
- EOPTS
- IFS="$IFSOLD"
- /etc/init.d/$script stop
- pkill -u $user -f "$psname" > /dev/null || true
- while pgrep -u $user -f "$psname" > /dev/null && [ "$n" -gt 0 ]
- do
- sleep 1
- n=$(($n-1))
- done
- pkill -9 -u $user -f "$psname" > /dev/null || true
- #pkill -9 -u $user -x "$daemon"
- if pgrep -u $user -f "$psname" > /dev/null; then # still there?
- return 1
- fi
-}
-
-wait_for_fds () {
- # wait until process shows some I/O readiness :)
- local name IFSOLD num sleep maxtry script user psname pidfile fdname
- name="$1"
- [ -z "$name" ] && return 1
- IFSOLD="$IFS"
- IFS=" " # tab
- read name script user psname pidfile num fdname <<-EOPTS
- $(echo "$options" | sed 's/ */ /g' | grep ^$name)
- EOPTS
- IFS="$IFSOLD"
- num=${num:-4}
- sleep=${sleep:-1}
- maxtry=${maxtry:-90}
- if [ -n "$pidfile" ]; then
- pidfile=/var/run/$pidfile
- findpid="[ -f $pidfile ] && cat $pidfile || true"
- else
- findpid="pgrep -u $user -f \"$psname\" -P 1 | head -1"
- fi
-
- # loop the loop the loop
- try=1
- while /bin/true
- do
- sleep $sleep # 1st, give it a chance to run
- pid=`eval $findpid` # 2nd: find it
- if [ ! -z "$pid" ]; then
- count=`ls -1 /proc/$pid/fd 2>/dev/null| wc -l` # 3rd: count all it's worth
- [ "$count" -ge "$num" ] && ls -l /proc/$pid/fd | grep -q $fdname \
- && return # success -- release
- fi
- try=$(($try+1))
- [ "0$try" -ge "0$maxtry" ] && return 1 # no luck this time
- done
-}
-
-# if we're called as amavisd-cn or amavis with start argument,
-# act like one; otherwise, pass the call down
-case "$(basename $0)" in
- amavisd-cn)
- arg="i$1"
- ;;
- amavis)
- if [ "$1" = start ]; then
- arg="i$1"
- else
- arg="$1"
- fi
- ;;
- *)
- arg="$1"
- ;;
-esac
-
-# If there's no diversion, play possum
-[ -x /etc/init.d/amavis.amavisd-new ] || exit 0
-
-mta=postfix
-
-case "$arg" in
- start|stop|restart|reload|force-reload|debug)
- /etc/init.d/amavis.amavisd-new "$arg"
- ;;
-
- istart)
- start clamd
- start amavis
- if [ -x "/etc/init.d/$mta" ]; then
- if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
- invoke-rc.d $mta start
- else
- /etc/init.d/$mta start
- fi
- fi
- ;;
-
- istop)
- if [ -x "/etc/init.d/$mta" ]; then
- if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
- invoke-rc.d $mta stop
- else
- /etc/init.d/$mta stop
- fi
- fi
- stop amavis
- stop clamd
- ;;
-
- irestart|ireload|iforce-reload)
- $0 stop
- sleep 2
- $0 start
- ;;
-
- *)
- echo "Usage: $0 {start|stop|restart|reload|force-reload}" >&2
- exit 1
- ;;
-esac
-
-exit 0