Russell Bryant d6405ca
#!/bin/bash
Russell Bryant d6405ca
#
Russell Bryant d6405ca
# Copyright (C) 2011 - 2012, Red Hat, Inc.
Russell Bryant d6405ca
# Russell Bryant <rbryant@redhat.com>
Russell Bryant 97bbaa0
# Alan Pevec <apevec@redhat.com>
Russell Bryant d6405ca
#
Russell Bryant d6405ca
# Licensed under the Apache License, Version 2.0 (the "License"); you may
Russell Bryant d6405ca
# not use this file except in compliance with the License. You may obtain
Russell Bryant d6405ca
# a copy of the License at
Russell Bryant d6405ca
#
Russell Bryant d6405ca
#      http://www.apache.org/licenses/LICENSE-2.0
Russell Bryant d6405ca
#
Russell Bryant d6405ca
# Unless required by applicable law or agreed to in writing, software
Russell Bryant d6405ca
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
Russell Bryant d6405ca
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
Russell Bryant d6405ca
# License for the specific language governing permissions and limitations
Russell Bryant d6405ca
# under the License.
Russell Bryant d6405ca
#
Russell Bryant d6405ca
Russell Bryant d6405ca
#
Russell Bryant d6405ca
# Print --help output and exit.
Russell Bryant d6405ca
#
Russell Bryant 97bbaa0
8ed251e
systemctl --version >/dev/null 2>&1 && systemctl=1
8ed251e
Russell Bryant 97bbaa0
# TODO put it in common place for all openstack service
Russell Bryant 97bbaa0
#      (nova, glance and keystone) to use
Russell Bryant 97bbaa0
APP=glance
Russell Bryant 97bbaa0
Russell Bryant d6405ca
usage() {
Russell Bryant d6405ca
Russell Bryant d6405ca
cat << EOF
Russell Bryant 97bbaa0
Set up a local MySQL database for use with openstack-$APP.
Russell Bryant 97bbaa0
This script will create a '$APP' database that is accessible
Russell Bryant 97bbaa0
only on localhost by user '$APP' with password '$APP'.
Russell Bryant d6405ca
The setup of MySQL with a multi-server OpenStack installation
Russell Bryant d6405ca
is outside of the scope of this simple helper script.
Russell Bryant d6405ca
Russell Bryant 97bbaa0
Usage: openstack-$APP-db-setup [options]
Russell Bryant d6405ca
Options:
Russell Bryant d6405ca
	--help        | -h
Russell Bryant d6405ca
		Print usage information.
Russell Bryant 97bbaa0
	--password <pw> | -p <pw>
Russell Bryant 97bbaa0
		Specify the password for the '$APP' MySQL user that $APP will
Russell Bryant 97bbaa0
		use to connect to the '$APP' MySQL database.  By default,
Russell Bryant 97bbaa0
		the password '$APP' will be used.
Russell Bryant d6405ca
	--rootpw <pw> | -r <pw>
Russell Bryant d6405ca
		Specify the root MySQL password.  If the script installs
Russell Bryant d6405ca
		the MySQL server, it will set the root password to this value
Russell Bryant d6405ca
		instead of prompting for a password.  If the MySQL server is
Russell Bryant d6405ca
		already installed, this password will be used to connect to the
Russell Bryant d6405ca
		database instead of having to prompt for it.
Russell Bryant d6405ca
	--yes         | -y
Russell Bryant d6405ca
		In cases where the script would normally ask for confirmation
Russell Bryant d6405ca
		before doing something, such as installing mysql-server,
Russell Bryant d6405ca
		just assume yes.  This is useful if you want to run the script
Russell Bryant d6405ca
		non-interactively.
Russell Bryant d6405ca
EOF
Russell Bryant d6405ca
Russell Bryant d6405ca
	exit 0
Russell Bryant d6405ca
}
Russell Bryant d6405ca
Russell Bryant d6405ca
install_mysql_server() {
Russell Bryant d6405ca
	if [ -z "${ASSUME_YES}" ] ; then
Russell Bryant d6405ca
		yum install mysql-server
Russell Bryant d6405ca
	else
Russell Bryant d6405ca
		yum install -y mysql-server
Russell Bryant d6405ca
	fi
Russell Bryant d6405ca
}
Russell Bryant d6405ca
8ed251e
start_service() {
8ed251e
    if test "$systemctl"; then
8ed251e
        systemctl start $1.service
8ed251e
    else
8ed251e
        service $1 start
8ed251e
    fi
8ed251e
}
8ed251e
8ed251e
service_running() {
8ed251e
    if test "$systemctl"; then
8ed251e
        systemctl status $1.service >/dev/null
8ed251e
    else
8ed251e
        service $1 status >/dev/null
8ed251e
    fi
Russell Bryant d6405ca
}
Russell Bryant d6405ca
Russell Bryant 97bbaa0
MYSQL_APP_PW_DEFAULT="$APP"
Russell Bryant 97bbaa0
MYSQL_APP_PW=${MYSQL_APP_PW_DEFAULT}
Russell Bryant 97bbaa0
if [ "${APP}" = "glance" ]; then
Russell Bryant 97bbaa0
	APP_CONFIG="/etc/glance/glance-registry.conf"
