hi dejan,

Dejan Muhamedagic wrote:
>>>>> # TODO
>>>>> # * remove debian specific code (e.g. start-stop-daemon)
>> this is still open. i would like to see mysql-proxy included so i
>> can provide patches against the hg repository instead of re-submitting
>> the ocf every time.
...
> At risk of being ungrateful and rude, I'd still insist on this
> point, because people expect the whole shebang to run on Linux,
> not just on distribution XY. It shouldn't be that hard to do
> after all :) Take a look at this changeset for example:
> 
> changeset:   12393:60cc2d6eee88
> user:        NAKAHIRA Kazutomo <[email protected]>
> date:        Fri Apr 24 08:38:48 2009 +0200
> summary:     High (LF 2112): RA: sfex: checkproc/killproc are not available 
> everywhere

i now replaced the start-stop-daemon calls. however, i left these
calls as comments for reference. if the ra proves stable, one can
remove them during the next maintanance.

thank you for the reference. it saved me some time!

changes:
* replace debian specific start-stop-daemon calls
* protect $pidfile
* remove obsolete code/comments
* add some more error checking

is it ready for initial inclusion now?

cheers,
raoul
-- 
____________________________________________________________________
DI (FH) Raoul Bhatia M.Sc.          email.          [email protected]
Technischer Leiter

IPAX - Aloy Bhatia Hava OEG         web.          http://www.ipax.at
Barawitzkagasse 10/2/2/11           email.            [email protected]
1190 Wien                           tel.               +43 1 3670030
FN 277995t HG Wien                  fax.            +43 1 3670030 15
____________________________________________________________________
#!/bin/sh
#
# Resource script for MySQL Proxy
#
# Description:  Manages MySQL Proxy as an OCF resource in 
#               an high-availability setup.
#
#               Tested with mysql-proxy 0.7.0 on Debian 5.0.
#               Based on the mysql and Pure-Ftpd OCF resource agents.
#
# Author:       Raoul Bhatia <[email protected]> : Original Author
# License:      GNU General Public License (GPL) 
#
#
#       usage: $0 {start|stop|status|monitor|validate-all|meta-data}
#
#       The "start" arg starts a MySQL Proxy instance
#
#       The "stop" arg stops it.
#
# TODO
# * add error checking like in mysql ocf ra (e.g. socketdir)
# * verify if mysql-proxy supports multiple --proxy-address(es)
#
# OCF parameters:
#  OCF_RESKEY_binary
#  OCF_RESKEY_defaults_file
#  OCF_RESKEY_proxy_backend_addresses
#  OCF_RESKEY_proxy_read_only_backend_addresses
#  OCF_RESKEY_proxy_address
#  OCF_RESKEY_admin_address
#  OCF_RESKEY_parameters
#  OCF_RESKEY_pidfile
#
##########################################################################

# Initialization:

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

: ${OCF_RESKEY_binary="/usr/sbin/mysql-proxy"}
: ${OCF_RESKEY_defaults_file=""}
: ${OCF_RESKEY_proxy_backend_addresses="127.0.0.1:3306"}
: ${OCF_RESKEY_proxy_read_only_backend_addresses=""}
: ${OCF_RESKEY_proxy_address=":4040"}
: ${OCF_RESKEY_admin_address="127.0.0.1:4041"}
: ${OCF_RESKEY_parameters=""}
: ${OCF_RESKEY_pidfile="${HA_RSCTMP}/mysql-proxy-${OCF_RESOURCE_INSTANCE}.pid"}
USAGE="Usage: $0 {start|stop|status|monitor|validate-all|meta-data}";

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

usage() {
    echo $USAGE >&2
}

