#!/bin/bash
# kavmilterd	Control KAVMilter mail scanning service.
#
# chkconfig:	2345 80 35
# description: 	KAV4MailServers - Sendmail Milter filter.
# processname: kavmilter
# config: /etc/kav/5.0/kavmilter/kavmilter.conf
# pidfile: /var/db/kav/5.0/kavmilter/run/kavmilter.pid
#
### BEGIN INIT INFO
# Provides: kavmilter
# Required-Start: $network $syslog
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 
# Description: KAV4Mailservers - Sendmail milter filter.
### END INIT INFO
#
# $Id: init.kavmilterd,v 1.17 2004/09/06 08:45:44 teo Exp $


. /etc/rc.d/init.d/functions
. /etc/sysconfig/network

KOPT=/opt/kav/5.0/kavmilter
KBIN=$KOPT/bin
KVAR=/var/db/kav/5.0/kavmilter
KETC=/etc/kav/5.0/kavmilter
PATH=$KBIN:$PATH

export PATH KBIN KVAR KETC PATH

# Check that networking is up.
[ ${NETWORKING} = "no" ] && {
  echo "Networking is not up. Exiting."
  exit 0
}

mypidofproc()
{
  cmd=${1:-kavmilter}
  cmdname=$(basename $cmd)
  pid=
  if [ -f $KVAR/run/$cmdname.pid ]; then
    pid=$(cat $KVAR/run/$cmdname.pid)
  fi

  if [ -n "$pid" ]; then
    kill -0 $pid 2>/dev/null || pid=""
  fi
  
  if [ -z "$pid" ]; then
    pid=$(pidofproc $cmd)
  fi

  echo $pid
}

check()
{
  d_name=$1
  d_opt=${2:-""}
  d_cmd=${3:-$KBIN/$d_name}
  pid=$(mypidofproc $d_cmd)
  status=1
  [ -n "$pid" ] && status=$(kill -0 $pid 2>/dev/null && echo 0 || echo 1)
  return $status
}

status()
{
  pid=$(mypidofproc kavmilter)
  status=1
  [ -n "$pid" ] && status=$(kill -0 $pid 2>/dev/null && echo 0 || echo 1)
  states=("running (pid:$pid)..." "not running!")
  echo "KAVMilter is "  ${states[$status]}
  return $status
}

stop() 
{
  d_name=$1

  printf "Shutting down %-50s:" "$d_name"
 
  check kavmilter || {
    failure
    echo
    printf "Program  %s not running...\n" "$d_name" >&2
    return  1
  } 
 
  killall -TERM $d_name 2>/dev/null
  sleep 5
  check kavmilter && killall -KILL kavmilter 2>/dev/null 
  check kavmilter && { 
    failure
    RETVAL=1
  } || {
    success
    RETVAL=0
  }
 
  rm -f $KVAR/run/kavmilter.pid
  rm -f /var/lock/subsys/kavmilterd
  echo
  return $RETVAL
}

start()
{
  d_name=$1
  d_opt=${2:-""}
  d_cmd=${3:-$KBIN/$d_name}

  printf "Starting up %-50s: " "$d_name"

  check kavmilter && {
    failure
    echo
    echo $d_name already running... >&2
    return 1
  }

  [ -x "$d_cmd" ] || {
    failure
    echo
    echo Program file $d_cmd is missing! >&2
    return 1
  }

 ulimit -n 8192 &>/dev/null
 $d_cmd $d_opt  &>/dev/null
 sleep 2
 if check kavmilter; then
    RETVAL=0
    touch /var/lock/subsys/kavmilterd
    success
 else
    RETVAL=1
    failure
 fi

 setup=$KBIN/kavmilter-setup.sh
 [ -x  $setup ] && {
  if [ "`$setup -check-filter`" = "no" ]; then
	echo "Warning: KAVMilter is not registered as Sendmail filter."
	echo "Warning: Your messages will not be protected."
	echo "Warning: Turn it on by running '$setup -add-filter'"
  fi
 } >&2 || {
   echo "Warning: KAVMilter setup script is missing."
 } >&2

 echo
 return $RETVAL
}

reload()
{
  check kavmilter && {
    $KBIN/kavmilter -r reload 2>/dev/null
    return $?
  } || {
    echo "KAVMilter is not running. Cannot reload." >&2
    return 1
  }
}

restart()
{
  stop  kavmilter && {
    echo "Waiting 2sec for clean exit..."
    sleep 2
  }
  start kavmilter
  return $?
}

stats()
{
  check kavmilter && {
    $KBIN/kavmilter -r stats 2>/dev/null
    return $?
  } || {
    echo "KAVMilter is not running. Cannot dump statistics." >&2
    return 1
  }
}

#------------------------------------------------------------------------------

case "$1" in
  start|stop|reload|restart|stats|status|check)
	$1 kavmilter
    exit $?
    ;;
  *)
	echo "Usage:" $0 "{start | stop | restart | reload | status | stats}"
	echo 
	exit 1
esac

