#!/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.

# chkconfig: 35 99 10
# description: Cloud Agent

# WARNING: if this script is changed, then all other initscripts MUST BE changed to match it as well

. /etc/rc.d/init.d/functions

# set environment variables

SHORTNAME=`basename $0`
PIDFILE=@PIDDIR@/"$SHORTNAME".pid
LOCKFILE=@LOCKDIR@/"$SHORTNAME"
LOGFILE=@AGENTLOG@
PROGNAME="Cloud Agent"

unset OPTIONS
[ -r @SYSCONFDIR@/sysconfig/"$SHORTNAME" ] && source @SYSCONFDIR@/sysconfig/"$SHORTNAME"
DAEMONIZE=@BINDIR@/@PACKAGE@-daemonize
PROG=@BINDIR@/@PACKAGE@-external-ipallocator.py
OPTIONS=8083

start() {
        echo -n $"Starting $PROGNAME: "
	if hostname --fqdn >/dev/null 2>&1 ; then
		daemon --check=$SHORTNAME --pidfile=${PIDFILE} "$DAEMONIZE" \
			-n "$SHORTNAME" -p "$PIDFILE" -l "$LOGFILE" "$PROG" $OPTIONS
		RETVAL=$?
		echo
	else
		failure
		echo
		echo The host name does not resolve properly to an IP address.  Cannot start "$PROGNAME". > /dev/stderr
		RETVAL=9
	fi
	[ $RETVAL = 0 ] && touch ${LOCKFILE}
	return $RETVAL
}

stop() {
	echo -n $"Stopping $PROGNAME: "
	killproc -p ${PIDFILE} $SHORTNAME # -d 10 $SHORTNAME
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && rm -f ${LOCKFILE} ${PIDFILE}
}


# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  status)
        status -p ${PIDFILE} $SHORTNAME
	RETVAL=$?
	;;
  restart)
	stop
	sleep 3
	start
	;;
  condrestart)
	if status -p ${PIDFILE} $SHORTNAME >&/dev/null; then
		stop
		sleep 3
		start
	fi
	;;
  *)
	echo $"Usage: $SHORTNAME {start|stop|restart|condrestart|status|help}"
	RETVAL=3
esac

exit $RETVAL

