Hi,

I'm writing this email to both lists, to let the community know this too. It's possible to add this code with all the other OCF scripts?

My English it's not great, and I'm not a guru, if I make mistake somewhere please tell where, so I can correct.

The OCF script are attached and all have the copyright stuff. If something it's missing about authorizations, please tell me.

Thanks,

--
Igor Neves <[EMAIL PROTECTED]>
3GNTW - Tecnologias de Informação, Lda

SIP/JID/MSN: [EMAIL PROTECTED] Mobile Phone: 00351914503611
Local Phone: 00351252377120


#!/bin/sh
#
# CGatePro OCF resource agent
#
# Description:  Manages a CGatePro High-Availability Resource
#
# Author:       Igor Neves  <igor AT 3gnt DOT net>
#                           <neves DOT igor AT gmail DOT com>
# License:      GNU General Public License (GPL)
#
# Copyright:    (C) 2008 3GNTW - Tecnologias de Informacao, Lda
#               All Rights Reserved.
#
# OCF parameters:
#   * OCF_RESKEY_basefolder
#   * OCF_RESKEY_application
#   * OCF_RESKEY_waitdown
#   * OCF_RESKEY_waitup
#   * OCF_RESKEY_supplyparams
#
#################################################################
# Source ocf shell functions
. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs

# Variable configuration
#################################################################
# Who much time (in sec) we will wait until check if CGatePro its UP 
# (default: 10sec)
CGPRO_WAIT_UP="$OCF_RESKEY_waitup"

# Who much time (in sec) we will wait until check if CGatePro its DOWN 
# (default: 10sec)
CGPRO_WAIT_DOWN="$OCF_RESKEY_waitdown"

# Directory where all the cgpro apps live
APPLICATION="$OCF_RESKEY_application"

# All my data and configuration directory
BASEFOLDER="$OCF_RESKEY_basefolder"

# Extra params
SUPPLPARAMS="$OCF_RESKEY_supplyparams"

# CGPRO lock file
CGATE_LOCK_FILE="/var/lock/subsys/CommuniGate"

#################################################################
# Internal functions

# Check if this use exists, if ok return 0
check_user ()
{
# arg1 should be the username
    ID="$1"
    
    id "$ID" 2>/dev/null
    if [ "$?" = "0" ]; then
        return 0
    else
        return 1
    fi
}

# Check if CGatePro it's running
check_cgpro_lock ()
{
# lets see if there is any lock file
# we should return 1, if there is no lock file
    if [ -f "/var/lock/subsys/CommuniGate" ]; then
        return 0;
    else
        return 1;
    fi
}

# Check if the is any cgpro running
check_cgpro_running ()
{

    if [ -f "/var/CommuniGate/ProcessID" ]; then
        PID=`cat /var/CommuniGate/ProcessID`

        kill -0 $PID 1> /dev/null 2> /dev/null

        if [ "$?" = "0" ]; then
            return 0
        else
            ocf_log info "CGatePro not running, removing old PID file"
            rm -f "/var/CommuniGate/ProcessID"
            return 1
        fi
    else
        return 1
    fi

}

#################################################################
# Main functions

