#!/bin/bash
################################################################################
# Filename: ./src/base/sbin/admin/init-system
# 
# The contents of this file are subject to the Qlusters Public License
# Version 1.1 (the License); you may not use this file except in compliance
# with the License.
# You may obtain a copy of the License at
# http://www.openqrm.org/content/view/33/69/.
# 
# Software distributed under the License is distributed on an AS IS basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
# the specific language governing rights and limitations under the License.
# 
# The Original Code is openQRM.
# 
# The Initial Developer of the Original Code is Qlusters Corporation. Portions
# created by Qlusters Corporation are Copyright (C) 2003-2005. All Rights
# Reserved.
# 
# Contributor(s):
# 
# Description:
# 
# Comments:
################################################################################

BASE_DIR=`dirname $0`
export QRM_SERVER_BASE_DIR=${QRM_SERVER_BASE_DIR:-`pushd $BASE_DIR/../../.. > /dev/null; echo $PWD; popd > /dev/null`}
. $QRM_SERVER_BASE_DIR/qrm/include/qrm-functions
. $QRM_SERVER_BASE_DIR/qrm/include/qrm-server-functions
. $QRM_SERVER_BASE_DIR/qrm/include/qrm-setup-functions
qrm_get_server_config 1>/dev/null

# get the network config
QRM_SERVER_IP_ADDRESS=`ip addr show | grep inet | grep -w "$QRM_SERVER_INTERFACE$" | cut -d'/' -f 1 | awk '{ print $2 }'`
if ! qrm_validate_ipaddress $QRM_SERVER_IP_ADDRESS 1>/dev/null 2>&1; then
	echo "ERROR: Could not find the ip-configuration for $QRM_SERVER_INTERFACE"
	echo "       Please check that this network-interface is configured and activated"
	exit 1
fi


function initialize_db() {
	echo "Initializing the Qrm-database"

   	DATABASE_INIT_SQL="drop.sql create.sql init.sql"

	for SQL in $DATABASE_INIT_SQL; do
        	if ! push_sql $QRM_DATABASE_SERVER $QRM_DATABASE_USER $SQL $QRM_DATABASE_PASSWORD; then
                	echo "ERROR: Could not initialize the database with $SQL!"
	                return 1
        	fi
	
	done
}

# function to run a given sql script on the db
function push_sql() {
        DATABASE_SERVER=$1
        DATABASE_USER=$2
        DATABASE_MYSQL_SQL=$3
        DATABASE_PASSWORD=$4
        DATABASE_MYSQL_SQL_PATH="$QRM_SERVER_BASE_DIR/qrm/include/db/mysql/$DATABASE_MYSQL_SQL"
        QRM_DATABASE_SOCK=${QRM_DATABASE_SOCK:-/var/lib/mysql/mysql.sock}

        if which mysql 1>/dev/null 2>&1; then
                MYSQL_CLIENT=`which mysql`
        else if [ ! -z "$MYSQL_HOME" ]; then
                MYSQL_CLIENT=$MYSQL_HOME/bin/mysql
        else if [ ! -z "$QRM_DATABASE_HOME" ]; then
                MYSQL_CLIENT=$QRM_DATABASE_HOME/bin/mysql
        else
                echo "ERROR: Mysql client 'mysql' not installed/found on this system"
                return 1
        fi fi fi

        if [ ! -x $MYSQL_CLIENT ]; then
                echo "ERROR: Cannot run $MYSQL_CLIENT"
                return 1
        fi

        # start local mysql if needed
        if [ "$DATABASE_SERVER" == "localhost" ] || [ "$DATABASE_SERVER" == "127.0.0.1" ]; then
                if ! ps -C mysqld 1>/dev/null; then
                        echo "Local mysqld database not running. Trying to start mysqld"
                        if [ -x /etc/init.d/mysqld ]; then
                                /etc/init.d/mysqld start
                        elif [ -x /etc/init.d/mysql ]; then
                                /etc/init.d/mysql start
                        elif [ -x /etc/rc.d/init.d/mysqld ]; then
                                /etc/rc.d/init.d/mysqld start
                        else
                                echo "ERROR: Could not start the local mysqld database"
                                return 1
                        fi
                        sleep 4
                fi
        fi
#       setup mysql.lock dir
        QRM_TMP_DIR=${QRM_TMP_DIR:-/tmp}
        if [ -z "$DATABASE_PASSWORD" ]; then
                interpolate $DATABASE_MYSQL_SQL_PATH | $MYSQL_CLIENT -u $DATABASE_USER --host $DATABASE_SERVER -S $QRM_DATABASE_SOCK
                return $?
        else
                interpolate $DATABASE_MYSQL_SQL_PATH | $MYSQL_CLIENT -u $DATABASE_USER -p$DATABASE_PASSWORD --host $DATABASE_SERVER -S $QRM_DATABASE_SOCK
                return $?
        fi
}



