#!/bin/sh

set -e

DAEMON=/usr/bin/freshclam
NAME=freshclam
DESC="ClamAV virus database updater"
[ -x $DAEMON ] || exit 0

CLAMAV_CONF_FILE=/etc/clamav/clamd.conf
FRESHCLAM_CONF_FILE=/etc/clamav/freshclam.conf
PIDFILE=/var/run/clamav/freshclam.pid
[ -f /var/lib/clamav/interface ] && INTERFACE=`cat /var/lib/clamav/interface`


if [ -f "$FRESHCLAM_CONF_FILE" ]; then
  for variable in `egrep -v '^[[:space:]]*(#|$)' "$FRESHCLAM_CONF_FILE" | awk '{print $1}'`; do
    if [ "$variable" = 'DatabaseMirror' ]; then
      if [ -z "$DatabaseMirror" ]; then
        for i in `grep ^$variable $FRESHCLAM_CONF_FILE | awk '{print $2}'`; do
          value="$i $value"
        done
      else
        continue
      fi
    elif [ "$variable" = 'OnUpdateExecute' -o "$variable" = 'OnErrorExecute' ]; then
      value=`grep ^$variable $FRESHCLAM_CONF_FILE | head -n1 | sed -e s/$variable\ //`
    else
      value=`grep ^$variable $FRESHCLAM_CONF_FILE | head -n1 | awk '{print $2}'`
    fi
    if ! [ "$value" = "$variable" -o "$value" = "" ]; then
      export "$variable"="$value"
    else
      export "$variable"="true"
    fi
    unset value
  done
fi

for inet in $INTERFACE; do
  if route | grep -q "$inet"; then
    IS_UP=true
    break
  else
    IS_UP=false
  fi
done

for inet in $INTERFACE; do
  if [ "$inet" = "$IFACE" ]; then
    match=true
    break
  else
    match=false
  fi
done

# We don't want to always start/stop if running from if-up/down.d
if ! [ "$1" = "start" -o "$1" = "stop" ]; then     # Exempt restart/reload/etc from checks
  if [ -n "$INTERFACE" ]; then                     # Want it only run from if-up.d
    if [ -z "$IFACE" ]; then                       # Is not called by if-up.d
      if [ "$IS_UP" = false ]; then                # And route isn't up (e.g., upgrade)
	echo "Interface not up.  Exiting."
	exit 0
      fi
    elif [ "$match" != 'true' ]; then              # IFACE coming up is not the one selected
      echo "Interface not up.  Exiting."
      exit 0
    fi
  fi
fi

# If user wants it run from cron, we only accept no-daemon and stop
if [ -f /etc/cron.d/clamav-freshclam ]; then
  if ! [ "$1" = "no-daemon" -o "$1" = "stop" ]; then
    echo "Cron option has been selected for running freshclam"
    echo "Please either run freshclam directly, or run the init"
    echo "script with the 'no-daemon' option"
    exit 0
  fi
fi

[ -z "$UpdateLogFile" ] && UpdateLogFile=/var/log/clamav/freshclam.log

if [ -z "$DatabaseDirectory" ]; then
  [ -r "$CLAMAV_CONF_FILE" ] && DatabaseDirectory=$(grep 'DataDirectory' "$CLAMAV_CONF_FILE" | awk '{print $2}')
  [ -z "$DatabaseDirectory" ] && DatabaseDirectory=/var/lib/clamav/
fi

[ -e "$PIDFILE" ] && PID=`cat $PIDFILE`
[ "$PID" = '1' ] && unset PID

case "$1" in
  no-daemon)
  echo "It takes freshclam ~3min to timeout and try the next mirror in the list"
  freshclam -l "$UpdateLogFile" --datadir "$DatabaseDirectory"
  ;;
  start)
  echo -n "Starting $DESC: "
  start-stop-daemon -S -x $DAEMON -- -d --quiet -p $PIDFILE
  echo "$NAME"
  ;;
  stop)
  echo -n "Stopping $DESC: "
  start-stop-daemon -o -K -q -p $PIDFILE $DAEMON
  if [ -n "$PID" ]; then
    sleep 1
    if kill -0 "$PID" 2>/dev/null; then
      echo -n "Waiting . "
      cnt=0
      while kill -0 "$PID" 2>/dev/null; do
        cnt=`expr "$cnt" + 1`
        if [ "$cnt" -gt 60 ]; then
          echo -n " Failed.. "
          break
        fi
        sleep 2
        echo -n ". "
      done
    fi
  fi
  echo "$NAME"
  ;;
  restart|force-reload)
  $0 stop
  $0 start
  ;;
  reload)
  echo -n "Reloading $DESC: "
  start-stop-daemon -o -K -q -s 1 -p $PIDFILE $DAEMON 
  echo "$NAME"
  ;;
  skip)
  ;;
  *)
  echo "Usage: $0 {no-daemon|start|stop|reload|restart|force-reload|skip}" >&2
  exit 1
  ;;
esac

exit 0

