Hi list,

I have rewritten a mysql ocf script which I found on http://k2k.ds14.agh.edu.pl/egee-ha/mysql

Basically I corrected the exit codes and I have rewritten some functions which i didn't like.

In my test cluster it works fine. I haven't found any mysql ocf script shipped with your source code, so maybe you like mine.

If you have any advice, what should be changed or what else you need of mine, so that you are able to integrate it in your sources, let me know please.


cheers,

Achim



#!/bin/sh
#
# $Id: db2.in,v 1.8 2006/01/26 18:00:05 lars Exp $
# 
# mysql
#
# Description:  Manages a MySQL database as Linux-HA resource
# (made from db2 ocf script)
#
#
# Author:       Alan Robertson
# Author:       Jakub Janczak <kubek2k (at) gmail (dot) com> 
# Author:       Achim Stumpf <newgrp <at> gmx <dot> de> (rewritten and 
correction of exit codes)
# Support:      [EMAIL PROTECTED]
# License:      GNU General Public License (GPL)
# Copyright:    (C) 2002 - 2005 International Business Machines, Inc. (? k2k)
#
# An example usage in /etc/ha.d/haresources: 
#       node1  10.0.0.170 mysql
#
# See usage() function below for more details...
#
# OCF instance parameters:
#   OCF_RESKEY_mysql_config
#   OCF_RESKEY_mysql_datadir
#   OCF_RESKEY_mysql_user
#   OCF_RESKEY_mysql_group
#   OCF_RESKEY_mysql_test_table
#   OCF_RESKEY_mysql_test_user
#   OCF_RESKEY_mysql_test_passwd

#######################################################################
# Initialization:

. /usr/lib/heartbeat/ocf-shellfuncs

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

SH=/bin/sh

# Default values - You can tweak them out
MYSQL_CONFIG="/etc/my.cnf"
MYSQL_DATADIR="/var/lib/mysql"
MYSQL_USER="mysql"
MYSQL_GROUP="mysql"
MYSQL_TEST_TABLE="mysql.user"
MYSQL_PIDFILE=/var/run/mysqld/mysqld.pid
MYSQL_SOCKET=/var/lib/mysql/mysql.sock

usage() {
  methods=`mysql_methods`
  methods=`echo $methods | tr ' ' '|'`
  cat <<-!
        usage: `basename $0` ($methods)

        `basename $0` manages a MySQL Database as an HA resource.

        The 'start' operation starts the database.
        The 'stop' operation stops the database.
        The 'status' operation reports whether the database is running
        The 'monitor' operation reports whether the database seems to be working
        The 'validate-all' operation reports whether the parameters are valid
        The 'meta-data' operation shows the meta data message

        !
}

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

<longdesc lang="en">
Resource script for mysql. It manages a MySQL Database instance as an HA 
resource.
</longdesc>
<shortdesc lang="en">mysql resource agent</shortdesc>

<parameters>
<parameter name="mysql_config" unique="0" required="0">
<longdesc lang="en">
Configuration file
</longdesc>
<shortdesc lang="en">mysql_config</shortdesc>
<content type="string" default="/etc/my.cnf" />
</parameter>
</parameters>

<parameters>
<parameter name="mysql_datadir" unique="0" required="0">
<longdesc lang="en">
Directory containing databases
</longdesc>
<shortdesc lang="en">mysql_datadir</shortdesc>
<content type="string" default="/var/lib/mysql" />
</parameter>
</parameters>

<parameters>
<parameter name="mysql_user" unique="0" required="0">
<longdesc lang="en">
User running mysql daemon
</longdesc>
<shortdesc lang="en">mysql_user</shortdesc>
<content type="string" default="mysql" />
</parameter>
</parameters>

<parameters>
<parameter name="mysql_group" unique="0" required="0">
<longdesc lang="en">
Group running mysql daemon
</longdesc>
<shortdesc lang="en">mysql_group</shortdesc>
<content type="string" default="mysql" />
</parameter>
</parameters>

<parameters>
<parameter name="mysql_test_table" unique="0" required="0">
<longdesc lang="en">
Table to be tested in monitor statement (in <database>.<table> notation)
</longdesc>
<shortdesc lang="en">mysql test table</shortdesc>
<content type="string" default="mysql.user" />
</parameter>
</parameters>

