#!/bin/bash
# init file for snmptrapd
# chkconfig: - 50 50
# description: snmptrapd
#
# processname: /usr/sbin/snmptrapd
# pidfile: /omd/sites/monitor/var/run/snmptrapd.pid

# source function library
#. /etc/rc.status

. $OMD_ROOT/etc/omd/site.conf
if [ "$CONFIG_SNMPTRAPD" != "on" ] ; then
  exit 5
fi

NAME="snmptrapd"
PROG="/usr/sbin/snmptrapd"
LOGDIR="/omd/sites/$OMD_SITE/var/log/snmp"
LOG="$LOGDIR/snmptrapd.log"
PIDFILE="$OMD_ROOT/var/run/snmptrapd.pid"
OPTIONS="-ObentU -C -c $OMD_ROOT/etc/snmptrapd.conf -A -Lf $LOG -p $PIDFILE udp:$CONFIG_SNMPTRAPD_UDP_PORT"

mkdir -p $LOGDIR
mkdir -p "$OMD_ROOT/var/run"

if [ -z $OMD_SITE ]; then
    echo -n $"Starting $NAME: failed. \$OMD_SITE not set."
    exit 1
fi


pidof_snmptrapd() {
  # if there is actually an snmptrapd process whose pid is in PIDFILE,
  # print it and return 0.
  if [ -e "$PIDFILE" ]; then
    PID=$(cat "$PIDFILE")
    if kill -0 $PID >/dev/null 2>&1; then
      echo $PID
      return 0
    else
      rm -f $PIDFILE
    fi
  else
    # It might happen that there is no pidfile but a process is running
    # As fallback check the process table for apache with PPID=1 and
    # running as this user
    PID=$(pgrep -u $OMD_SITE -P 1 -f $PROG)
    if [ -n "$PID" ]; then
        echo $PID
        return 0
    fi
  fi
  return 1
}

snmptrapd_wait_stop() {
  # running ?
  pid=$(pidof_snmptrapd) || true
  if [ -n "${pid:-}" ]; then
    kill ${pid:-}
  else
    echo -n '(not running)...'
    return 0
  fi

  # wait until really stopped
  if [ -n "${pid:-}" ]; then
    i=0
    while kill -0 "${pid:-}" 2> /dev/null;  do
      if [ $i = '60' ]; then
        return 1
      else
        echo -n "."
        i=$(($i+1))
        sleep 0.1
      fi
     done
  fi

  [ -f "$PID_FILE" ] && rm -f "$PID_FILE"
  return 0
}

snmptrapd_wait_start() {
  if pidof_snmptrapd >/dev/null 2>&1; then
    echo -n '(already running)...'
    return 1
  fi
  $PROG $OPTIONS
  i=0
  while ! pidof_snmptrapd >/dev/null 2>&1;  do
    if [ $i = '10' ]; then
      return 1
    else
      echo -n "."
      i=$(($i+1))
      sleep 0.1
    fi
  done

  return 0
}


case "$1" in
    start)
        printf "%s snmptrapd-init %s\n" "$(date)" "$*" >> $LOG
        echo -n "Starting dedicated SNMPTrapd for site $OMD_SITE..."
        if snmptrapd_wait_start; then
          echo 'OK'
          exit 0
        elif snmptrapd_wait_start; then
          # 2nd try. It looks like this snmptrapd gets killed by a logfile rotation
          echo 'OK'
          exit 0
        else
          echo 'ERROR'
          exit 1
        fi
    ;;
    stop)
        printf "%s snmptrapd-init %s\n" "$(date)" "$*" >> $LOG
        echo -n "Stopping dedicated SNMPTrapd for site $OMD_SITE..."
        if snmptrapd_wait_stop; then
          echo 'OK'
          exit 0
        else
          echo 'ERROR'
          exit 1
        fi
    ;;
    restart)
        $0 stop
        $0 start
        exit $?
    ;;
    reload)
      PID=$(pidof_snmptrapd) || true
      if [ -n "$PID" ]; then
        $0 stop
        $0 start
        exit $?
      else
        echo "no pid file found, not running"
        exit 1
      fi
    ;;
    status)
      PID=$(pidof_snmptrapd) || true
      if [ -n "$PID" ]; then
          echo "$NAME running with pid $PID"
          exit 0
      else
          echo "no pid file found, not running"
          exit 1
      fi
    ;;
    check)
    ;;
    *)
    echo $"Usage: $0 {start|stop|restart|condrestart|reload}"
esac

exit 3

