#!/bin/bash
#
# mysqld	This shell script takes care of starting and stopping
#		the MySQL subsystem (mysqld).
#
# chkconfig: 2345 11 90
# description:	MySQL database server.
# processname: mysqld
# config: /etc/my.cnf
# config: /etc/sysconfig/mysql
# pidfile: /var/run/mysqld/mysqld.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# extract value of a MySQL option from /etc/my.cnf
# Usage: get_mysql_option FILE VARNAME DEFAULT
# result is returned in $result
# Ugly as this is, it knows nothing of option file sections ...
get_mysql_option() {
	result=`sed -n "s/^[ \t]*$2[ \t]*=[ \t]*//p" "$1" 2>/dev/null | tail -n 1`
	if [ -z "${result}" ]; then
	    # not found, use default
	    result="$3"
	else
	    # found, still have to deal with quoting and end-of-line comments
	    dequoted=`echo "${result}" | sed "s/^'\([^']*\)'.*$/\1/"`
	    if [ x"${dequoted}" != x"${result}" ]; then
		result="${dequoted}"
	    else
		dequoted=`echo "${result}" | sed 's/^"\([^"]*\)".*$/\1/'`
		if [ x"${dequoted}" != x"${result}" ]; then
		    result="${dequoted}"
		else
		    result=`echo "${result}" | sed 's/^\([^ \t#]*\).*$/\1/'`
		fi
	    fi
	fi
}

get_mysql_option /etc/my.cnf datadir "/var/lib/mysql"
datadir="${result}"
get_mysql_option /etc/my.cnf socket "${datadir}/mysql.sock"
socketfile="${result}"
get_mysql_option /etc/my.cnf err-log "/var/log/mysqld.log"
errlogfile="${result}"
get_mysql_option /etc/my.cnf pid-file "/var/run/mysqld/mysqld.pid"
mypidfile="${result}"
get_mysql_option /etc/my.cnf user "mysql"
user="${result}"

# Source mysql configuration.
[ -f /etc/sysconfig/mysqld ] && . /etc/sysconfig/mysqld

start() {
	touch "${errlogfile}"
	chown ${user}:${user} "${errlogfile}"
	chmod 0640 "${errlogfile}"
	[ -x /sbin/restorecon ] && /sbin/restorecon "${errlogfile}"
	if [ ! -d "${datadir}/mysql" ] ; then
	    action "Initializing MySQL database: " /usr/bin/mysql_install_db
	    ret=$?
	    chown -R ${user}:${user} "${datadir}"
	    if [ ${ret} -ne 0 ] ; then
		return ${ret}
	    fi
	fi
	chown -R ${user}:${user} "${datadir}"
	chmod 0711 "${datadir}"

	# The reason for explicitly specifying --pid-file is that there may
	# be no such entry in my.cnf, and the default behavior will be to not
	# create it at all...
	/usr/bin/mysqld_safe --defaults-file=/etc/my.cnf \
	    ${MYSQLD_OPTIONS:-""} \
	    --pid-file="${mypidfile}" >/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" && break
		sleep 1
		let STARTTIMEOUT=${STARTTIMEOUT}-1
	    done
	    if [ ${STARTTIMEOUT} -eq 0 ]; then
                    echo "Timeout error occurred trying to start MySQL Daemon."
                    action "Starting MySQL: " /bin/false
            else
                    action "Starting MySQL: " /bin/true
            fi
	else
    	    action "Starting MySQL: " /bin/false
	fi
	[ ${ret} -eq 0 ] && touch /var/lock/subsys/mysqld
	return ${ret}
}

stop() {
        /bin/kill `cat "${mypidfile}"  2>/dev/null ` >/dev/null 2>&1
	ret=$?
	if [ ${ret} -eq 0 ]; then
	    sleep 2
	    rm -f /var/lock/subsys/mysqld
	    rm -f "${socketfile}"
	    action "Stopping MySQL: " /bin/true
	else
    	    action "Stopping MySQL: " /bin/false
	fi
	return ${ret}
}
 
restart() {
    stop
    start
}

condrestart() {
    [ -e /var/lock/subsys/mysqld ] && restart || :
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status mysqld
    ;;
  restart|reload)
    restart
    ;;
  condrestart)
    condrestart
    ;;
  *)
    echo "Usage: $0 {start|stop|status|condrestart|restart|reload}"
    exit 1
esac

exit $?