# show how to use this script
_usage () 
{
cat <<END
usage: $0 {start|stop|status|monitor|meta-data|validate-all}

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

# All the verifications we need to do
_validate() 
{

# verify if exists the binary of cgpro
    if [ ! -f ${APPLICATION}/CommuniGate/CGServer ]; then
        ocf_log err "CommuniGate bin file, was not found in: 
${APPLICATION}/CommuniGate/CGServer"
        exit $OCF_ERR_GENERIC
    fi

# verify if exists base folder, if not create 
    if [ ! -d ${BASEFOLDER} ] ; then
        ocf_log info "We will try to create CGatePRO base folder: ${BASEFOLDER}"

        mkdir ${BASEFOLDER} 2> /dev/null
        if [ "$?" = "0" ]; then
            ocf_log info "Base folder created: ${BASEFOLDER}"

            if check_user "mail"; then
                chgrp mail ${BASEFOLDER}
                chmod 2770 ${BASEFOLDER}
            else
                ocf_log err "Could not find user <mail>, this use should exist 
to get CGatePro running."
                exit $OCF_ERR_GENERIC
            fi
        else
            ocf_log err "Could not create CGatePro base folder, check your 
configurations or data store location."
            exit $OCF_ERR_GENERIC
        fi
    fi

# verify if there is a lock file
    if check_cgpro_lock; then
        ocf_log warn "We found one old lock file, we will remove it: 
/var/lock/subsys/CommuniGate"
        rm -f "$CGATE_LOCK_FILE"
    fi

# if it gets here, everything its ok
    return $OCF_SUCCESS
}

###### start ######
_start() 
{

# we will now check if there is any cgpro running
    if check_cgpro_running; then
        ocf_log warn "There is already one cgpro running, we will leave it."
    else
# start the daemon
        ${APPLICATION}/CommuniGate/CGServer --Base ${BASEFOLDER} --Daemon 
${SUPPLPARAMS}
    fi

# lets give some time to cgpro to get up
    sleep "$CGPRO_WAIT_UP"

# check if CGatePro its already running, if not, we will wait until it goes up
# we dont need timeout stuff, crm will care of that
    if ! check_cgpro_running; then
        RUNNING=0
        while [ $RUNNING = 0 ]; do
            ocf_log info "CGatePro not running yet, we will wait a litle bit 
more"
            sleep 5
            if check_cgpro_running; then
                RUNNING=1
            fi
        done
    fi
        
# create the lock file for application
    touch $CGATE_LOCK_FILE

# everything went fine
    return $OCF_SUCCESS

}

###### stop ######
_stop() 
{

# check if CGatePro its already running
    if check_cgpro_running; then
# its running, lets find PID
        CGPRO_PID=""
        if [ -f ${BASEFOLDER}/ProcessID ]; then
            CGPRO_PID=`cat ${BASEFOLDER}/ProcessID`
        else
            CGPRO_PID=`/sbin/pidof CGServer`
        fi

# we have PID, not lets kill it normally
        kill $CGPRO_PID

# lets wait a couple of time, until its down
        sleep $CGPRO_WAIT_DOWN
        
# now lets check if its really down, if not we will wait a couple
# we dont need timeout stuff, crm will care of that
        RUNNING=0
        while [ $RUNNING = 0 ]; do
            ocf_log info "CGatePro still running, we will wait a litle bit more"
            sleep 5
            if ! check_cgpro_running; then
                RUNNING=1
            fi
        done
    else
        ocf_log info "CGatePro not running, nothing to stop"
    fi
        
    rm -f $CGATE_LOCK_FILE

    return $OCF_SUCCESS

}

# Monitor if CGatePro it's running
_monitor() 
{

# we will check if CGatePro it's running
    if check_cgpro_running; then
        ocf_log info "CGatePro runnning."
        return $OCF_SUCCESS
    else
        ocf_log warn "CGatePro not runnning."
        return $OCF_NOT_RUNNING
    fi

}

# Print metadata informations
_meta_data() 
{
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="cgatepro">
<version>0.1</version>
<longdesc lang="en">
OCF script that control cgatepro server, in failover scenario
</longdesc>
<shortdesc lang="en">CGatePro server resource script</shortdesc>

<parameters>

<parameter name="basefolder" unique="0" required="1">
<longdesc lang="en">
CGatePro BaseFolder, where all your data and configurations will live
</longdesc>
<shortdesc lang="en">CGatePro BaseFolder</shortdesc>
<content type="string" default="/var/CommuniGate"/>
</parameter>

<parameter name="supplyparams" unique="0" required="1">
<longdesc lang="en">
CGatePro Supply Params argument
</longdesc>
<shortdesc lang="en">cgatepro supplyparams</shortdesc>
<content type="string" default=""/>
</parameter>

<parameter name="application" unique="0" required="1">
<longdesc lang="en">
CGatePro Application Path
</longdesc>
<shortdesc lang="en">cgatepro app path</shortdesc>
<content type="string" default="/opt"/>
</parameter>

<parameter name="waitup" unique="0" required="1">
<longdesc lang="en">
How much time will this script wait to check if CGatePro its UP
</longdesc>
<shortdesc lang="en">Time UP</shortdesc>
<content type="integer" default="10"/>
</parameter>

<parameter name="waitdown" unique="0" required="1">
<longdesc lang="en">
How much time will this script wait to check if CGatePro its DOWN
</longdesc>
<shortdesc lang="en">Time DOWN</shortdesc>
<content type="integer" default="10"/>
</parameter>

</parameters>

<actions>
<action name="start" timeout="60" />
<action name="stop" timeout="60" />
<action name="monitor" timeout="15" interval="300" depth="0"
start-delay="30"/>
<action name="meta-data" timeout="5" />
</actions>
</resource-agent>
END
}

# See how we were called
#################################################################

case $1 in

meta-data)
    _meta_data
    exit $OCF_SUCCESS
    ;;
start)
    _validate
    _start
    ;;
stop)
    _stop
    ;;
status|monitor)
    _monitor
    ;;
usage|help)
    _usage
    exit $OCF_SUCCESS
    ;;
validate-all)
    _validate
    ;;
*)
    _usage
    exit $OCF_ERR_UNIMPLEMENTED
    ;;
