#!/bin/sh
#
# mysql		A very fast and reliable SQL database engine
#
# chkconfig:	2345 84 25
#
# description:	A very fast and reliable SQL database engine.
#
# pidfile:	/var/lib/mysql/mysqld.pid

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

# Get network config
. /etc/sysconfig/network

# Check that networking is up
if is_yes "${NETWORKING}"; then
	if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
		msg_network_down MySQL
		exit 1
	fi
else
	exit 0
fi

MYSQLD_ERRLOG=/var/log/mysql/err
MYSQLD_CONFIG=/etc/mysqld.conf 

# Get service config
if [ -f /etc/sysconfig/mysql ]; then
	. /etc/sysconfig/mysql
fi

# Daemon doesn't die if config doesn't exist
if [ ! -f $MYSQLD_CONFIG ]; then 
	nls "%s config %s does not exist." MySQL "$MYSQLD_CONFIG" >&2
	exit 6
fi

eval `awk '
/^[ \t]*\[.*\][ \t]*$/ {
	match($0,/\[.*\]/)
	section=substr($0,RSTART+1,RSTART+RLENGTH-3)
}
section=="mysqld" && $2~"=" {
	if ($1=="datadir") {
		printf("MYSQL_DATA_DIR=%s;", $3)
	} else if ($1=="user") {
		printf("MYSQL_USER=%s;", $3)
	} else if ($1=="pid-file") {
		printf("MYSQL_PIDFILE=%s;", $3)
	}
}
END {
	print "export MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE"
}
' /etc/mysqld.conf`

if [ -z $MYSQL_DATA_DIR ]; then 
	echo "$(nls 'MySQL datadir %s not configured properly' "$MYSQL_DATA_DIR")"'!' >&2
	nls "Edit %s and configure it." "$MYSQLD_CONFIG" >&2
	exit 6
fi

if [ -z $MYSQL_USER ]; then 
	echo "$(nls 'MySQL user not configured properly')"'!' >&2
	nls "Edit %s and configure it." "$MYSQLD_CONFIG" >&2
	exit 6
fi

