#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          mysql
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $time
# Should-Stop:       $network $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/ Stop MySQL Community Server daemon
# Description:       This service script facilitates startup and shutdown of
#                    mysqld daemon throught its wrapper script mysqld_safe
### END INIT INFO
#

# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

. /lib/lsb/init-functions
. /usr/share/mysql/mysql-helpers

cd /
umask 077

# In case server is taking more to start or stop increase the timeout in defaults file
STARTTIMEOUT=120
STOPTIMEOUT=600
[ -e /etc/default/mysql ] && . /etc/default/mysql || true

VERSION=$(mysqld --version | grep mysqld | cut -d' ' -f4)

get_mysql_option() {
	RESULT=$(my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1)
	if [ -z "$RESULT" ];
	then
		RESULT="$3"
	fi
	echo $RESULT
}

fix_thp_setting() {
	THP_SETTING=$(get_mysql_option mysqld_safe thp-setting "")
	if [ ! -z "${THP_SETTING}" ]; then
	# Set whatever option is specified in config file
		echo "${THP_SETTING}" > /sys/kernel/mm/transparent_hugepage/defrag
		echo "${THP_SETTING}" > /sys/kernel/mm/transparent_hugepage/enabled
	fi
}

check_exit_status() {
        errcode=$1
        if [ $errcode -gt 0 ];
        then
                exit $errcode
        fi
}

get_running () {
	PIDFILE=$(get_mysql_option mysqld_safe pid-file "")
	MYSQLDATA=$(get_mysql_option mysqld datadir "/var/lib/mysql")
	if [ -z "$PIDFILE" ];
	then
		PIDFILE=$(get_mysql_option mysqld pid-file "$MYSQLDATA/$(hostname).pid")
	fi
	case $PIDFILE in
		/*) ;;
		*) PIDFILE="$MYSQLDATA/$PIDFILE" ;;
	esac
	if [ -e "$PIDFILE" ] && [ -d "/proc/$(cat "$PIDFILE")" ];
	then
		echo 1
	else
		echo 0
	fi
}

verify_server () {
	TIMEOUT=0
	if [ "${1}" = "start" ];
	then
		TIMEOUT=${STARTTIMEOUT}
	elif [ "${1}" = "stop" ];
	then
		TIMEOUT=${STOPTIMEOUT}
	fi

	COUNT=0
	while [ ${COUNT} -lt ${TIMEOUT} ];
	do
		COUNT=$(( COUNT+1 ))
		echo -n .
		if [ "${1}" = "start" ] && [ "$(get_running)" = 1 ];
		then
			if [ -z ${2} ];
			then
				echo
			fi
			return 0
		fi
		if [ "${1}" = "stop" ] && [ "$(get_running)" = 0 ];
		then
			if [ -z ${2} ];
			then
				echo
			fi
			return 0
		fi
		sleep 1
	done
	return 1
}

case "$1" in
  'start')
	if [ "$(get_running)" -eq 1 ];
	then
		log_action_msg "Percona Server is already started"
	else
		MYSQLRUN=/var/run/mysqld
		MYSQLDATA=$(get_mysql_option mysqld datadir "/var/lib/mysql")
		MYSQLFILES=/var/lib/mysql-files
		MYSQLLOG=/var/log/mysql
		MYSQLKEYRING=/var/lib/mysql-keyring

		if [ ! -d ${MYSQLDATA} -a ! -L ${MYSQLDATA} ];
		then
                        install -d -m 0750 -omysql -gmysql ${MYSQLDATA}
                        check_exit_status $?
		fi

		if [ ! -d ${MYSQLFILES} -a ! -L ${MYSQLFILES} ];
		then
                        install -d -m 0770 -omysql -gmysql ${MYSQLFILES}
                        check_exit_status $?
		fi

		if [ ! -d ${MYSQLKEYRING} -a ! -L ${MYSQLKEYRING} ];
		then
                        install -d -m 0750 -omysql -gmysql ${MYSQLKEYRING} 
                        check_exit_status $?
		fi

		if [ ! "$(ls -A ${MYSQLDATA})" ] && [ -d ${MYSQLFILES} ] && [ -d ${MYSQLKEYRING} ];
		then
			su - mysql -s /bin/bash -c "/usr/sbin/mysqld --initialize-insecure=on 2>&1 > /dev/null"
                        check_exit_status $?
			su - mysql -s /bin/bash -c "/usr/sbin/mysqld --log_error_verbosity=2 2>&1 > /dev/null &"
                        check_exit_status $?
			verify_server start no-newline
			mysql -e "INSTALL PLUGIN auth_socket SONAME 'auth_socket.so'"
			mysql -e "USE mysql; UPDATE user SET plugin='auth_socket' WHERE user='root'"
			mysqladmin shutdown
		fi

		if [ -x /usr/bin/mysql_ssl_rsa_setup -a ! -e "${MYSQLDATA}/server-key.pem" ];
		then
			/usr/bin/mysql_ssl_rsa_setup --datadir="${MYSQLDATA}" --uid=mysql >/dev/null 2>&1
		fi

		if [ ! -d ${MYSQLLOG} -a ! -L ${MYSQLLOG} ];
		then
                        install -d -m 0750 -omysql -gadm ${MYSQLLOG} 
                        check_exit_status $?
                        install -m 0640 -omysql -gadm /dev/null ${MYSQLLOG}/error.log
                        check_exit_status $?
		fi

		if [ ! -d "${MYSQLRUN}" -a ! -L "${MYSQLRUN}" ];
		then
                        install -d -m 0755 -omysql -gmysql ${MYSQLRUN} 
		fi

		# Needed because of TokuDB
		fix_thp_setting

		su - mysql -s /bin/bash -c "mysqld_safe > /dev/null &"
                check_exit_status $?
		verify_server start
                retval=$?
		if [ "$retval" -eq 0 ];
		then
			log_action_msg "Percona Server ${VERSION} is started"
		else
			log_action_msg "Percona Server ${VERSION} did not start. Please check logs for more details."
                        exit $retval
		fi
	fi
	;;

  'stop')
	if [ "$(get_running)" -eq 1 ];
	then
		killall -u mysql
		verify_server stop
                retval=$?
		if [ "$retval" -eq 0 ];
		then
			log_action_msg "Percona Server ${VERSION} is stopped"
		else
			log_action_msg "Attempt to shutdown Percona Server ${VERSION} timed out"
                        exit $retval
		fi
	else
		log_action_msg "Percona Server ${VERSION} is already stopped"
	fi
	;;

  'restart'|'reload'|'force-reload')
	log_action_msg "Stopping Percona Server ${VERSION}"
	$0 stop
	log_action_msg "Re-starting Percona Server ${VERSION}"
	$0 start
	;;

  'status')
	if [ "$(get_running)" -eq 1 ];
	then
		log_action_msg "Percona Server ${VERSION} is running"
	else
		log_action_msg "Percona Server ${VERSION} is not running"
		exit 3
	fi
	;;

  *)
	echo "Usage: $SELF start|stop|restart|reload|force-reload|status"
	exit 1
	;;
esac

exit 0