<parameters>
<parameter name="mysql_test_user" unique="0" required="0">
<longdesc lang="en">
Table to be tested in monitor statement (in <database>.<table> notation)
</longdesc>
<shortdesc lang="en">mysql test user</shortdesc>
</parameter>
</parameters>

<parameters>
<parameter name="mysql_test_passwd" unique="0" required="0">
<longdesc lang="en">
Table to be tested in monitor statement (in <database>.<table> notation)
</longdesc>
<shortdesc lang="en">mysql test user password</shortdesc>
</parameter>
</parameters>

<actions>
<action name="start" timeout="120" />
<action name="stop" timeout="120" />
<action name="status" timeout="60" />
<action name="monitor" depth="0" timeout="30" interval="10" start-delay="10" />
<action name="validate-all" timeout="5" />
<action name="meta-data" timeout="5" />
</actions>
</resource-agent>
END
}


#
# methods: What methods/operations do we support?
#
mysql_methods() {
  cat <<-!
        start
        stop
        status
        monitor
        validate-all
        meta-data
        !
}

mysql_silent_status() {
        if [ ! -e $MYSQL_PIDFILE ]; then
                ocf_log info "No pid file found"
                return $OCF_NOT_RUNNING;
        fi
        
        pid=`cat $MYSQL_PIDFILE`;

        if [ -d /proc -a -d /proc/1 ]; then
                [ -d /proc/$pid ]
        else
                # This assumes we are root
                kill -0 $pid >/dev/null 2>&1
        fi
}

mysql_status() {
        if mysql_silent_status; then
                ocf_log info "MySQL running"
                return $OCF_SUCCESS;
        else    
                ocf_log info "MySQL not running"
                return $OCF_NOT_RUNNING;
        fi
}

mysql_start() {
        if mysql_silent_status; then
                ocf_log info "MySQL already running"
                return $OCF_SUCCESS
        else

        config=$1
        datadir=$2
        user=$3
        group=$4
        
        touch /var/log/mysqld.log
        chown $user:$group /var/log/mysqld.log
        chmod 0640 /var/log/mysqld.log
        [ -x /sbin/restorecon ] && /sbin/restorecon /var/log/mysqld.log

        if [ ! -d $datadir/mysql ] ; then       
            ocf_log info "Initializing MySQL database: " 
            /usr/bin/mysql_install_db --datadir=$datadir
            ret=$?
            chown -R $user:$group $datadir
            if [ $ret -ne 0 ] ; then
                ocf_log err "Problem with initialization";
                exit $OCF_ERR_GENERIC
            fi
        fi

        chown -R $user:$group $datadir
        chmod 0755 $datadir
        /usr/bin/mysqld_safe  --defaults-file=$config --pid-file=$MYSQL_PIDFILE 
--socket=$MYSQL_SOCKET --datadir=$datadir --user=$user >/dev/null 2>&1 &
        ret=$?
        # Spin for a maximum of N seconds waiting for the server to come up.
        # Rather than assuming we know a valid username, accept an "access
        # denied" response as meaning the server is functioning.
        if [ $ret -eq 0 ]; then
            STARTTIMEOUT=10
            while [ $STARTTIMEOUT -gt 0 ]; do
                RESPONSE=`/usr/bin/mysqladmin -uUNKNOWN_MYSQL_USER ping 2>&1` 
&& break
                echo "$RESPONSE" | grep -q "Access denied for user" > /dev/null 
2>&1 && break
                sleep 1
                let STARTTIMEOUT=${STARTTIMEOUT}-1
            done
            if [ $STARTTIMEOUT -eq 0 ]; then
                    ocf_log err "Timeout error occurred trying to start MySQL 
Daemon."
                    return $OCF_ERR_GENERIC
            else
                    ocf_log info "MySQL started"
                    return $OCF_SUCCESS
            fi
        else
            ocf_log err "mysqld_safe failed"
            return $ret
        fi
        touch /var/lock/subsys/mysqld
        return $ret
        fi
}

