#!/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) 2015, 2016, 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

cd /
umask 077

# In case server is taking more to start or stop increase the timeout here
STARTTIMEOUT=180
STOPTIMEOUT=60

# To avoid having hardcoded paths in the script, we do a search on the path, as suggested at:
# https://www.debian.org/doc/manuals/developers-reference/ch06.en.html#bpp-debian-maint-scripts
pathfind() {
	OLDIFS="$IFS"
	IFS=:
	for p in $PATH; do
		if [ -x "$p/$*" ]; then
			IFS="$OLDIFS"
			return 0
		fi
	done
	IFS="$OLDIFS"
	return 1
}

# We need to check that the binaries exist; When upgrading from community to commercial this
# script will be run after community is removed but before commercial is installed
VERSION="unknown"
if pathfind mysqld; then
	VERSION=$(mysqld --version | grep mysqld | cut -d' ' -f4)
fi

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

get_running () {
	PIDFILE=$(get_mysql_option mysqld_safe pid-file "")
	if [ -z "$PIDFILE" ];
	then
		PIDFILE=$(get_mysql_option mysqld pid-file "$MYSQLDATA/$(hostname).pid")
	fi
	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
}

MYSQLRUN=/var/run/mysqld
MYSQLDATA=$(get_mysql_option mysqld datadir "/var/lib/mysql")
MYSQLFILES=/var/lib/mysql-files
MYSQLKEYRING=/var/lib/mysql-keyring
MYSQLLOG=/var/log/mysql

case "$1" in
  'start')
	if [ "$(get_running)" -eq 1 ];
	then
		log_action_msg "A MySQL Server is already started"
	else
		if [ ! -d ${MYSQLDATA} -a ! -L ${MYSQLDATA} ];
		then
			mkdir ${MYSQLDATA}
			chown mysql:mysql ${MYSQLDATA}
			chmod 750 ${MYSQLDATA}
		fi

		if [ ! -d ${MYSQLFILES} -a ! -L ${MYSQLFILES} ];
		then
			mkdir ${MYSQLFILES}
			chown mysql:mysql ${MYSQLFILES}
			chmod 770 ${MYSQLFILES}
		fi

		if [ ! -d ${MYSQLKEYRING} -a ! -L ${MYSQLKEYRING} ];
		then
			mkdir ${MYSQLKEYRING}
			chown mysql:mysql ${MYSQLKEYRING}
			chmod 750 ${MYSQLKEYRING}
		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"
			su - mysql -s /bin/bash -c "/usr/sbin/mysqld --log_error_verbosity=2 2>&1 > /dev/null &"
			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
			mkdir ${MYSQLLOG}
			chown mysql:adm ${MYSQLLOG}
			chmod 750 ${MYSQLLOG}
			install /dev/null -m0640 -omysql -gadm ${MYSQLLOG}/error.log
		fi

		if [ ! -d "${MYSQLRUN}" -a ! -L "${MYSQLRUN}" ];
		then
			mkdir ${MYSQLRUN}
			chown mysql:mysql ${MYSQLRUN}
			chmod 755 ${MYSQLRUN}
		fi

		/lib/apparmor/profile-load usr.sbin.mysqld

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

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

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

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

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

exit 0
