#!/bin/bash

set -euo pipefail

DEFAULTS_FILE=/etc/mysql/my.cnf

mysqld_get_param() {
	"${MYSQLD[@]}" --print-defaults \
		| tr " " "\n" \
		| grep -- "--$1" \
		| tail -n 1 \
		| cut -d= -f2 || echo "$2"
}

DATADIR=$(mysqld_get_param 'datadir' '/var/lib/mysql')
SOCKET=$(mysqld_get_param 'socket' '/var/run/mysqld/mysqld.sock')
PID_FILE=$(mysqld_get_param 'pid-file' '/var/run/mysqld/mysqld.pid')

USER=$(mysqld_get_param 'user' 'mysql')
GROUP=$(id -n -g "$USER")

MYSQL=(/usr/bin/mysql --defaults-file="$DEFAULTS_FILE")

MYSQLD=(/usr/sbin/mysqld --defaults-file="$DEFAULTS_FILE")
MYSQLD+=(--datadir="$DATADIR")
MYSQLD+=(--pid-file="$PID_FILE")
MYSQLD+=(--socket="$SOCKET")
MYSQLD+=(--user="$USER")

prestart () {
  if ! [ -f "$DATADIR/mysql/user.MYI" ]; then
    rm -rf "$DATADIR/mysql"
    /usr/bin/mysql_install_db \
      --defaults-file="$DEFAULTS_FILE" \
      --verbose \
      --skip-auth-anonymous-user \

  fi

  chown -Rc "$USER:$GROUP" "$DATADIR"
  chmod -Rc u=rwX,g=rX,o= "$DATADIR"

  pid_dir=$(dirname "$PID_FILE")
  socket_dir=$(dirname "$SOCKET")

  mkdir -p "$pid_dir"
  chown -Rc "$USER:$GROUP" "$pid_dir"
  chmod -R u=rwX,g=rX,o=rX "$pid_dir"

  # XXX It is possible that socket_dir == pid_dir
  mkdir -p "$socket_dir"
  chown -Rc "$USER:$GROUP" "$socket_dir"
  chmod -R u=rwX,g=rX,o=rX "$socket_dir"
}


poststart () {
  /usr/bin/mysql_upgrade --defaults-file="$DEFAULTS_FILE" \
    --socket="$SOCKET"
}

alive () {
  [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")"
}

start () {
  prestart

  "${MYSQLD[@]}" &

  count=0
  while ! "${MYSQL[@]}" -e ';' 2>/dev/null; do
    sleep 1s
    if ! (( count % 60 )); then
      "${MYSQL[@]}" -e ';' || true
    fi
    (( ++count ))
    if ! alive; then
      exit 1
    fi
  done

  poststart
}


export HOME=/etc/mysql
cd / || exit 1
umask 077

case "$1" in
    start) start;;
    *) echo "Unknown command: $1" >&2; exit 1;;
esac