Russell Bryant 97bbaa0
else
Russell Bryant 97bbaa0
	APP_CONFIG="/etc/$APP/$APP.conf"
Russell Bryant 97bbaa0
fi
Russell Bryant d6405ca
ASSUME_YES=""
Russell Bryant d6405ca
Russell Bryant d6405ca
while [ $# -gt 0 ]
Russell Bryant d6405ca
do
Russell Bryant d6405ca
	case "$1" in
Russell Bryant d6405ca
		-h|--help)
Russell Bryant d6405ca
			usage
Russell Bryant d6405ca
			;;
Russell Bryant 97bbaa0
		-p|--password)
Russell Bryant d6405ca
			shift
Russell Bryant 97bbaa0
			MYSQL_APP_PW=${1}
Russell Bryant d6405ca
			;;
Russell Bryant d6405ca
		-r|--rootpw)
Russell Bryant d6405ca
			shift
Russell Bryant d6405ca
			MYSQL_ROOT_PW=${1}
Russell Bryant d6405ca
			;;
Russell Bryant d6405ca
		-y|--yes)
Russell Bryant d6405ca
			ASSUME_YES="yes"
Russell Bryant d6405ca
			;;
Russell Bryant d6405ca
		*)
Russell Bryant d6405ca
			# ignore
Russell Bryant d6405ca
			shift
Russell Bryant d6405ca
			;;
Russell Bryant d6405ca
	esac
Russell Bryant d6405ca
	shift
Russell Bryant d6405ca
done
Russell Bryant d6405ca
Russell Bryant d6405ca
Russell Bryant d6405ca
# Make sure MySQL is installed.
Russell Bryant d6405ca
Russell Bryant d6405ca
NEW_MYSQL_INSTALL=0
Russell Bryant d6405ca
if ! rpm -q mysql-server > /dev/null
Russell Bryant d6405ca
then
Russell Bryant d6405ca
	if [ -z "${ASSUME_YES}" ] ; then
Russell Bryant d6405ca
		printf "mysql-server is not installed.  Would you like to install it now? (y/n): "
Russell Bryant d6405ca
		read response
Russell Bryant d6405ca
		case "$response" in
Russell Bryant d6405ca
			y|Y)
Russell Bryant d6405ca
				;;
Russell Bryant d6405ca
			n|N)
Russell Bryant d6405ca
				echo "mysql-server must be installed.  Please install it before proceeding."
Russell Bryant d6405ca
				exit 0
Russell Bryant d6405ca
				;;
Russell Bryant d6405ca
			*)
Russell Bryant d6405ca
				echo "Invalid response."
Russell Bryant d6405ca
				exit 1
Russell Bryant d6405ca
		esac
Russell Bryant d6405ca
	fi
Russell Bryant d6405ca
Russell Bryant d6405ca
	NEW_MYSQL_INSTALL=1
