#!/bin/bash

set -e

ACTION=${1}

if ! [ -r /usr/share/openstack-deploy/preseed-lib ] ; then
	echo "Can't find /usr/share/openstack-deploy/pressed-lib: exiting"
	exit 1
fi
. /usr/share/openstack-deploy/preseed-lib

OSINSTALL_RC=osinstallrc

osinstall_gen_pass () {
	GENERATED_PASSWORD=$(dd if=/dev/random bs=64 count=1 2>|/dev/null | md5sum | awk '{print $1}')
}

osinstall_check_installed () {
	local PKG_NAME
	PKG_NAME=${1}
	INSTALL_STRING=`dpkg -l ${PKG_NAME} | grep ^ii | awk '{print $2}'`
	if [ "${INSTALL_STRING}" = ${PKG_NAME} ] ; then
		return 0
	else
		return 1
	fi
}

osinstall_install_if_not_installed () {
	local PKG_NAME
	PKG_NAME=${1}
	if ! osinstall_check_installed ${PKG_NAME} ; then
		${APTGET} install ${PKG_NAME}
	fi
}

osinstall_rcvalue () {
	local RC_VARNAME RC_VARCONTENT RC_MESSAGE RC_ISPASS RC_DEFAULT
	RC_VARNAME=${1}
	RC_MESSAGE=${2}
	RC_ISPASS=${3}
	RC_DEFAULT=${4}
	RC_VARCONTENT=${!RC_VARNAME}	# TODO: find a way to work out this in ISO sh
	# using something like: eval "RC_VARCONTENT=\$$RC_VARNAME"
	if [ -z "${RC_VARCONTENT}" ] ; then
		if [ "${RC_ISPASS}" = "yes" ] && [ "${OS_INTERACTIVE}" = "no" ] ; then
			echo "Skipping entering pass in non-interactive mode"
		elif [ -n "${RC_DEFAULT}" ] && [ "${OS_INTERACTIVE}" = "no" ] ; then
			echo "Skipping user customization of default value in non-interactive mode"
		else
			echo -n "${RC_MESSAGE}"
			read RC_VARCONTENT
		fi
		if [ -z "${RC_VARCONTENT}" ]  && [ "${RC_ISPASS}" = "yes" ] ; then
			osinstall_gen_pass
			RC_VARCONTENT=${GENERATED_PASSWORD}
		elif [ -z "${RC_VARCONTENT}" ]  && [ -n "${RC_DEFAULT}" ] ; then
			RC_VARCONTENT=${RC_DEFAULT}
		else
			while [ -z "${RC_VARCONTENT}" ] ; do
				echo -n "${RC_MESSAGE}"
				read RC_VARCONTENT
			done
		fi
		echo "${RC_VARNAME}=${RC_VARCONTENT}" >>${OSINSTALL_RC}
		. ${OSINSTALL_RC}
	fi
}

usage () {
	echo "${0} <services|controller|compute|all-in-one>"
	exit 1
}

if [ -r ${OSINSTALL_RC} ] ; then
	. ${OSINSTALL_RC}
else
	echo "" >${OSINSTALL_RC}
fi

osinstall_mysql_server () {
	osinstall_rcvalue RC_MYSQL_SERVER_PKG_NAME "MySQL package name [mysql-server-5.5]: " no mysql-server-5.5
	osinstall_rcvalue RC_MYSQL_PASSWORD "MySQL server password [generated-password]: " yes
	if ! osinstall_check_installed ${RC_MYSQL_SERVER_PKG_NAME} ; then
echo "${RC_MYSQL_SERVER_PKG_NAME} mysql-server/root_password password ${RC_MYSQL_PASSWORD}
${RC_MYSQL_SERVER_PKG_NAME} mysql-server/root_password seen true
${RC_MYSQL_SERVER_PKG_NAME} mysql-server/root_password_again password ${RC_MYSQL_PASSWORD}
${RC_MYSQL_SERVER_PKG_NAME} mysql-server/root_password_again seen true
" | debconf-set-selections
		${APTGET} install ${RC_MYSQL_SERVER_PKG_NAME}
	fi
}

osinstall_mysql_set_host () {
	osinstall_rcvalue RC_MYSQL_SERVER_HOSTNAME "MySQL server hostname []: " no
}

osinstall_mysql_set_localhost () {
	. ${OSINSTALL_RC}
	if [ -z "${RC_MYSQL_SERVER_HOSTNAME}" ] ; then
		echo "RC_MYSQL_SERVER_HOSTNAME=localhost" >>${OSINSTALL_RC}
	fi
	. ${OSINSTALL_RC}
}

