#!/bin/sh
#
# init script for XmlRpcResourceManager
#
# chkconfig: 345 88 22
# description: CAS Resource Manager
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE.txt 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.    
#
# $Id$

[ -f /etc/sysconfig/java ] && . /etc/sysconfig/java
#[ -f /etc/sysconfig/cas-filemgr] && . /etc/sysconfig/cas-filemgr

SERVER_PORT=9002
export SERVER_PORT
if [ -z $JAVA_HOME ] ; then
	JAVA_HOME=/path/to/java/home
else
	JAVA_HOME=${JAVA_HOME}
fi

export JAVA_HOME
CAS_RESMGR_HOME=..
export CAS_RESMGR_HOME
RUN_HOME=${CAS_RESMGR_HOME}/../run
export RUN_HOME
CAS_RESMGR_PROPS=../etc/resource.properties
export CAS_RESMGR_PROPS

PATH=${JAVA_HOME}/bin:${CAS_RESMGR_HOME}/bin:/usr/bin:/bin:/usr/sbin:/sbin
export PATH

# See how we were called.
case "$1" in
  start)
        echo -n "Starting cas resource manager: "
        $JAVA_HOME/bin/java -Djava.ext.dirs=${CAS_RESMGR_HOME}/lib \
        -Djava.util.logging.config.file=${CAS_RESMGR_HOME}/etc/logging.properties \
        -Dorg.apache.oodt.cas.resource.properties=${CAS_RESMGR_PROPS} \
        org.apache.oodt.cas.resource.system.XmlRpcResourceManager --portNum $SERVER_PORT &       
        echo $! >${RUN_HOME}/cas.resmgr.pid 
        echo "OK"
        sleep 5
        ;;
  stop)
        echo -n "Shutting down cas resource manager: "
        kill `cat ${RUN_HOME}/cas.resmgr.pid`
        echo "OK"
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit 0