Russell Bryant d6405ca
	install_mysql_server
Russell Bryant d6405ca
fi
Russell Bryant d6405ca
Russell Bryant d6405ca
Russell Bryant d6405ca
# Make sure mysqld is running.
Russell Bryant d6405ca
8ed251e
if ! service_running mysqld; then
Russell Bryant d6405ca
	if [ -z "${ASSUME_YES}" ] ; then
Russell Bryant d6405ca
		printf "mysqld is not running.  Would you like to start it now? (y/n): "
Russell Bryant d6405ca
		read response
Russell Bryant d6405ca
		case "$response" in
Russell Bryant d6405ca
			y|Y)
Russell Bryant d6405ca
				;;
Russell Bryant d6405ca
			n|N)
Russell Bryant d6405ca
				echo "mysqld must be running.  Please start it before proceeding."
Russell Bryant d6405ca
				exit 0
Russell Bryant d6405ca
				;;
Russell Bryant d6405ca
			*)
Russell Bryant d6405ca
				echo "Invalid response."
Russell Bryant d6405ca
				exit 1
Russell Bryant d6405ca
		esac
Russell Bryant d6405ca
	fi
Russell Bryant d6405ca
Derek Higgins aba31b1
	start_service 'mysqld'
Russell Bryant d6405ca
Russell Bryant d6405ca
	# If we both installed and started, ensure it starts at boot
Russell Bryant d6405ca
	[ $NEW_MYSQL_INSTALL -eq 1 ] && chkconfig mysqld on
Russell Bryant d6405ca
fi
Russell Bryant d6405ca
Russell Bryant d6405ca
Russell Bryant d6405ca
# Get MySQL root access.
Russell Bryant d6405ca
Russell Bryant d6405ca
if [ $NEW_MYSQL_INSTALL -eq 1 ]
Russell Bryant d6405ca
then
Russell Bryant d6405ca
	if [ ! "${MYSQL_ROOT_PW+defined}" ] ; then
Russell Bryant d6405ca
		echo "Since this is a fresh installation of MySQL, please set a password for the 'root' mysql user."
Russell Bryant d6405ca
Russell Bryant d6405ca
		PW_MATCH=0
Russell Bryant d6405ca
		while [ $PW_MATCH -eq 0 ]
Russell Bryant d6405ca
		do
Russell Bryant d6405ca
			printf "Enter new password for 'root' mysql user: "
Russell Bryant d6405ca
			read -s MYSQL_ROOT_PW
Russell Bryant d6405ca
			echo
Russell Bryant d6405ca
			printf "Enter new password again: "
Russell Bryant d6405ca
			read -s PW2
Russell Bryant d6405ca
			echo
Russell Bryant d6405ca
			if [ "${MYSQL_ROOT_PW}" = "${PW2}" ] ; then
Russell Bryant d6405ca
				PW_MATCH=1
Russell Bryant d6405ca
			else
Russell Bryant d6405ca
				echo "Passwords did not match."
Russell Bryant d6405ca
			fi
Russell Bryant d6405ca
		done
Russell Bryant d6405ca
	fi
Russell Bryant d6405ca
Russell Bryant d6405ca
	echo "UPDATE mysql.user SET password = password('${MYSQL_ROOT_PW}') WHERE user = 'root'; DELETE FROM mysql.user WHERE user = ''; flush privileges;" | mysql -u root
Russell Bryant d6405ca
	if ! [ $? -eq 0 ] ; then
Russell Bryant d6405ca
		echo "Failed to set password for 'root' MySQL user."
Russell Bryant d6405ca
		exit 1
Russell Bryant d6405ca
	fi
Russell Bryant d6405ca
elif [ ! "${MYSQL_ROOT_PW+defined}" ] ; then
Russell Bryant d6405ca
	printf "Please enter the password for the 'root' MySQL user: "
Russell Bryant d6405ca
	read -s MYSQL_ROOT_PW
Russell Bryant d6405ca
	echo
