#!/bin/bash

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# Startup script for traffic_monitor
#
#
# chkconfig: 345 99 10
# description: traffic_monitor control script
# processname: traffic_monitor

### BEGIN INIT INFO
# Provides: traffic_monitor
# Required-Start: $network $local_fs $syslog
# Required-Stop: $network $local_fs $syslog
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: start and stop Traffic Monitor
# Description: Controls all traffic monitor processes at once.
### END INIT INFO

# Source function library.
. /etc/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

basepath=/opt/traffic_monitor
binpath=bin
runpath=var/run
name=traffic_monitor
prog=$basepath/$binpath/$name
lockfile=$basepath/$runpath/$name
options="--opsCfg /opt/traffic_monitor/conf/traffic_ops.cfg --config /opt/traffic_monitor/conf/traffic_monitor.cfg"

start() {
        [ "$NETWORKING" = "no" ] && exit 1
        [ -x $prog ] || exit 5

        #Set file limits
        # Max open files
        OPEN_FILE_LIMIT=65536
        ulimit -n $OPEN_FILE_LIMIT
        if [ $? -ne 0 ]; then
            echo -n "Failed to set open file limit to $OPEN_FILE_LIMIT"
            exit 1
        fi

        # Start daemons.
        echo -n $"Starting $name: "
        daemon nohup $prog $options < /dev/null &
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch $lockfile
        return $RETVAL
}

stop() {
        echo -n $"Shutting down $name: "
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $lockfile
        return $RETVAL
}

reload() {
        echo -n $"Reloading $name: "
        if [ -n "`pidofproc $prog`" ]; then
                killproc $prog -HUP
        else
                failure $"Reloading $name"
        fi
        RETVAL=$?
        echo
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status $prog
        ;;
  restart|force-reload)
        stop
        start
        ;;
  try-restart|condrestart)
        if status $prog > /dev/null; then
            stop
            start
        fi
        ;;
  reload)
        reload
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}"
        exit 2
esac
