#!/bin/bash

cd $OMD_ROOT

# Check if MySQL is enabled in OMD. If not terminate.
. lib/omd/init_profile
. etc/omd/site.conf
if [ "$CONFIG_MYSQL" != on ] ; then
    exit 5
fi

MYSQLD_PID=tmp/run/mysqld/mysqld.pid
MYSQL_CNF=.my.cnf

## Checks if there is a server running and if so if it is accessible.
#
# check_alive insists on a pingable server
# check_dead also fails if there is a lost mysqld in the process list
#
# Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn]
mysqld_status () {
    ping_output=`mysqladmin --defaults-file=$MYSQL_CNF ping 2>&1`; ping_alive=$(( ! $? ))

    ps_alive=0
    if [ -f "$MYSQLD_PID" ] && ps `cat $MYSQLD_PID` >/dev/null 2>&1; then ps_alive=1; fi

    if [ "$1" = "check_alive"  -a  $ping_alive = 1 ] ||
       [ "$1" = "check_dead"   -a  $ping_alive = 0  -a  $ps_alive = 0 ]; then
        return 0
    else
        if [ "$2" = "warn" ]; then
            echo -e "$ps_alive processes alive and 'mysqladmin --defaults-file=$MYSQL_CNF ping' resulted in\n$ping_output\n"
        fi
        return 1
    fi
}

mysql_wait_start() {
    if mysqld_status check_alive nowarn; then
        echo -n "already running. "
        return 1
    else
        mysqld_safe --defaults-file=$MYSQL_CNF >/dev/null 2>&1 &
        i=0
        while mysqld_status check_dead nowarn;  do
            if [ $i = '10' ]; then
                return 1
            else
                echo -n "."
                i=$(($i+1))
                sleep 1
           fi
        done
        return 0
    fi
}

mysql_wait_stop() {
    if mysqld_status check_dead nowarn; then
       echo -n 'Not running. '
       return 0
    fi

    mysqladmin --defaults-file=$MYSQL_CNF shutdown

    # wait until really stopped
    i=0
    while ! mysqld_status check_dead nowarn;  do
        if [ $i = '10' ]; then
            return 1
        else
            echo -n "."
            i=$(($i+1))
            sleep 1
       fi
    done

    return 0
}

check_install_db() {
    if [ ! -e ~/var/mysql/mysql ] ; then
        echo "first start of MySQL, creating initial database..."
        AUTHOPTION=""
        if [ $(mysql_install_db --help 2>&1 | grep -c auth-root-authentication) -gt 0 ]; then
            AUTHOPTION="--auth-root-authentication-method=normal"
        fi
        mysql_install_db --defaults-file=$MYSQL_CNF --force $AUTHOPTION > $OMD_ROOT/var/log/omd.log 2>&1
        if [ $? != 0 ]; then
            echo "failed: please have a look at $OMD_ROOT/var/log/omd.log"
            echo "and https://labs.consol.de/omd/packages/mariadb/"
            exit 1
        fi
    fi
}

__init_hook $0 $1 pre
case $1 in
    start)
        echo -n "Starting MySQL... "
        mkdir -p $OMD_ROOT/etc/mysql/conf.d
        check_install_db;
        if mysql_wait_start; then
            echo 'OK.'
            __init_hook $0 $1 post 0
            # create thruk logcache database
            if [ -e $OMD_ROOT/etc/thruk/thruk_local.d/omd_logcache.conf ] && [ $(grep -c ^logcache $OMD_ROOT/etc/thruk/thruk_local.d/omd_logcache.conf) -ge 1 ]; then
                echo "CREATE DATABASE IF NOT EXISTS thruk_logs" | mysql
            fi
            # create icinga2 ido database
            if [ -e $OMD_ROOT/etc/icinga2/features-enabled/omd-ido-mysql.conf ] && [ ! -d $OMD_ROOT/var/mysql/icinga ]; then
                echo "creating initial ido database"
                echo "CREATE DATABASE IF NOT EXISTS icinga" | mysql
                mysql icinga < $OMD_ROOT/share/icinga2-ido-mysql/schema/mysql.sql
            fi
            exit 0
        else
            echo 'ERROR.'
            __init_hook $0 $1 post 1
            exit 1
        fi
    ;;
    stop)
        echo -n "Stopping MySQL... "
        if mysql_wait_stop; then
            echo 'OK.'
            __init_hook $0 $1 post 0
            exit 0
        else
            echo 'ERROR.'
            __init_hook $0 $1 post 1
            exit 1
        fi
    ;;
    restart)
        $0 stop
        $0 start
    ;;
    reload)
        mysqladmin reload
    ;;
    status)
        if mysqld_status check_alive nowarn; then
            echo "$(mysqladmin version)"
        else
            echo "MySQL is stopped."
            exit 3
        fi
    ;;
    check)
    ;;
    *)
        echo "Usage: $0 {start|stop|restart|reload|status}"
    ;;
esac