RETVAL=0
case "$1" in
  start)
	if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
		nls "MySQL database not initialized. Try '%s init' before start." "$0" >&2
		exit 6
	fi

	# Check if the service is already running?		
	if [ ! -f /var/lock/subsys/mysql ]; then
		msg_starting MySQL
		busy

		if [ ! -f $MYSQLD_ERRLOG ]; then 
			touch $MYSQLD_ERRLOG
		fi
		chown mysql.mysql $MYSQLD_ERRLOG
		chmod 640 $MYSQLD_ERRLOG

		[ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
		TMPDIR=/tmp nice -n ${SERVICE_RUN_NICE_LEVEL:-$DEFAULT_SERVICE_RUN_NICE_LEVEL} /usr/sbin/mysqld --defaults-file=$MYSQLD_CONFIG >>$MYSQLD_ERRLOG 2>&1 &
		sleep 1
		if ps -C mysqld >/dev/null 2>&1; then
			ok
		else
			RETVAL=1
			fail
		fi
		[ $RETVAL -eq 0 ] && touch /var/lock/subsys/mysql
	else 	
		msg_already_running MySQL
	fi
	;;
  stop)
	if [ -f /var/lock/subsys/mysql ]; then
		msg_stopping MySQL
		killproc mysqld
		sleep 1
		rm -f /var/lock/subsys/mysql $MYSQLD_PIDFILE >/dev/null 2>&1
	else
		msg_not_running MySQL
	fi
	;;
  status)
	status mysqld
	exit $?
	;;
  restart|force-reload)
	$0 stop
	$0 start
	exit $?
	;;
  init)
	# Check if not exist init database
	if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
		nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysql"
		nls "before initializing database."
		exit 1;
	fi

	show "Creating privilege mysql tables"
	busy
	TMP=/tmp TMPDIR=/tmp 
	
	# Install this in the user table, too
	hostname="`hostname --fqdn | tr -d '[:space:]'`"
		
	# Check if hostname is valid
	if [ -z "$hostname" ]; then
		deltext
		fail
		nls "Sorry, the host name is not configured."
		nls "Please configure the 'hostname' command to return a hostname."
		exit 1
	elif ! hostname -i >/dev/null 2>&1; then 
		deltext
		fail
		nls "Sorry, the host '%s' could not be looked up." "$hostname"
		nls "Please configure the 'hostname' command to return a correct hostname."
		exit 1
	fi

	# Initialize variables
	c_d="" i_d=""
	c_h="" i_h=""
	c_u="" i_u=""
	c_f="" i_f=""
	c_t="" c_c=""

	# Check for old tables
	if test ! -f $mdata/db.frm
	then
	  # mysqld --bootstrap wants one command/line
	  c_d="$c_d CREATE TABLE db ("
	  c_d="$c_d   Host char(60) DEFAULT '' NOT NULL,"
	  c_d="$c_d   Db char(64) DEFAULT '' NOT NULL,"
	  c_d="$c_d   User char(16) DEFAULT '' NOT NULL,"
	  c_d="$c_d   Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d   Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
	  c_d="$c_d KEY User (User)"
	  c_d="$c_d )"
	  c_d="$c_d comment='Database privileges';"

	  i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
	  INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');"
	fi

	if test ! -f $mdata/host.frm
	then
	  c_h="$c_h CREATE TABLE host ("
	  c_h="$c_h  Host char(60) DEFAULT '' NOT NULL,"
	  c_h="$c_h  Db char(64) DEFAULT '' NOT NULL,"
	  c_h="$c_h  Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_h="$c_h  PRIMARY KEY Host (Host,Db)"
	  c_h="$c_h )"
	  c_h="$c_h comment='Host privileges;  Merged with database privileges';"
	fi

	if test ! -f $mdata/user.frm
	then
	  c_u="$c_u CREATE TABLE user ("
	  c_u="$c_u   Host char(60) DEFAULT '' NOT NULL,"
	  c_u="$c_u   User char(16) DEFAULT '' NOT NULL,"
	  c_u="$c_u   Password char(16) DEFAULT '' NOT NULL,"
	  c_u="$c_u   Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   File_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Super_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
	  c_u="$c_u   ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL,"
	  c_u="$c_u   ssl_cipher BLOB NOT NULL,"
	  c_u="$c_u   x509_issuer BLOB NOT NULL,"
	  c_u="$c_u   x509_subject BLOB NOT NULL,"
	  c_u="$c_u   max_questions int(11) unsigned DEFAULT 0  NOT NULL,"
	  c_u="$c_u   max_updates int(11) unsigned DEFAULT 0  NOT NULL,"
	  c_u="$c_u   max_connections int(11) unsigned DEFAULT 0  NOT NULL,"
	  c_u="$c_u   PRIMARY KEY Host (Host,User)"
	  c_u="$c_u )"
	  c_u="$c_u comment='Users and global privileges';"

	  i_u="INSERT INTO user VALUES ('localhost','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
	  INSERT INTO user VALUES ('$hostname','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);

	  REPLACE INTO user VALUES ('localhost','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
	  REPLACE INTO user VALUES ('$hostname','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);

	  INSERT INTO user VALUES ('localhost','mysql_logrotate','','N','N','N','N','N','N','Y','N','N','N','N','N','N','N','N','N','N','N','N','N','N','','','','',0,0,0);"
	fi

	if test ! -f $mdata/func.frm
	then
	  c_f="$c_f CREATE TABLE func ("
	  c_f="$c_f   name char(64) DEFAULT '' NOT NULL,"
	  c_f="$c_f   ret tinyint(1) DEFAULT '0' NOT NULL,"
	  c_f="$c_f   dl char(128) DEFAULT '' NOT NULL,"
	  c_f="$c_f   type enum ('function','aggregate') NOT NULL,"
	  c_f="$c_f   PRIMARY KEY (name)"
	  c_f="$c_f )"
	  c_f="$c_f   comment='User defined functions';"
	fi

	if test ! -f $mdata/tables_priv.frm
	then
	  c_t="$c_t CREATE TABLE tables_priv ("
	  c_t="$c_t   Host char(60) DEFAULT '' NOT NULL,"
	  c_t="$c_t   Db char(64) DEFAULT '' NOT NULL,"
	  c_t="$c_t   User char(16) DEFAULT '' NOT NULL,"
	  c_t="$c_t   Table_name char(60) DEFAULT '' NOT NULL,"
	  c_t="$c_t   Grantor char(77) DEFAULT '' NOT NULL,"
	  c_t="$c_t   Timestamp timestamp(14),"
	  c_t="$c_t   Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL,"
	  c_t="$c_t   Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
	  c_t="$c_t   PRIMARY KEY (Host,Db,User,Table_name),"
	  c_t="$c_t   KEY Grantor (Grantor)"
	  c_t="$c_t )"
	  c_t="$c_t   comment='Table privileges';"
	fi

	if test ! -f $mdata/columns_priv.frm
	then
	  c_c="$c_c CREATE TABLE columns_priv ("
	  c_c="$c_c   Host char(60) DEFAULT '' NOT NULL,"
	  c_c="$c_c   Db char(60) DEFAULT '' NOT NULL,"
	  c_c="$c_c   User char(16) DEFAULT '' NOT NULL,"
	  c_c="$c_c   Table_name char(60) DEFAULT '' NOT NULL,"
	  c_c="$c_c   Column_name char(60) DEFAULT '' NOT NULL,"
	  c_c="$c_c   Timestamp timestamp(14),"
	  c_c="$c_c   Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
	  c_c="$c_c   PRIMARY KEY (Host,Db,User,Table_name,Column_name)"
	  c_c="$c_c )"
	  c_c="$c_c   comment='Column privileges';"
	fi

	if /usr/sbin/mysqld --bootstrap --skip-grant-tables \
	    --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER >/dev/null 2>&1 << END_OF_DATA
CREATE DATABASE mysql;
use mysql;
$c_d
$i_d

$c_h
$i_h

$c_u
$i_u

$c_f
$i_f

$c_t
$c_c
END_OF_DATA
	then 
	    ok
	    cat << END_OF_MSG

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
This is done (after starting database) with:

/usr/bin/mysqladmin -u mysql password 'password'
/usr/bin/mysqladmin -h $hostname -u mysql password 'password'
/usr/bin/mysqladmin -u mysql_logrotate password 'password'

NOTE: mysql_logrotate password should be placed to /etc/mysqld.conf in
mysqladmin section. See the manual for more instructions.

END_OF_MSG
      else  
	    fail
	    cat << END_OF_MSG
Installation of grant tables FAILED!

Examine the logs in $MYSQL_DATA_DIR for more information.  You can
also try to start the mysqld demon with:

/usr/sbin/mysqld --skip-grant &

You can use the command line tool /usr/bin/mysql to connect to the mysql
database and look at the grant tables:

shell> /usr/bin/mysql -u mysql mysql
mysql> show tables

Try 'mysqld --help' if you have problems with paths. Setting on
logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
may be helpful. The latest information about MySQL is available on the
web at http://www.mysql.com/.

Please check PLD ftp site for newer versions of this package.

Please consult the MySQL manual section: 'Problems running
mysql_install_db', and the manual section that describes problems on
your OS.  Another information source is the MySQL email archive.
Please check all of the above before mailing us!  And if you do mail
us, you MUST use the /usr/bin/mysqlbug script!  

END_OF_MSG

	exit 1
	fi
	;;
  flush-logs)
	/usr/bin/mysqladmin --defaults-file=/etc/mysqld.conf flush-logs
	;;
  *)
	msg_usage "$0 {start|stop|init|restart|force-reload|status|flush-logs}"
	exit 3
esac

exit $RETVAL