function create_default_pxe_configuration() {
	# default pxe configuration
	if [ ! -d $QRM_SERVER_BASE_DIR/qrm/tftpboot/pxelinux.cfg/ ] ; then
		mkdir -p $QRM_SERVER_BASE_DIR/qrm/tftpboot/pxelinux.cfg/
	else
		rm -f $QRM_SERVER_BASE_DIR/qrm/tftpboot/pxelinux.cfg/*
	fi
	echo "Creating the default pxe-configuration"
cat > $QRM_SERVER_BASE_DIR/qrm/tftpboot/pxelinux.cfg/default << EOF
default linux

label linux
kernel boot/vmlinuz-qrm
append ramdisk_size=32768 apm=off devfs=nomount initrd=boot/initrd-qrm.img nodeid=0 qrm=$QRM_SERVER_IP_ADDRESS
ipappend 3
EOF

cat > $QRM_SERVER_BASE_DIR/qrm/tftpboot/pxelinux.cfg/localboot << EOF
label local
LOCALBOOT 0
EOF

chmod 777 $QRM_SERVER_BASE_DIR/qrm/tftpboot/pxelinux.cfg/default $QRM_SERVER_BASE_DIR/qrm/tftpboot/pxelinux.cfg/localboot

}


function create_default_boot_image() {
	# creating the qrm boot-image
	echo "Creating the default Qrm boot-image"
	QRM_SERVER_KERNEL_VERSION=`uname -r`
	if [ ! -z "$QRM_DEFAULT_KERNEL_RPM" ]; then
	
		# url
		if echo $QRM_DEFAULT_KERNEL_RPM | grep "^http://" 1>/dev/null || echo $QRM_DEFAULT_KERNEL_RPM | grep "^https://" 1>/dev/null || echo $QRM_DEFAULT_KERNEL_RPM | grep "^ftp://" 1>/dev/null; then
			QRM_DEFAULT_KERNEL_RPM_URL=$QRM_DEFAULT_KERNEL_RPM
			QRM_DEFAULT_KERNEL_RPM=`basename $QRM_DEFAULT_KERNEL_RPM_URL`	
			QRM_DEFAULT_KERNEL_RPM=`qrm_cache URL $QRM_DEFAULT_KERNEL_RPM $QRM_DEFAULT_KERNEL_RPM_URL`
			if [ "$QRM_DEFAULT_KERNEL_RPM" == "UNSUCCESSFULL" ]; then
				echo "ERROR: Could not download $QRM_DEFAULT_KERNEL_RPM_URL"
				return 1
			fi
		fi
		# rpm
		if [ ! -d "$QRM_DEFAULT_KERNEL_RPM" ] && [ -f "$QRM_DEFAULT_KERNEL_RPM" ] && file "$QRM_DEFAULT_KERNEL_RPM" | grep RPM 1>/dev/null; then
			QRM_DEFAULT_KERNEL_TMP=`mktemp -q -d $QRM_TEMP/XXXXXX`
			cd $QRM_DEFAULT_KERNEL_TMP
			if ! rpm2cpio $QRM_DEFAULT_KERNEL_RPM | cpio --extract --make-directories --no-absolute-filenames --preserve-modification-time 1>/dev/null 2>&1; then
				cd -
				echo "Error during unpacking the RPM package"
				return 1
			fi
			cd -
			QRM_SPECIAL_KERNEL_OPTION="-l $QRM_DEFAULT_KERNEL_TMP/"
			QRM_SERVER_KERNEL_VERSION=`ls $QRM_DEFAULT_KERNEL_TMP/lib/modules`
			if [ -z $QRM_SERVER_KERNEL_VERSION ]; then
				echo "Could not get the kernel version from kernel-rpm package $QRM_DEFAULT_KERNEL_RPM"
				return 1
			fi
		# dir
		elif [ -d "$QRM_DEFAULT_KERNEL_RPM" ]; then
			QRM_SPECIAL_KERNEL_OPTION="-l $QRM_DEFAULT_KERNEL_RPM/"
			QRM_SERVER_KERNEL_VERSION=`ls $QRM_DEFAULT_KERNEL_RPM/lib/modules`
			if [ -z $QRM_SERVER_KERNEL_VERSION ]; then
				echo "Could not get the kernel version from kernel at directory $QRM_DEFAULT_KERNEL_RPM"
				return 1
			fi
		fi
	# local
	else
		QRM_SERVER_KERNEL_VERSION=`uname -r`
	fi
	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-boot-image create -k $QRM_SERVER_KERNEL_VERSION -b qrm -y qrm $QRM_SPECIAL_KERNEL_OPTION
	RET=$?
	/bin/rm -rf $QRM_DEFAULT_KERNEL_TMP
	return $RET
}



function configure_boot_services() {
	# boot-services
	echo "Configuring the qrm boot-services"

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t node -k qrm-initrd
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t node -k qrm-start
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t node -k qrm-stop
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t node -k qrm-check
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t ve -k qrm-initrd
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t ve -k qrm-start
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t ve -k qrm-stop
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t ve -k qrm-check
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t vm -k qrm-initrd
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t vm -k qrm-start
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t vm -k qrm-stop
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t vm -k qrm-check
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	# qrm-emergency-console
	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t node -k qrm-emergency-console
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t ve -k qrm-emergency-console
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	$QRM_SERVER_BASE_DIR/qrm/bin/qrm-cli boot associate -t vm -k qrm-emergency-console
	RET=$?
	case "$RET" in
		0)
			;;
		7)
			echo "Boot-service already exists in the QRM-server database"
			echo "Continuing"
			;;
		*)
			return $RET
	esac

	return $RET
}



function install_plugins() {
	echo "Setting up Qrm-plugins now"
	for PLUGIN in $INSTALL_PLUGINS; do
		if ! qrm_plugin $PLUGIN install; then
			echo "ERROR: Qrm $PLUGIN plugin installation did not finish correctly"
		fi
	done
}



# main

echo "Do you want to initialize the system entities ?"
echo "Press <ENTER> to confirm"
echo "('s' for skipping)"
read SYSTEM_INIT_CONFIRM
if [ "$SYSTEM_INIT_CONFIRM" != "s" ] && [ "$SYSTEM_INIT_CONFIRM" != "S" ]; then
	initialize_db || exit
	create_default_pxe_configuration || exit
fi

install_plugins || echo "Cannot install plugins. Please reinstall manually" 

# start qrm-server
/etc/init.d/qrm-server stop 1>/dev/null 2>&1
if ! /etc/init.d/qrm-server start; then
	echo "ERROR: Could not start the Qrm-server correctly. Please check the config"
	exit 1
fi

create_default_boot_image
RET=$?
case "$RET" in
	0)
		;;
	7)
		echo "Continuing"
		;;
	*)
		echo "Exiting"
		exit $RET
esac

configure_boot_services
RET=$?
case "$RET" in
	0)
		;;
	7)
		echo "Continuing"
		;;
	*)
		echo "Exiting"
		exit $RET
esac