esac
exit $?
#!/bin/sh
#
# Description:  Manages a ejabberd High-Availability Resource
#
# Author:       Igor Neves  <igor AT 3gnt DOT net> 
#                           <neves DOT igor AT gmail DOT com>
# License:      GNU General Public License (GPL)
#
# Copyright:    (C) 2008 3GNTW - Tecnologias de Informacao, Lda
#               All Rights Reserved.
#
# OCF parameters:
#   * OCF_RESKEY_ejabberdctl 
#   * OCF_RESKEY_waitup 
#   * OCF_RESKEY_waitdown 
#   * OCF_RESKEY_msntransportenable
#   * OCF_RESKEY_msntransportpath
#
# IMPORTANT:
#   - To make msn transport agent working, I changed the first like 
#   of 'PyMSNt.py' to: '#!/usr/bin/env /usr/bin/python'
#
#################################################################
# Source ocf shell functions
. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs

# Variable configuration
#################################################################
# Path to ejabberdctl file
EJABBERDCTL="$OCF_RESKEY_ejabberdctl"

# How much time (in sec) we will wait until check if ejabberd its UP
# (default: 15sec)
EJABBERD_WAIT_UP="$OCF_RESKEY_waitup"

# How much time (in sec) we will wait until check if ejabberd its DOWN
# (default: 15sec)
EJABBERD_WAIT_DOWN="$OCF_RESKEY_waitdown"

# Boolen to enable or disable starting the msn transport
EJABBERD_MSN_TRANS_ENABLE="$OCF_RESKEY_msntransportenable"

# Path to msn transport agent
EJABBERD_MSN_TRANS_PATH="$OCF_RESKEY_msntransportpath"
#################################################################
# Internal functions

# Check if there is any ejabberd running
check_ejabberd_running ()
{

    if [ -f "$EJABBERDCTL" ]; then

        $EJABBERDCTL status 1>/dev/null 2>/dev/null

        if [ "$?" = "0" ]; then
            return 0
        else
            ocf_log info "Ejabberd not running"
            return 1
        fi
    else
        ocf_log err "EjabberdCtl binary not found"
        return 1
    fi

}

# Check if there is any msn transport running
check_msn_tranport_running ()
{
    FILE="`/bin/basename $EJABBERD_MSN_TRANS_PATH .py`.pid"
    PATH="`/usr/bin/dirname $EJABBERD_MSN_TRANS_PATH`"
    PID="`/bin/cat $PATH/$FILE`"

    kill -0 $PID

    if [ "$?" = "0" ]; then
        return 0
    else
        return 1
    fi

}
#################################################################
# Main functions

