#!/bin/bash

if [ $# -gt 0 ] ; then
  COUNT=$1
  CONF="$2"
else
  COUNT=60
  CONF="/etc/mysql/my.cnf"
fi

if [ "$COUNT" -le 0 ] ; then
  echo "Usage: $0 <number_of_seconds> [<mysqlid>]" >&2
  exit 1
fi

if ! which mysqld >/dev/null 2>&1 ; then
  echo "Error: mysqld is not present. Exiting." >&2
  exit 1
fi

if ! which mysqladmin >/dev/null 2>&1 ; then
  echo "Error: mysqladmin is not present. Exiting." >&2
  exit 1
fi

mysqld_get_param() {
  mysqld --defaults-file="${CONF}" --print-defaults 2>/dev/null \
    | tr " " "\n" \
    | grep -- "--$1" \
    | tail -n 1 \
    | cut -d= -f2
}

mysqld_status () {
  if mysqladmin  --defaults-file="${CONF}" ping 2>&1 ; then
    ping_alive=1
  else
    ping_alive=0
  fi

  ps_alive=0
  pidfile=$(mysqld_get_param pid-file)

  if [ -f "$pidfile" ] && ps "$(cat "$pidfile")" &>/dev/null ; then
    ps_alive=1
  fi

  if { [ "$1" = "check_alive" ] && [ "$ping_alive" = 1 ]; } ||
      { [ "$1" = "check_dead" ] && [ "$ping_alive" = 0 ] && [ "$ps_alive" = 0 ]; }; then
    return 0
  fi

  return 1
}

printf "Checking MySQL service status (for a maximum of %s seconds): " "$COUNT"
for _ in $(seq 1 "$COUNT") ; do
  if mysqld_status check_alive warn; then
    printf "available.\n"
    exit 0
  else
    printf "."
  fi
  sleep 1
done

printf "still not available, giving up.\n"
exit 1
