#!/bin/bash

### BEGIN INIT INFO
# Provides:          cloud agent
# Required-Start:    $network $local_fs
# Required-Stop:     $network $local_fs
# Default-Start:     3 4 5
# Default-Stop:      0 1 2 6
# Short-Description: Start/stop Apache CloudStack Agent
# Description: This scripts Starts/Stops the Apache CloudStack agent
##  The CloudStack Agent is a part of the Apache CloudStack project and is used
##  for managing KVM-based Hypervisors and performing secondary storage tasks inside
##  the Secondary Storage System Virtual Machine.
## JSVC (Java daemonizing) is used for starting and stopping the agent
### END INIT INFO

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

. /lib/lsb/init-functions

SHORTNAME="cloudstack-agent"
PIDFILE=/var/run/"$SHORTNAME".pid
LOCKFILE=/var/lock/subsys/"$SHORTNAME"
PROGNAME="CloudStack Agent"
CLASS="com.cloud.agent.AgentShell"
PROG="jsvc"
DAEMON="/usr/bin/jsvc"
SHUTDOWN_WAIT="30"

unset OPTIONS
[ -r /etc/default/"$SHORTNAME" ] && source /etc/default/"$SHORTNAME"

# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not defined in $DEFAULT)
JDK_DIRS="/usr/lib/jvm/java-7-openjdk-amd64 /usr/lib/jvm/java-7-openjdk-i386 /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-openjdk-i386 /usr/lib/jvm/java-6-openjdk-amd64 /usr/lib/jvm/java-6-sun"

for jdir in $JDK_DIRS; do
    if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then
        JAVA_HOME="$jdir"
    fi
done
export JAVA_HOME

ACP=`ls /usr/share/cloudstack-agent/lib/*.jar | tr '\n' ':' | sed s'/.$//'`
PCP=`ls /usr/share/cloudstack-agent/plugins/*.jar 2>/dev/null | tr '\n' ':' | sed s'/.$//'`

# We need to append the JSVC daemon JAR to the classpath
# AgentShell implements the JSVC daemon methods
export CLASSPATH="/usr/share/java/commons-daemon.jar:$ACP:$PCP:/etc/cloudstack/agent"

wait_for_network() {
    i=1
    while [ $i -lt 10 ]
    do
        # Under Ubuntu and Debian libvirt by default creates a bridge called virbr0.
        # That's why we want more then 3 lines back from brctl, so that there is a manually created bridge
        if [ "$(brctl show|wc -l)" -gt 2 ]; then
            break
        else
            sleep 1
            let i=$i+1
            continue
        fi
    done
}

start() {
    if [ -s "$PIDFILE" ] && kill -0 $(cat "$PIDFILE") >/dev/null 2>&1; then
        log_daemon_msg "$PROGNAME apparently already running"
        log_end_msg 0
        exit 0
    fi

    log_daemon_msg "Starting $PROGNAME" "$SHORTNAME"
    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

    wait_for_network

    if start_daemon -p $PIDFILE $DAEMON -cp "$CLASSPATH" -pidfile "$PIDFILE" -errfile SYSLOG $CLASS
        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() {
    count="0"

    log_daemon_msg "Stopping $PROGNAME" "$SHORTNAME"
    killproc -p $PIDFILE $DAEMON

    until [ "$count" -gt "$SHUTDOWN_WAIT" ]
    do
        agentPid=$(ps aux|grep [j]svc|grep $SHORTNAME)
        if [ "$?" -gt "0" ];then
            break
        fi
        sleep 1
        let count="${count}+1"
    done

    agentPid=$(ps aux|grep [j]svc|grep $SHORTNAME)
    if [ "$?" -eq "0" ]; then
        agentPid=$(ps aux|grep [j]svc|awk '{print $2}')
        if [ "$agentPid" != "" ]; then
            log_warning_msg "$PROG still running, forcing kill"
            kill -9 $agentPid
        fi
    fi

    log_end_msg $?
    rm -f "$PIDFILE"
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status_of_proc -p "$PIDFILE" "$PROG" "$SHORTNAME"
        RETVAL=$?
        ;;
    restart | force-reload)
        stop
        sleep 3
        start
        ;;
    *)
    echo "Usage: $0 {start|stop|restart|force-reload|status}"
    RETVAL=3
esac

exit $RETVAL