# show how to use this script
_usage () 
{
cat <<END
usage: $0 {start|stop|status|monitor|meta-data|validate-all}

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

# All the verifications we need to do
_validate() 
{

# verify if exists the binary of ejabberd
    if [ ! -f "$EJABBERDCTL" ]; then
        ocf_log err "EjabberdCtl, was not found in: $EJABBERDCTL"
        exit $OCF_ERR_GENERIC
    fi

# verify msn transport agent exists if it is enable
    if [ "$EJABBERD_MSN_TRANS_ENABLE" = "1" ]; then
        if [ ! -f "$EJABBERD_MSN_TRANS_PATH" ]; then
            ocf_log err "Ejabberd msn transport agent enable, but transport 
agent binary not found: $EJABBERD_MSN_TRANS_PATH"
            exit $OCF_ERR_GENERIC
        fi
    else
        ocf_log info "Ejabberd msn transport agent disable."
    fi
    
# if it gets here, everything its ok
    return $OCF_SUCCESS
}

###### start ######
_start() 
{

# we will now check if there is any ejabberd running
    if check_ejabberd_running; then
        ocf_log warn "There is already one ejabberd running, we will leave it."
    else
# start the daemon
        ${EJABBERDCTL} start
    fi

# lets give some time to ejabberd to get up
    sleep "$EJABBERD_WAIT_UP"

# check if ejabberd its already running, if not, we will wait until it goes up
# we dont need timeout stuff, crm will care of that
    if ! check_ejabberd_running; then
        RUNNING=0
        while [ $RUNNING = 0 ]; do
            ocf_log info "Ejabberd not running yet, we will wait a litle bit 
more"
            sleep 5
            if check_ejabberd_running; then
                RUNNING=1
            fi
        done
    fi

# Now that ejabberd its running, lets start the transports if enable
    if [ "$EJABBERD_MSN_TRANS_ENABLE" = "1" ]; then
        if check_msn_tranport_running; then
            ocf_log warn "There is already a transport agent running, we will 
not touch it."
        else
            $EJABBERD_MSN_TRANS_PATH
        fi
    fi

# Everything went fine
    return $OCF_SUCCESS

}

###### stop ######
_stop() 
{

# check if Ejabberd its already running
    if check_ejabberd_running; then

        $EJABBERDCTL stop 1>/dev/null 2>/dev/null

# lets wait a couple of time, until its down
        sleep $EJABBERD_WAIT_DOWN

        if check_ejabberd_running; then
# its still running, lets find PID and kill the m'fucker
            EJ_PID=`/sbin/pidof beam.smp`

# lets se if we have found any PID
            if [ -n "$EJ_PID"  ]; then
                kill -9 "$EJ_PID"
            fi
        
# now lets check if its really down, if not we will wait a couple
# we dont need timeout stuff, crm will care of that
            RUNNING=0
            while [ $RUNNING = 0 ]; do
                ocf_log info "Ejabberd still running, we will wait a litle bit 
more"
                sleep 5
                if ! check_ejabberd_running; then
                    RUNNING=1
                fi
            done
        fi      
    else
        ocf_log info "Ejabberd not running, nothing to stop"
    fi

# ejabberd its not running anymore, lets stop all the transports if enable
    if [ "$EJABBERD_MSN_TRANS_ENABLE" = "1" ]; then
        FILE="`/bin/basename $EJABBERD_MSN_TRANS_PATH .py`.pid"
        PATH="`/usr/bin/dirname $EJABBERD_MSN_TRANS_PATH`"
        PID="`/bin/cat $PATH/$FILE`"

        if check_msn_tranport_running; then
            kill -9 $PID
        else
            ocf_log info "No msn transport agent running"
        fi

        if [ "$PATH" -ne "/" ]; then
            rm $PATH/$LOGFILE
        fi
    fi

    return $OCF_SUCCESS
}

# Monitor if Ejabberd it's running
_monitor() 
{

# we will check if Ejabberd it's running
    if check_ejabberd_running; then
        ocf_log info "Ejabberd runnning."
        return $OCF_SUCCESS
    else
        ocf_log warn "Ejabberd not runnning."
        return $OCF_NOT_RUNNING
    fi

    if check_msn_tranport_running; then
        ocf_log info "Ejabberd msn transport agent runnning."
        return $OCF_SUCCESS
    else
        ocf_log warn "Ejabberd msn transport agent not runnning."
        return $OCF_NOT_RUNNING
    fi
}

# Print metadata informations
_meta_data() 
{
    cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="ejabberd">
<version>0.1</version>
<longdesc lang="en">
OCF script that control ejabberd server, in failover scenario
</longdesc>
<shortdesc lang="en">Ejabberd server resource script</shortdesc>

<parameters>

<parameter name="ejabberdctl" unique="0" required="1">
<longdesc lang="en">
Ejabberd ctl binary path
</longdesc>
<shortdesc lang="en">EjabberdCtl binary path</shortdesc>
<content type="string" default="/opt/ejabberd/bin/ejabberdctl"/>
</parameter>

<parameter name="waitup" unique="0" required="1">
<longdesc lang="en">
How much time will this script wait to check if CGatePro its UP
</longdesc>
<shortdesc lang="en">Time UP</shortdesc>
<content type="integer" default="15"/>
</parameter>

<parameter name="waitdown" unique="0" required="1">
<longdesc lang="en">
How much time will this script wait to check if CGatePro its DOWN
</longdesc>
<shortdesc lang="en">Time DOWN</shortdesc>
<content type="integer" default="15"/>
</parameter>

<parameter name="msntransportenable" unique="0" required="1">
<longdesc lang="en">
This is a simple boolean value if enable or not the transport agent
</longdesc>
<shortdesc lang="en">Enable or Disable MSN transport agent</shortdesc>
<content type="boolean" default="0"/>
</parameter>

<parameter name="msntransportpath" unique="0" required="1">
<longdesc lang="en">
Path to PyMSNt.py
</longdesc>
<shortdesc lang="en">Path to PyMSNt.py</shortdesc>
<content type="string" default="/opt/pymsnt/PyMSNt.py"/>
</parameter>

</parameters>

<actions>
<action name="start" timeout="30" />
<action name="stop" timeout="30" />
<action name="monitor" timeout="15" interval="300" depth="0"
start-delay="30"/>
<action name="meta-data" timeout="5" />
</actions>
</resource-agent>
END
}

# See how we were called
#################################################################

case $1 in

meta-data)
    _meta_data
    exit $OCF_SUCCESS
    ;;
start)
    _validate
    _start
    ;;
stop)
    _stop
    ;;
status|monitor)
    _monitor
    ;;
usage|help)
    _usage
    exit $OCF_SUCCESS
    ;;
validate-all)
    _validate
    ;;
*)
    _usage
    exit $OCF_ERR_UNIMPLEMENTED
    ;;
esac
exit $?
_______________________________________________
Linux-HA mailing list
[email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha
See also: http://linux-ha.org/ReportingProblems

Reply via email to