meta_data() {
        cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="mysql-proxy">
<version>0.1</version>
<longdesc lang="en">
This script manages MySQL Proxy as an OCF resource in a high-availability setup.
Tested with MySQL Proxy 0.7.0 on Debian 5.0.
</longdesc>
<shortdesc lang="en">OCF Resource Agent compliant MySQL Proxy 
script.</shortdesc>

<parameters>

<parameter name="binary" unique="1" required="1">
<longdesc lang="en">
Full path to the MySQL Proxy binary.
For example, "/usr/sbin/mysql-proxy".
</longdesc>
<shortdesc lang="en">Full path to MySQL Proxy binary</shortdesc>
<content type="string" default="/usr/sbin/mysql-proxy" />
</parameter>

<parameter name="defaults_file" unique="1" required="0">
<longdesc lang="en">
Full path to a MySQL Proxy configuration file.
For example, "/etc/mysql-proxy.conf".
</longdesc>
<shortdesc lang="en">Full path to configuration file</shortdesc>
<content type="string" default="" />
</parameter>

<parameter name="proxy_backend_addresses" unique="0" required="0">
<longdesc lang="en">
Address:port of the remote backend-servers (default: 127.0.0.1:3306).
</longdesc>
<shortdesc lang="en"></shortdesc>
<content type="string" default="127.0.0.1:3306" />
</parameter>

<parameter name="proxy_read_only_backend_addresses" unique="0" required="0">
<longdesc lang="en">
Address:port of the remote slave-server (default: not set).
</longdesc>
<shortdesc lang="en"></shortdesc>
<content type="string" default="127.0.0.1:3306" />
</parameter>

<parameter name="proxy_address" unique="0" required="0">
<longdesc lang="en">
Listening address:port of the proxy-server (default: :4040).
You can also specify a socket like "/tmp/mysql-proxy.sock".
</longdesc>
<shortdesc lang="en"></shortdesc>
<content type="string" default=":4040" />
</parameter>

<parameter name="admin_address" unique="0" required="0">
<longdesc lang="en">
Listening address:port of the admin-server (default: 127.0.0.1:4041).
</longdesc>
<shortdesc lang="en"></shortdesc>
<content type="string" default="127.0.0.1:4041" />
</parameter>

<parameter name="parameters" unique="1" required="0">
<longdesc lang="en">
The MySQL Proxy daemon may be called with additional parameters.
Specify any of them here.
</longdesc>
<shortdesc lang="en"></shortdesc>
<content type="string" default="" />
</parameter>

<parameter name="pidfile" unique="0">
<longdesc lang="en">PID file</longdesc>
<shortdesc lang="en">PID file</shortdesc>
<content type="string" 
default="${HA_RSCTMP}/mysql-proxy-${OCF_RESOURCE_INSTANCE}.pid" />
</parameter>

</parameters>

<actions>
<action name="start"   timeout="90" />
<action name="stop"    timeout="100" />
<action name="monitor" depth="10"  timeout="20s" interval="60s" 
start-delay="1s" />
<action name="validate-all"  timeout="30s" />
<action name="meta-data"  timeout="5s" />
</actions>
</resource-agent>
END
        exit $OCF_SUCCESS
}

isRunning()
{
    kill -0 "$1" 2>/dev/null
}

mysqlproxy_status()
{
    if [ -f "${pidfile}" ]; then
    # MySQL Proxy is probably running
        PID=`head -n 1 "${pidfile}"`
        if [ ! -z "$PID" ] ; then
            isRunning "$PID"
            return $?
        fi
    else 
        ocf_log err "Cannot check MySQL Proxy status because PID-file was lost."
    fi
    
    # MySQL Proxy is not running
    false
}

mysqlproxy_start()
{
    # if MySQL Proxy is running return success
    if mysqlproxy_status ; then
        ocf_log info "MySQL Proxy already running."
        exit $OCF_SUCCESS
    fi

    # check that the MySQL Proxy binary exists and can be executed
    if [ ! -x "$binary" ]; then
        ocf_log err "MySQL Proxy binary '$binary' does not exist or cannot be 
executed."
        exit $OCF_ERR_GENERIC
    fi

    # check if the MySQL Proxy defaults-file exist
    PARAM_PREFIX=''
    if [ -f "$defaults_file" ]; then
        PARAM_PREFIX="--defaults-file=$defaults_file "
    fi

    # split multiple proxy-address options.
    # currently unsupported but let us hope for the future ;)
    for pa in $proxy_address; do
        [ -z "$pa" ] && continue
        OPTIONS=" $OPTIONS --proxy-address=$pa"
    done

    # split multiple proxy-backend-addresses options.
    for pba in $proxy_backend_addresses; do
        [ -z "$pba" ] && continue
        OPTIONS=" $OPTIONS --proxy-backend-addresses=$pba"
    done

    # split multiple proxy-backend-addresses options.
    for proba in $proxy_read_only_backend_addresses; do
        [ -z "$proba" ] && continue
        OPTIONS=" $OPTIONS --proxy-read-only-backend-addresses=$proba"
    done

    # build $OPTIONS and add addmin-address and pidfile
    OPTIONS="$PARAM_PREFIX $OPTIONS --admin-address=$admin_address 
--pid-file=$pidfile $PARAM_SUFFIX"

    # start MySQL Proxy
    #start-stop-daemon --start --quiet --pidfile $pidfile --make-pidfile --name 
mysql-proxy --startas $binary -b -- $OPTIONS
    $binary --daemon $OPTIONS
    
    ret=$?
  
    if [ $ret -ne 0 ]; then
        ocf_log err "MySQL Proxy returned error." $ret
        exit $OCF_ERR_GENERIC
    fi

    exit $OCF_SUCCESS
}


