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

. /lib/lsb/init-functions
. /etc/default/rcS

whatami=cloud-external-ipallocator

# set environment variables

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

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

start() {
        log_daemon_msg $"Starting $PROGNAME" "$SHORTNAME"
	if [ -s "$PIDFILE" ] && kill -0 $(cat "$PIDFILE") >/dev/null 2>&1; then
	      log_progress_msg "apparently already running"
	      log_end_msg 0
	      exit 0
	fi
	if hostname --fqdn >/dev/null 2>&1 ; then
		true
	else
		log_failure_msg "The host name does not resolve properly to an IP address.  Cannot start $PROGNAME"
		log_end_msg 1
		exit 1
	fi
 
	if start-stop-daemon --start --quiet \
		--pidfile "$PIDFILE" \
		--exec "$DAEMONIZE" -- -n "$SHORTNAME" -p "$PIDFILE" -l "$LOGFILE" "$PROG" $OPTIONS
		RETVAL=$?
	    then
		rc=0
		sleep 1
		if ! kill -0 $(cat "$PIDFILE") >/dev/null 2>&1; then
		    log_failure_msg "$PROG failed to start"
		    rc=1
		fi
	else
		rc=1
	fi

	if [ $rc -eq 0 ]; then
		log_end_msg 0
	else
		log_end_msg 1
		rm -f "$PIDFILE"
	fi
}

stop() {
	echo -n $"Stopping $PROGNAME" "$SHORTNAME"
	start-stop-daemon --stop --quiet --oknodo --pidfile "$PIDFILE"
	log_end_msg $?
	rm -f "$PIDFILE"
}


# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  status)
        status_of_proc -p "$PIDFILE" "$PROG" "$SHORTNAME"
	RETVAL=$?
	;;
  restart)
	stop
	sleep 3
	start
	;;
  *)
	echo $"Usage: $whatami {start|stop|restart|status|help}"
	RETVAL=3
esac

exit $RETVAL

