#!/bin/bash

# Creates a PostgreSQL server 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_postgresql_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="postgresql"
CART_VERSION="8.4"
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

CART_INSTANCE_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 postgresql - configure it as such.
if only_cart_on_gear $cartridge_type; then
    prepare_gear_for_standalone_postgresql
fi

POSTGRESQL_PORT=5432
POSTGRESQL_IP=`find_open_ip $uid $uuid $POSTGRESQL_PORT`
HOST_VAR=OPENSHIFT_POSTGRESQL_DB_HOST
PORT_VAR=OPENSHIFT_POSTGRESQL_DB_PORT

#
# Create the core of the application
#

pushd "$CART_INSTANCE_DIR" >/dev/null
mkdir -p log etc data socket pid run
popd >/dev/null
# Create postgresql database
# The contained tar file is the results of "initdb -D data", but much, much faster.
tar -zxf $CART_INFO_DIR/configuration/data/pgdata-template.tar.gz -C "${CART_INSTANCE_DIR}/data/"
sed "s,RHC_PSQLDIR,$CART_INSTANCE_DIR," $CART_ETC_DIR/postgresql.conf > ${CART_INSTANCE_DIR}/data/postgresql.conf
sed -i "s,RHC_BIND_ADDR,$POSTGRESQL_IP," $CART_INSTANCE_DIR/data/postgresql.conf
cp -f $CART_ETC_DIR/pg_hba.conf $CART_INSTANCE_DIR/data/pg_hba.conf
chown -R $user_id.$group_id "${CART_INSTANCE_DIR}/data/" || error "Failed to chown data/ directory. Please contact support" 126


#
# 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 "$CART_INSTANCE_DIR"

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

# Setup psql command files
touch $APP_HOME/.psql_history $APP_HOME/.pgpass
chmod 0600 $APP_HOME/.pgpass
observe_setup_var_lib_file $APP_HOME/.psql_history
observe_setup_var_lib_file $APP_HOME/.pgpass
chown $user_id.$group_id  $APP_HOME/.psql_history $APP_HOME/.pgpass

#
# Start postgres and set env variables to use.
# Note: We can't write the ~/.env/ files as we are still setting up the
#       postgresql environment and not all values are valid as yet.
#
export OPENSHIFT_POSTGRESQL_DB_USERNAME='admin'
export OPENSHIFT_POSTGRESQL_DB_PASSWORD="admin"
export OPENSHIFT_POSTGRESQL_DB_HOST="$POSTGRESQL_IP"
export OPENSHIFT_POSTGRESQL_DB_PORT="$POSTGRESQL_PORT"
start_database

# TODO: rmillner: is the owner $uuid or admin?
## Setup user
dbname=${OPENSHIFT_APP_NAME:-$application}
cat <<EOF | PGPASSWORD=admin psql -a -h $OPENSHIFT_POSTGRESQL_DB_HOST -p $OPENSHIFT_POSTGRESQL_DB_PORT -U admin -d postgres -f - || error "Failed to set credentials or create database" 124
CREATE USER "$uuid" with SUPERUSER CREATEDB CREATEROLE;
CREATE DATABASE "$dbname" OWNER "$uuid";
ALTER USER admin PASSWORD '$password';
EOF


## Setup automatic login file.
echo "$POSTGRESQL_IP:$POSTGRESQL_PORT:*:admin:$password" > $APP_HOME/.pgpass
chmod 0400 $APP_HOME/.pgpass

#
# Setup Environment Variables
#
echo "export OPENSHIFT_POSTGRESQL_DB_USERNAME='admin'" > $APP_HOME/.env/OPENSHIFT_POSTGRESQL_DB_USERNAME
echo "export OPENSHIFT_POSTGRESQL_DB_PASSWORD='$password'" > $APP_HOME/.env/OPENSHIFT_POSTGRESQL_DB_PASSWORD
echo "export OPENSHIFT_POSTGRESQL_DB_HOST='$POSTGRESQL_IP'" > $APP_HOME/.env/OPENSHIFT_POSTGRESQL_DB_HOST
echo "export OPENSHIFT_POSTGRESQL_DB_PORT='$POSTGRESQL_PORT'" > $APP_HOME/.env/OPENSHIFT_POSTGRESQL_DB_PORT
echo "export OPENSHIFT_POSTGRESQL_DB_SOCKET='${CART_INSTANCE_DIR}/socket/postgres.sock'" > $APP_HOME/.env/OPENSHIFT_POSTGRESQL_DB_SOCKET
echo "export OPENSHIFT_POSTGRESQL_DB_URL='postgresql://admin:$password@$POSTGRESQL_IP:$POSTGRESQL_PORT/'" > $APP_HOME/.env/OPENSHIFT_POSTGRESQL_DB_URL
echo "export OPENSHIFT_POSTGRESQL_DB_LOG_DIR='${CART_INSTANCE_DIR}/log'" > $APP_HOME/.env/OPENSHIFT_POSTGRESQL_DB_LOG_DIR



psql_ip="$POSTGRESQL_IP"
psql_port="$POSTGRESQL_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_POSTGRESQL_DB_PROXY_PORT
        if [ -n "$OPENSHIFT_GEAR_DNS" ]; then
          psql_ip=$OPENSHIFT_GEAR_DNS
          HOST_VAR=OPENSHIFT_GEAR_DNS
        fi

        if [ -n "$OPENSHIFT_POSTGRESQL_DB_PROXY_PORT" ]; then
          psql_port=$OPENSHIFT_POSTGRESQL_DB_PROXY_PORT
          PORT_VAR=OPENSHIFT_POSTGRESQL_DB_PROXY_PORT
        fi
    fi
fi

client_result ""
client_result "PostgreSQL 8.4 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: postgresql://\$$HOST_VAR:\$$PORT_VAR/"
    client_result 'PostgreSQL gear-local connection URL: postgresql://$OPENSHIFT_POSTGRESQL_DB_HOST:$OPENSHIFT_POSTGRESQL_DB_PORT/'
    client_result ""
else
    client_result 'Connection URL: postgresql://$OPENSHIFT_POSTGRESQL_DB_HOST:$OPENSHIFT_POSTGRESQL_DB_PORT/'
    client_result ""
fi

cart_props "connection_url=postgresql://$psql_ip:$psql_port/"
cart_props "username=admin"
cart_props "password=$password"
cart_props "database_name=${dbname}"

set_app_info "Connection URL: postgresql://$psql_ip:$psql_port/"
enable_cgroups