mysql_stop() {
        if 
                mysql_silent_status
        then
                pid=`cat $MYSQL_PIDFILE 2> /dev/null `
                if 
                        kill $pid > /dev/null 2>&1
                then
                    if [ -d /proc -a -d /proc/1 ]; then
                        count=0;
                        while 
                                [ -d /proc/$pid ] &&
                                [ $count -lt 10 ]
                        do
                                sleep 1;
                                kill $pid >/dev/null 2>&1
                                ocf_log info "Killing MySQL PID $pid"
                                count=$((count+1))
                        done    
                    fi
                    if [ ! -d /proc/$pid ]; then
                            ocf_log info "MySQL stopped";
                    else
                            ocf_log err "MySQL stop timeout exceeded";
                            return $OCF_ERR_GENERIC     
                    fi
                else
                    ocf_log err "MySQL couldn't be stopped"
                    return $OCF_ERR_GENERIC
                fi
                rm -f /var/lock/subsys/mysqld
                rm -f $datadir/mysql.sock
        else
                # If MySQL ist not running already, it should return 0 to be 
OCF compliant
                ocf_log info "MySQL is not running."
        fi
        return $OCF_SUCCESS
}

mysql_monitor() {
        if mysql_silent_status ; then
                test_table=$1
                test_user=$2
                test_passwd=$3
                if [ -z $test_user ]; then
                        buf=`echo "SELECT * FROM $test_table" | mysql 
--user=root --password=lol --socket=$MYSQL_SOCKET -O connect_timeout=1 2>&1`
                        ret=$?
                else    
                        buf=`echo "SELECT * FROM $test_table" | mysql 
--user=$test_user --password=$test_passwd --socket=$MYSQL_SOCKET -O 
connect_timeout=1 2>&1`
                        ret=$?
                fi

                        if [ ! $ret -eq 0 ]; then
                                ocf_log err "MySQL $test_table monitor failed:";
                                if [ ! -z "$buf" ]; then ocf_log err $buf; fi
                                return $OCF_ERR_GENERIC;
                        else
                                ocf_log info "MySQL monitor succeded";
                                return $OCF_SUCCESS;
                        fi
        else
                ocf_log info "MySQL not running";
                return $OCF_NOT_RUNNING;
        fi
}


validate_all() {
        if [ ! -f $config ]; then
                ocf_log err "Config $config doesn't exist";
                exit $OCF_ERR_ARGS;
        fi

        if [ ! -d $datadir ]; then
                ocf_log err "Datadir $datadir dosen't exist";
                exit $OCF_ERR_ARGS;
        fi

        grep $user /etc/passwd >/dev/null 2>&1
        if [ ! $? -eq 0 ]; then
                ocf_log err "User $user doesn't exit";
                exit $OCF_ERR_ARGS;
        fi

        grep $group /etc/group >/dev/null 2>&1
        if [ ! $? -eq 0 ]; then
                ocf_log err "Group $group doesn't exist";
                exit $OCF_ERR_ARGS;
        fi
}

# initializing the parameters
if [ -z $OCF_RESKEY_mysql_config ]; then
        config=$MYSQL_CONFIG;
else
        config=$OCF_RESKEY_mysql_config;
fi
if [ -z $OCF_RESKEY_mysql_datadir ]; then
        datadir=$MYSQL_DATADIR;
else    
        datadir=$OCF_RESKEY_mysql_datadir;
fi
if [ -z $OCF_RESKEY_mysql_user ]; then
        user=$MYSQL_USER;
else
        user=$OCF_RESKEY_mysql_user;
fi
if [ -z $OCF_RESKEY_mysql_group ]; then
        group=$MYSQL_GROUP;
else
        group=$OCF_RESKEY_mysql_group;
fi
if [ -z $OCF_RESKEY_mysql_test_table ]; then
        test_table=$MYSQL_TEST_TABLE;
else
        test_table=$OCF_RESKEY_mysql_test_table;
fi
if [ ! -z $OCF_RESKEY_mysql_test_user ]; then
        test_user=$OCF_RESKEY_mysql_test_user;
fi
if [ ! -z $OCF_RESKEY_mysql_test_passwd ]; then
        test_passwd=$OCF_RESKEY_mysql_test_passwd;
fi

# What kind of method was invoked?
case "$1" in

  start)        mysql_start $config $datadir $user $group
                exit $?;;

  stop)         mysql_stop
                exit $?;;

  status)       mysql_status
                exit $?;;

  monitor)      mysql_monitor $test_table $test_user $test_passwd
                exit $?;;

  validate-all) validate_all 
                exit $?;;       
  
  meta-data)    meta_data
                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