Russell Bryant d6405ca
fi
Russell Bryant d6405ca
Russell Bryant d6405ca
Russell Bryant d6405ca
# Sanity check MySQL credentials.
Russell Bryant d6405ca
Russell Bryant d6405ca
MYSQL_ROOT_PW_ARG=""
Russell Bryant d6405ca
if [ "${MYSQL_ROOT_PW+defined}" ]
Russell Bryant d6405ca
then
Russell Bryant d6405ca
	MYSQL_ROOT_PW_ARG="--password=${MYSQL_ROOT_PW}"
Russell Bryant d6405ca
fi
Russell Bryant d6405ca
echo "SELECT 1;" | mysql -u root ${MYSQL_ROOT_PW_ARG} > /dev/null
Russell Bryant d6405ca
if ! [ $? -eq 0 ]
Russell Bryant d6405ca
then
Russell Bryant d6405ca
	echo "Failed to connect to the MySQL server.  Please check your root user credentials."
Russell Bryant d6405ca
	exit 1
Russell Bryant d6405ca
fi
Russell Bryant d6405ca
echo "Verified connectivity to MySQL."
Russell Bryant d6405ca
Russell Bryant d6405ca
Russell Bryant d6405ca
# Now create the db.
Russell Bryant d6405ca
Russell Bryant 97bbaa0
echo "Creating '$APP' database."
Russell Bryant d6405ca
cat << EOF | mysql -u root ${MYSQL_ROOT_PW_ARG}
Russell Bryant 97bbaa0
CREATE DATABASE $APP;
Russell Bryant 97bbaa0
CREATE USER '$APP'@'localhost' IDENTIFIED BY '${MYSQL_APP_PW}';
Russell Bryant 97bbaa0
CREATE USER '$APP'@'%' IDENTIFIED BY '${MYSQL_APP_PW}';
Russell Bryant 97bbaa0
GRANT ALL ON $APP.* TO '$APP'@'localhost';
Russell Bryant 97bbaa0
GRANT ALL ON $APP.* TO '$APP'@'%';
Russell Bryant d6405ca
flush privileges;
Russell Bryant d6405ca
EOF
Russell Bryant d6405ca
Russell Bryant d6405ca
Russell Bryant 97bbaa0
# Make sure $APP configuration has the right MySQL password.
Russell Bryant d6405ca
Russell Bryant 97bbaa0
if [ "${MYSQL_APP_PW}" != "${MYSQL_APP_PW_DEFAULT}" ] ; then
Russell Bryant 97bbaa0
	echo "Updating '$APP' database password in ${APP_CONFIG}"
Russell Bryant 97bbaa0
	sed -i -e "s/mysql:\/\/$APP:\(.*\)@/mysql:\/\/$APP:${MYSQL_APP_PW}@/" ${APP_CONFIG}
Russell Bryant d6405ca
fi
Russell Bryant d6405ca
Russell Bryant d6405ca
Russell Bryant 97bbaa0
# Ask openstack-$APP to sync the db.
Russell Bryant d6405ca
Russell Bryant 97bbaa0
echo "Asking openstack-$APP to sync the database."
3b8b88c
[ "${APP}" = "nova" ] && db_sync='db sync' || db_sync='db_sync'
3b8b88c
# Run as $APP user so any newly created (log) files have correct ownership
3b8b88c
runuser -s /bin/sh $APP -c "$APP-manage $db_sync"
3b8b88c
Russell Bryant d6405ca
Russell Bryant d6405ca
# Do a final sanity check on the database.
Russell Bryant d6405ca
Russell Bryant 97bbaa0
echo "SELECT * FROM migrate_version;" | mysql -u $APP --password=${MYSQL_APP_PW} $APP > /dev/null
Russell Bryant d6405ca
if ! [ $? -eq 0 ]
Russell Bryant d6405ca
then
Russell Bryant 97bbaa0
	echo "Final sanity check failed.  File a bug report on bugzilla.redhat.com against the openstack-$APP package."
Russell Bryant d6405ca
	exit 1
Russell Bryant d6405ca
fi
Russell Bryant d6405ca
Russell Bryant d6405ca
echo "Complete!"