mysqlproxy_stop()
{
    if mysqlproxy_status ; then
        #start-stop-daemon --stop --quiet --retry 3 --exec $binary --pidfile 
$pidfile
        /bin/kill `cat "${pidfile}"`
        ret=$?

        if [ $ret -ne 0 ]; then
            ocf_log err "MySQL Proxy returned error while stopping." $ret
            exit $OCF_ERR_GENERIC
        fi

        # grant some time for shutdown and recheck
        if mysqlproxy_status ; then
            ocf_log err "MySQL Proxy failed to stop."
            exit $OCF_ERR_GENERIC
        fi

        # remove dangling socketfile if specified
        for pa in $proxy_address; do
            if [ -S "$pa" ]; then
                ocf_log info "Removing dangling socket file '$pa'."
                rm -f "$pa"
            fi
        done
    fi

    exit $OCF_SUCCESS
}

mysqlproxy_monitor()
{

    if mysqlproxy_status ; then
        return $OCF_SUCCESS
    fi

    return $OCF_NOT_RUNNING
}

mysqlproxy_validate_all()
{
    # @TODO
    return $OCF_SUCCESS
}

#
# Main
#

if [ $# -ne 1 ]; then
    usage
    exit $OCF_ERR_ARGS
fi

pidfile=$OCF_RESKEY_pidfile
binary=$OCF_RESKEY_binary
defaults_file=$OCF_RESKEY_defaults_file
proxy_backend_addresses=$OCF_RESKEY_proxy_backend_addresses
proxy_read_only_backend_addresses=$OCF_RESKEY_proxy_read_only_backend_addresses
admin_address=$OCF_RESKEY_admin_address
proxy_address=$OCF_RESKEY_proxy_address

# debugging stuff
#echo OCF_RESKEY_binary=$OCF_RESKEY_binary >> 
/tmp/prox_conf_$OCF_RESOURCE_INSTANCE
#echo OCF_RESKEY_defaults_file=$OCF_RESKEY_defaults_file >> 
/tmp/prox_conf_$OCF_RESOURCE_INSTANCE
#echo OCF_RESKEY_proxy_backend_addresses=$OCF_RESKEY_proxy_backend_addresses >> 
/tmp/prox_conf_$OCF_RESOURCE_INSTANCE
#echo 
OCF_RESKEY_proxy_read_only_backend_addresses=$OCF_RESKEY_proxy_read_only_backend_addresses
 >> /tmp/prox_conf_$OCF_RESOURCE_INSTANCE
#echo OCF_RESKEY_proxy_address=$OCF_RESKEY_proxy_address >> 
/tmp/prox_conf_$OCF_RESOURCE_INSTANCE
#echo OCF_RESKEY_admin_address=$OCF_RESKEY_admin_address >> 
/tmp/prox_conf_$OCF_RESOURCE_INSTANCE
#echo OCF_RESKEY_parameters=$OCF_RESKEY_parameters >> 
/tmp/prox_conf_$OCF_RESOURCE_INSTANCE
#echo OCF_RESKEY_pidfile=$OCF_RESKEY_pidfile >> 
/tmp/prox_conf_$OCF_RESOURCE_INSTANCE


case $1 in
    start)      mysqlproxy_start
                ;;
    
    stop)       mysqlproxy_stop
                ;;
        
    status)     if mysqlproxy_status; then
                    ocf_log info "MySQL Proxy is running."
                    exit $OCF_SUCCESS
                else
                    ocf_log info "MySQL Proxy is stopped."
                    exit $OCF_NOT_RUNNING
                fi
                ;;
        
    monitor)    mysqlproxy_monitor
                exit $?
                ;;
        
    validate-all)   mysqlproxy_validate_all
                    exit $?
                    ;;
            
    meta-data)  meta_data
                ;;
        
    usage)      usage
                exit $OCF_SUCCESS
                ;;
        
    *)          usage
                exit $OCF_ERR_UNIMPLEMENTED
                ;;
esac

_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/

Reply via email to