#!/bin/sh
#
#   ldirectord OCF RA. Wrapper around /usr/sbin/ldirectord to
#   be OCF RA compliant and therefore to get the possibility
#   to monitor ldirectord by HAv2.
#   Tested on SuSE Linux Enterprise Server 10.
#
#   Should conform to the specification found at
#    http://www.linux-ha.org/OCFResourceAgent
#   and
#   http://www.opencf.org/cgi-bin/viewcvs.cgi/specs/ra/resource-agent-api.txt?rev=HEAD
#
#   ToDo: Add parameter to start several instances of ldirectord
#   with different config files.
#
# Copyright (c) 2007 Andreas Mock (andreas.mock@web.de)
#                    All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like.  Any license provided herein, whether implied or
# otherwise, applies only to this software file.  Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
#######################################################################
#
#	OCF Parameters
#	OCF_RESKEY_configfile
#	OCF_RESKEY_ldirectord
#
#######################################################################
# Initialization:

HA_VARRUNDIR=${HA_VARRUN}

. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs

#######################################################################

# LDIRECTORD=/usr/sbin/ldirectord
# LDIRCONF=/etc/ldirectord.cf

meta_data() {
        cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="Ldirectord" version="0.9">
<version>1.0</version>

<longdesc lang="en">
It's a simple OCF RA wrapper for ldirectord and uses the ldirectord interface
to create the OCF compliant interface. You win monitoring of ldirectord.
Be warned: Asking ldirectord status is an expensive action.
</longdesc>
<shortdesc lang="en">Wrapper OCF Resource Agent for ldirectord</shortdesc>

<parameters>

<parameter name="configfile" unique="1">
<longdesc lang="en">
The full pathname of the ldirectord configuration file.
</longdesc>
<shortdesc lang="en">configuration file path</shortdesc>
<content type="string" default="/etc/ldirectord.cf" />
</parameter>

<parameter name="ldirectord">
<longdesc lang="en">
The full pathname of the ldirectord.
</longdesc>
<shortdesc lang="en">ldirectord binary path</shortdesc>
<content type="string" default="/usr/sbin/ldirectord" />
</parameter>

</parameters>

<actions>
<action name="start"   timeout="15" />
<action name="stop"    timeout="15" />
<action name="monitor" depth="0"  timeout="10" interval="20" />
<action name="meta-data"  timeout="10" />
<action name="validate-all"  timeout="10" />
</actions>
</resource-agent>
END
}

#######################################################################

ldir_init() {

  COMMAND=$1

  LDIRCONF=$OCF_RESKEY_configfile
  if [ x"${LDIRCONF}" = "x" ]; then
    LDIRCONF=/etc/ldirectord.cf
  fi

  if [ ! -f $LDIRCONF ]; then
    case $COMMAND in
      stop)	ocf_log warn "$LDIRCONF not found. ldirectord considered stopped"
		exit $OCF_SUCCESS;;
      monitior)	exit $OCF_NOT_RUNNING;;
      status)	exit $LSB_STATUS_STOPPED;;
      start)	ocf_log warn "$LDIRCONF not found."
		exit $OCF_NOT_RUNNING;;
    esac
  fi

  LDIRECTORD=$OCF_RESKEY_ldirectord
  if [ x"${LDIRECTORD}" = x ]; then
    LDIRECTORD="/usr/sbin/ldirectord"
  fi

  if [ ! -x $LDIRECTORD ]; then
    case $COMMAND in
      stop)	ocf_log warn "$LDIRECTORD not found."
		exit $OCF_SUCCESS;;
      monitor)  exit $OCF_NOT_RUNNING;;
      status)	exit $LSB_STATUS_STOPPED;;
      start)	ocf_log warn "$LDIRECTORD not found."
		exit $OCF_NOT_RUNNING;;
    esac
  fi

}

ldirectord_usage() {
        cat <<END
usage: $0 {start|stop|monitor|validate-all|meta-data}

Expects to have a fully populated OCF RA-compliant environment set.
END
}

ldirectord_exit() {
    exit $1
}

ldirectord_start() {
    $LDIRECTORD $LDIRCONF start
}

ldirectord_stop() {
    $LDIRECTORD $LDIRCONF stop
}

ldirectord_status() {
    OUTPUT=`$LDIRECTORD $LDIRCONF status 2>&1`
    case $? in
        1)  echo $OUTPUT
            return $OCF_ERR_GENERIC
            ;;
        0)  echo running
            return $OCF_SUCCESS
            ;;
        3)  echo stopped
            return $OCF_SUCCESS
            ;;
        *)  echo $OUTPUT
            return $OCF_ERR_GENERIC
            ;;
    esac
}

ldirectord_monitor() {
    OUTPUT=`$LDIRECTORD $LDIRCONF status 2>&1`
    case $? in
        0)  return $OCF_SUCCESS
            ;;
        3)  return $OCF_NOT_RUNNING
            ;;
        *)  echo $OUTPUT
            return $OCF_ERR_GENERIC
            ;;
    esac
}

ldirectord_validate() {
	if [ ! -f $LDIRCONF ]; then
		ocf_log err $LDIRCONF
        	ocf_log err "Configuration file $LDIRCONF not found!"
        	exit $OCF_ERR_CONFIGURED
	fi

	if [ ! -x $LDIRECTORD ]; then
		ocf_log err "Binary file $LDIRECTORD not found."
		exit $OCF_ERR_CONFIGURED
	fi

#        exit $OC_ERR_UNIMPLEMENTED
	
}

ldir_init

case $__OCF_ACTION in
meta-data)      meta_data
                exit $OCF_SUCCESS
                ;;
start)  ldirectord_start
                ldirectord_exit $?
                ;;
stop)   ldirectord_stop
                ldirectord_exit $?
                ;;
status) ldirectord_status
                ldirectord_exit $?
                ;;
monitor)    ldirectord_monitor
                ldirectord_exit $?
                ;;
validate-all)   ldirectord_validate
                ldirectord_exit $?
                ;;
usage|help)     ldirectord_usage
                exit $OCF_SUCCESS
                ;;
*)              ldirectord_usage
                exit $OCF_ERR_UNIMPLEMENTED
                ;;
esac