osinstall_install_services () {
	os_pressed_misc
	osinstall_mysql_server
	osinstall_install_if_not_installed mongodb
	osinstall_install_if_not_installed rabbitmq-server
	osinstall_install_if_not_installed ntp
	osinstall_install_if_not_installed python-argparse
	osinstall_install_if_not_installed openstack-cloud-services
}

osinstall_rabbit_host_and_pass () {
	osinstall_rcvalue RC_RABIT_HOST "Rabbit-MQ host [127.0.0.1]: " no 127.0.0.1
	osinstall_rcvalue RC_RABIT_USER "Rabbit-MQ user [guest]: " no guest
	osinstall_rcvalue RC_RABIT_PASS "Rabbit-MQ password [generated-password]: " yes
	if [ "${RC_RABIT_HOST}" = 127.0.0.1 ] && [ -x /usr/sbin/rabbitmqctl ] ; then
		rabbitmqctl change_password guest ${RC_RABIT_PASS}
	fi
}

osinstall_rcvalue_keystone_endpoint () {
	DEFROUTE_IF=`LC_ALL=C /sbin/route | grep default |awk -- '{ print $8 }' | cut -d" " -f1`
	if [ -n "${DEFROUTE_IF}" ] ; then
		DEFROUTE_IP=`LC_ALL=C ip addr show "${DEFROUTE_IF}" | grep inet | head -n 1 | awk '{print $2}' | cut -d/ -f1 | grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'`
	fi
	osinstall_rcvalue RC_KEYSTONE_ENDPOINT_IP "Keystone endpoint IP address [${DEFROUTE_IP}]: " no ${DEFROUTE_IP}
	osinstall_rcvalue RC_KEYSTONE_REGION "Keystone endpoint region [regionOne]: " no regionOne
}

osinstall_keystone () {
	if [ -z "${RC_KEYSTONE_ENDPOINT_IP}" ] ; then
		osinstall_rcvalue_keystone_endpoint
	fi
	osinstall_rcvalue RC_KEYSTONE_AUTHTOKEN "Keystone authtoken [generated-password]: " yes
	osinstall_rcvalue RC_KEYSTONE_ADMINPASS "Keystone admin tenant password [generated-password]: " yes
	osinstall_rcvalue RC_KEYSTONE_SQL_PASS "Keystone MySQL password [generated-password]: " yes
	os_install_keystone ${RC_KEYSTONE_AUTHTOKEN} ${RC_KEYSTONE_ADMINPASS} ${RC_KEYSTONE_ENDPOINT_IP} ${RC_KEYSTONE_REGION} \
		${RC_KEYSTONE_SQL_PASS} ${RC_MYSQL_PASSWORD} ${RC_MYSQL_SERVER_HOSTNAME}
}

osinstall_preseed_all () {
	osinstall_rcvalue RC_GLANCE_SQL_PASS "Glance MySQL password [generated-password]: " yes
	os_preseed_glance ${RC_GLANCE_SQL_PASS} ${RC_MYSQL_PASSWORD} ${RC_MYSQL_SERVER_HOSTNAME} \
		${RC_KEYSTONE_ENDPOINT_IP} ${RC_KEYSTONE_REGION} ${RC_KEYSTONE_ADMINPASS} ${RC_KEYSTONE_AUTHTOKEN} \
		${RC_RABIT_HOST} ${RC_RABIT_USER} ${RC_RABIT_PASS}
	osinstall_rcvalue RC_NEUTRON_SQL_PASS "Neutron MySQL password [generated-password]: " yes
	os_preseed_neutron ${RC_NEUTRON_SQL_PASS} ${RC_MYSQL_PASSWORD} ${RC_MYSQL_SERVER_HOSTNAME} \
		${RC_KEYSTONE_ENDPOINT_IP} ${RC_KEYSTONE_REGION} ${RC_KEYSTONE_ADMINPASS} ${RC_KEYSTONE_AUTHTOKEN} \
		${RC_RABIT_HOST} ${RC_RABIT_USER} ${RC_RABIT_PASS}
	osinstall_rcvalue RC_NOVA_SQL_PASS "Nova MySQL password [generated-password]: " yes
	os_preseed_nova ${RC_NOVA_SQL_PASS} ${RC_MYSQL_PASSWORD} ${RC_MYSQL_SERVER_HOSTNAME} \
		${RC_KEYSTONE_ENDPOINT_IP} ${RC_KEYSTONE_REGION} ${RC_KEYSTONE_ADMINPASS} ${RC_KEYSTONE_AUTHTOKEN} \
		${RC_RABIT_HOST} ${RC_RABIT_USER} ${RC_RABIT_PASS}
	osinstall_rcvalue RC_CINDER_SQL_PASS "Cinder MySQL password [generated-password]: " yes
	os_preseed_cinder ${RC_CINDER_SQL_PASS} ${RC_MYSQL_PASSWORD} ${RC_MYSQL_SERVER_HOSTNAME} \
		${RC_KEYSTONE_ENDPOINT_IP} ${RC_KEYSTONE_REGION} ${RC_KEYSTONE_ADMINPASS} ${RC_KEYSTONE_AUTHTOKEN} \
		${RC_RABIT_HOST} ${RC_RABIT_USER} ${RC_RABIT_PASS}
	os_preseed_ceilometer ${RC_KEYSTONE_ENDPOINT_IP} ${RC_KEYSTONE_REGION} ${RC_KEYSTONE_ADMINPASS} ${RC_KEYSTONE_AUTHTOKEN} \
		${RC_RABIT_HOST} ${RC_RABIT_USER} ${RC_RABIT_PASS}
	osinstall_rcvalue RC_HEAT_SQL_PASS "Heat MySQL password [generated-password]: " yes
	os_preseed_heat ${RC_HEAT_SQL_PASS} ${RC_MYSQL_PASSWORD} ${RC_MYSQL_SERVER_HOSTNAME} \
		${RC_KEYSTONE_ENDPOINT_IP} ${RC_KEYSTONE_REGION} ${RC_KEYSTONE_ADMINPASS} ${RC_KEYSTONE_AUTHTOKEN} \
		${RC_RABIT_HOST} ${RC_RABIT_USER} ${RC_RABIT_PASS}
	os_pressed_horizon
}

