#!/bin/bash

### BEGIN INIT INFO
# Provides:          cloudstack-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

TMP=/usr/share/cloudstack-agent/tmp
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"

# create java tmp dir if not found
mkdir -m 0755 -p "$TMP"

# 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-7-oracle /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 -Djava.io.tmpdir="$TMP" -Xms256m -Xmx2048m -cp "$CLASSPATH" -Djna.nosys=true -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
