#!/bin/sh /etc/rc.common
# Copyright (C) 2010-2018 OpenWrt.org

START=95
STOP=10

USE_PROCD=1

#PROCD_DEBUG=1

NAME=mysqld

LOGGER="/usr/bin/logger -p user.err -s -t $NAME --"
COMMAND=/usr/bin/$NAME

mysqld_get_param() {
	$COMMAND --print-defaults \
		| tr " " "\n" \
		| grep -- "--$1" \
		| tail -n 1 \
		| cut -d= -f2
}

start_service() {
	local conf=/etc/mysql/my.cnf
	local dir
	local user
	local group

	local logfile

	local datadir
	local logdir=/var/log/mysql
	local rundir=/var/run/mysqld
	local tmpdir

	local enabled
	local log_stderr
	local log_stdout
	local options

	local hint="please fix your server configuration in /etc/mysql/"

	if [ ! -x $COMMAND ]; then
		$LOGGER $COMMAND is missing
		exit 1
	fi

	if [ ! -r $conf ]; then
		$LOGGER $conf cannot be read
		exit 1
	fi

	config_load $NAME

	config_get_bool enabled general enabled 0
	if [ $enabled -eq 0 ]; then
		$LOGGER service not enabled in /etc/config/$NAME
		exit 1
	fi

	config_get_bool log_stderr general log_stderr 1
	config_get_bool log_stdout general log_stdout 1

	config_get options general options

	datadir=$(mysqld_get_param datadir)
	logfile=$(mysqld_get_param general_log_file)
	tmpdir=$(mysqld_get_param tmpdir)
	user=$(mysqld_get_param user)

	if [ -z "$datadir" ]; then
		$LOGGER datadir is not set
		$LOGGER $hint
		exit 1
	fi

	if [ -z "$tmpdir" ]; then
		$LOGGER tmpdir is not set
		$LOGGER $hint
		exit 1
	fi

	if [ -z "$user" ]; then
		$LOGGER user is not set
		$LOGGER $hint
		exit 1
	fi

	user_exists "$user" || {
		$LOGGER user \""$user"\" does not exist
		$LOGGER $hint
		exit 1
	}

	group=$(id -g -n "$user")

	group_exists "$group" || {
		$LOGGER group \""$group"\" does not exist
		$LOGGER user \""$user"\" not configured correctly
		exit 1
	}

	[ -n "$logfile" ] && logdir=$(dirname "$logfile")

	# do not touch directories that already exist
	# posix shell does not support arrays, hence using awk
	awk \
	  -v user="$user" \
	  -v group="$group" \
	  -v a="$datadir" \
	  -v b="$logdir" \
	  -v c="$rundir" \
	  -v d="$tmpdir" \
	  '
	    BEGIN {
	      dir[0]=a
	      dir[1]=b
	      dir[2]=c
	      dir[3]=d
	      for (x in dir) {
	        if (system("test ! -e \"" dir[x] "\"" )) {
	          delete dir[x]
	        }
	      }
	      for (x in dir) {
	        system("mkdir -p \"" dir[x] "\"" )
	        system("chmod 750 \"" dir[x] "\"" )
	        system("chown \"" user "\":\"" group "\" \"" dir[x] "\"" )
	      }
	    }
	  '

	if [ ! -f "$datadir/mysql/tables_priv.MAD" ]; then
		local args="--force"
		local basedir=$(mysqld_get_param basedir)
		[ -n "$basedir" ] && args="$args --basedir=$basedir"

		$LOGGER Cannot detect privileges table. You might need to run
		$LOGGER \'mysql_install_db $args\'
		$LOGGER to initialize the system tables.
		exit 1
	fi

	procd_open_instance

	procd_set_param command $COMMAND $options

	# forward stderr to logd
	procd_set_param stderr $log_stderr
	# same for stdout
	procd_set_param stdout $log_stdout

	procd_close_instance
}