#!/bin/bash

# Creates a mysql instance

# Exit on any errors
set -e

function print_help {
    echo "Usage: $0 app-name namespace uuid"

    echo "$0 $@" | logger -p local0.notice -t openshift_origin_mysql_configure
    exit 1
}

while getopts 'd' OPTION
do
    case $OPTION in
        d) set -x
        ;;
        ?) print_help
        ;;
    esac
done

[ $# -eq 4 -o $# -eq 3 ] || print_help

CART_NAME="mysql"
CART_VERSION="5.1"
cartridge_type="$CART_NAME-$CART_VERSION"
source "/etc/openshift/node.conf"
source ${CARTRIDGE_BASE_PATH}/abstract/info/lib/util

setup_embedded_configure "$1" $2 $3
disable_cgroups

MYSQL_DIR=$(get_cartridge_instance_dir "$cartridge_type")
CART_INFO_DIR=${CARTRIDGE_BASE_PATH}/embedded/$cartridge_type/info
source ${CART_INFO_DIR}/lib/util
source_if_exists "$APP_HOME/.env/OPENSHIFT_APP_NAME"
source_if_exists "$APP_HOME/.env/OPENSHIFT_HOMEDIR"

databases=$(get_local_databases)
if [ -n "$databases" ]; then
    client_error "Only 1 embedded database permitted - application currently has '$databases'"
    exit 133
fi

create_cartridge_instance_dir "$cartridge_type"

# This gear is dedicated to running mysql - configure it as such.
if only_cart_on_gear $cartridge_type; then 
    prepare_gear_for_standalone_mysql
fi

MYSQL_PORT=3306
MYSQL_IP=`find_open_ip $uid $uuid $MYSQL_PORT`
HOST_VAR=OPENSHIFT_MYSQL_DB_HOST
PORT_VAR=OPENSHIFT_MYSQL_DB_PORT
#
# Create the core of the application
#
pushd "$MYSQL_DIR" > /dev/null
mkdir -p log etc data socket pid run
sed "s,RHC_MYSQLDIR,$MYSQL_DIR," $CART_ETC_DIR/my.cnf > $MYSQL_DIR/etc/my.cnf
sed -i "s,RHC_BIND_ADDR,$MYSQL_IP," $MYSQL_DIR/etc/my.cnf
popd > /dev/null
# Create mysql database
/usr/bin/mysql_install_db --defaults-file=$MYSQL_DIR/etc/my.cnf > /dev/null 2>&1 || error "Failed to create mysqldb" 119

#
# Setup Permissions
# 
secure_app_dir
secure_cart_instance_dir
observe_setup_var_lib_dir "$APP_HOME/app-root/"
observe_setup_var_lib_dir "$APP_DIR"
observe_setup_var_lib_dir "$MYSQL_DIR"

start_database

# Generate a password with no o's O's or 0's
password=$(generate_password)

#
# Setup Environment Variables
#
echo "export OPENSHIFT_MYSQL_DB_USERNAME='admin'" > $APP_HOME/.env/OPENSHIFT_MYSQL_DB_USERNAME
echo "export OPENSHIFT_MYSQL_DB_PASSWORD='$password'" > $APP_HOME/.env/OPENSHIFT_MYSQL_DB_PASSWORD
echo "export OPENSHIFT_MYSQL_DB_HOST='$MYSQL_IP'" > $APP_HOME/.env/OPENSHIFT_MYSQL_DB_HOST
echo "export OPENSHIFT_MYSQL_DB_PORT='$MYSQL_PORT'" > $APP_HOME/.env/OPENSHIFT_MYSQL_DB_PORT
echo "export OPENSHIFT_MYSQL_DB_SOCKET='${MYSQL_DIR}/socket/mysql.sock'" > $APP_HOME/.env/OPENSHIFT_MYSQL_DB_SOCKET
echo "export OPENSHIFT_MYSQL_DB_URL='mysql://admin:$password@$MYSQL_IP:$MYSQL_PORT/'" > $APP_HOME/.env/OPENSHIFT_MYSQL_DB_URL
echo "export OPENSHIFT_MYSQL_DB_LOG_DIR='${MYSQL_DIR}/log'" > $APP_HOME/.env/OPENSHIFT_MYSQL_DB_LOG_DIR

## Setup user
dbname=${OPENSHIFT_APP_NAME:-$application}
echo "drop database test;
create database \`${dbname}\` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;" | mysql -u root -S "${MYSQL_DIR}/socket/mysql.sock" > /dev/null || error "Failed to create ${application}" 188

echo "                                  
delete from user;
grant all on *.* to 'admin'@'$MYSQL_IP' identified by '$password' with grant option;
grant all on *.* to 'admin'@'localhost' identified by '$password' with grant option;
flush privileges;" | mysql -u root -S "${MYSQL_DIR}/socket/mysql.sock" mysql > /dev/null || error "Failed to setup initial root user" 187

mysql_ip="$MYSQL_IP"
mysql_port="$MYSQL_PORT"
if is_a_scalable_app; then
   if $(dirname "$0")/expose-port "$@"; then
       source $APP_HOME/.env/OPENSHIFT_GEAR_DNS
       source $APP_HOME/.env/OPENSHIFT_MYSQL_DB_PROXY_PORT
       if [ -n "$OPENSHIFT_GEAR_DNS" ]; then
         mysql_ip=$OPENSHIFT_GEAR_DNS
         HOST_VAR=OPENSHIFT_GEAR_DNS
       fi

       if [ -n "$OPENSHIFT_MYSQL_DB_PROXY_PORT" ]; then
         mysql_port=$OPENSHIFT_MYSQL_DB_PROXY_PORT
         PORT_VAR=OPENSHIFT_MYSQL_DB_PROXY_PORT
       fi
   fi
fi

client_result ""
client_result "MySQL 5.1 database added.  Please make note of these credentials:"
client_result ""
client_result "   Root User: admin"
client_result "   Root Password: $password"
client_result "   Database Name: ${dbname}"
client_result ""

if is_a_scalable_app; then
    client_result "Connection URL: mysql://\$$HOST_VAR:\$$PORT_VAR/"
    client_result 'MySQL gear-local connection URL: mysql://$OPENSHIFT_MYSQL_DB_HOST:$OPENSHIFT_MYSQL_DB_PORT/'
    client_result ""
else
    client_result 'Connection URL: mysql://$OPENSHIFT_MYSQL_DB_HOST:$OPENSHIFT_MYSQL_DB_PORT/'
    client_result ""
    client_result "You can manage your new MySQL database by also embedding phpmyadmin-3.4."
    client_result "The phpmyadmin username and password will be the same as the MySQL credentials above."

fi

cart_props "connection_url=mysql://$mysql_ip:$mysql_port/"
cart_props "username=admin"
cart_props "password=$password"
cart_props "database_name=${dbname}"

set_app_info "Connection URL: mysql://$mysql_ip:$mysql_port/"
enable_cgroups