osinstall_preseed_compute () {
	osinstall_rcvalue RC_NOVA_SQL_PASS "Nova MySQL password [generated-password]: " yes
	os_preseed_nova ${RC_NOVA_SQL_PASS} ${RC_MYSQL_PASSWORD} ${RC_MYSQL_SERVER_HOSTNAME} \
		${RC_KEYSTONE_ENDPOINT_IP} ${RC_KEYSTONE_REGION} ${RC_KEYSTONE_ADMINPASS} ${RC_KEYSTONE_AUTHTOKEN} \
		${RC_RABIT_HOST} ${RC_RABIT_USER} ${RC_RABIT_PASS}
	os_preseed_ceilometer ${RC_KEYSTONE_ENDPOINT_IP} ${RC_KEYSTONE_REGION} ${RC_KEYSTONE_ADMINPASS} ${RC_KEYSTONE_AUTHTOKEN} \
		${RC_RABIT_HOST} ${RC_RABIT_USER} ${RC_RABIT_PASS}
	osinstall_rcvalue RC_NEUTRON_SQL_PASS "Neutron MySQL password [generated-password]: " yes
	os_preseed_neutron ${RC_NEUTRON_SQL_PASS} ${RC_MYSQL_PASSWORD} ${RC_MYSQL_SERVER_HOSTNAME} \
		${RC_KEYSTONE_ENDPOINT_IP} ${RC_KEYSTONE_REGION} ${RC_KEYSTONE_ADMINPASS} ${RC_KEYSTONE_AUTHTOKEN} \
		${RC_RABIT_HOST} ${RC_RABIT_USER} ${RC_RABIT_PASS}
}

if [ "${1}" = "--non-interactive" ] ; then
	OS_INTERACTIVE="no"
	shift
else
	OS_INTERACTIVE="yes"
fi

case "${1}" in
"controller")
	os_pressed_misc
	osinstall_mysql_set_localhost
	osinstall_install_services
	osinstall_rabbit_host_and_pass
	osinstall_keystone
	osinstall_preseed_all
	DEBIAN_FRONTEND=noninteractive ${APTGET} install openstack-proxy-node
;;
"compute")
	os_pressed_misc
	osinstall_mysql_set_host
	osinstall_install_if_not_installed ntp
	osinstall_install_if_not_installed python-argparse
	osinstall_rcvalue_keystone_endpoint
	DEBIAN_FRONTEND=noninteractive ${APTGET} install openstack-compute-node
;;
"all-in-one")
	os_pressed_misc
	osinstall_mysql_set_localhost
	osinstall_install_if_not_installed ntp
	osinstall_install_if_not_installed python-argparse
	osinstall_install_services
	osinstall_rabbit_host_and_pass
	osinstall_keystone
	osinstall_preseed_all
	DEBIAN_FRONTEND=noninteractive ${APTGET} install openstack-toaster
;;
*)
	usage
;;
esac
