#!/bin/bash

# Copyright (C) 2012 NTT DATA Corporation
# 
# This program is free software; you can redistribute it and/or
# Modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation, version 2.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details

# bash configuration
SCRIPT_DIR=$(cd $(dirname $0);pwd)
. ${SCRIPT_DIR}/install.cfg || exit 255

export PROG=`basename $0`
DIR=`dirname $0`
USER=`/usr/bin/whoami`
HOST=`hostname`

########################################
#  Local Variable
########################################

LANGUAGE=$1

########################################
#  Local Message
########################################

# load language file
if [ ! -e ${SCRIPT_DIR}/lib/${LANGUAGE}_install.lng ]
then
	echo "not supported language : ${LANGUAGE}"
	exit 255
fi
. ${SCRIPT_DIR}/lib/${LANGUAGE}_install.lng

########################################
# Function
########################################

function EchoOK()
{
	echo " [OK]"
}

function EchoNG()
{
	echo " [NG]"
}

function Welcome()
{
	VERSION=`cat ${SCRIPT_DIR}/hinemos/_version`
	echo
	echo "-------------------------------------------------------"
	echo "   Welcome to the installation for Hinemos Manager"
	echo "                   Version ${VERSION}"
	echo
	echo "       Copyright (C) 2013 NTT DATA Corporation"
	echo "-------------------------------------------------------"
}

function ConfirmInstallation()
{
	echo
	while [ 1 ]
	do
		read -p "`echo_msg MSG_I001` : " INPUT
		INPUT=${INPUT:-Y}
		case ${INPUT} in
			y|Y)
				break
				;;
			n|N)
				echo_msg MSG_I003
				return 255
				;;
			*)
				echo_msg MSG_W001
				;;
		esac
	done
	return 0
}

function CheckEnvironment()
{
	# check user executed
	echo
	echo_msg_n MSG_I002
	if [ "x"${USER} != "xroot" ]
	then
		EchoNG
		echo_msg MSG_E002 && echo_msg MSG_E004
		return 255
	fi
	EchoOK
	
	# check selinux is Disabled
	echo
	echo_msg_n MSG_I031
	if [ -e /etc/selinux ] && [ "xDisabled" != "x`/usr/sbin/getenforce`" ]
	then
		EchoNG
		echo_msg MSG_E007 && echo_msg MSG_E004
		return 255
	fi
	EchoOK
	
	# check os version
	echo
	echo_msg_n MSG_I051
	if [ `uname -a | grep "x86_64" | wc -l` -ne ${OS_CHECK_64} ]
	then
		OS_RELEASE=" (`uname -a`) "
		EchoNG
		echo_msg MSG_E016 && echo_msg MSG_E004
		return 255
	fi
	EchoOK
	
	# check rpm
	echo
	echo_msg_n MSG_I056
	echo
	for RPM in ${RPMS_OSRELEASE[@]}
	do
		echo -n "   ${RPM}..."
		rpm -q ${RPM} > /dev/null 2>&1
		if [ $? -eq 0 ]
		then
			EchoOK
		else
			EchoNG
			echo_msg MSG_W012 && echo_msg MSG_E004
			return 255
		fi
	done
	
	# check rsyslog for Hinemos Agent
	echo
	echo_msg_n MSG_I061
	if [ `grep ":514$" ${RSYSLOG_CONF} | grep -v "^#" | wc -l` -ne 0 ]
	then
		EchoNG
		echo_msg MSG_E017 && echo_msg MSG_E004
		return 255
	fi
	EchoOK
	
	return 0
}

function CheckInstallDirectory()
{
	echo
	echo_msg MSG_I004
	if [ -d ${HINEMOS_HOME} ]
	then
		echo_msg MSG_W002
		ls -lA ${HINEMOS_HOME} | sed "s/^/   /"
		while [ 1 ]
		do
			read -p "`echo_msg MSG_I005` : " INPUT
			INPUT=${INPUT:-N}
			case ${INPUT} in
				y|Y)
					# force installation
					break
					;;
				n|N)
					echo_msg MSG_E004
					return 255
					;;
				*)
					echo_msg MSG_W001
					;;
			esac
		done
	else
		mkdir -p ${HINEMOS_HOME}
		if [ $? -ne 0 ]
		then
			echo_msg MSG_E006 && echo_msg MSG_E004
			return 255
		fi
		echo_msg MSG_I007
	fi
	return 0
}

function CreateUser()
{
	echo
	echo_msg MSG_I006
	id ${HINEMOS_OS_USER} > /dev/null 2>&1
	RET=$?
	if [ ${RET} -eq 0 ]
	then
		# if user exists
		echo_msg MSG_W003
		if [ `id -gn ${HINEMOS_OS_USER} | grep "^${HINEMOS_OS_GROUP}$" | wc -l` -eq 0 ]
		then
			# if user is not belong to group
			echo_msg MSG_E009 && echo_msg MSG_E004
			return 255
		fi
	else
		if [ `cut -d : -f 1 /etc/group | grep "^${HINEMOS_OS_GROUP}$" | wc -l` -eq 0 ]
		then
			/usr/sbin/groupadd ${HINEMOS_OS_GROUP}
			if [ $? -ne 0 ]
			then
				echo_msg MSG_E010 && echo_msg MSG_E004
				return 255
			fi
			echo_msg MSG_I033
		fi
		/usr/sbin/useradd ${HINEMOS_OS_USER} -g ${HINEMOS_OS_GROUP} -G ${HINEMOS_OS_GROUP}
		if [ $? -ne 0 ]
		then
			echo_msg MSG_E005 && echo_msg MSG_E004
			return 255
		fi
		/usr/bin/passwd ${HINEMOS_OS_USER}
		echo_msg MSG_I008
	fi
	
	chown -R ${HINEMOS_OS_USER}:${HINEMOS_OS_GROUP} ${HINEMOS_HOME}
	if [ $? -ne 0 ]
	then
		echo_msg MSG_E008 && return 255
	fi
	echo_msg MSG_I032
	
	return 0
}

function InputJava()
{
	echo
	while [ 1 ]
	do
		read -p "`echo_msg MSG_I052` : " JAVA_HOME
		JAVA_HOME=${JAVA_HOME:-${JAVA_HOME_DEFAULT}}
		
		# check java file existence
		if [ ! -e ${JAVA_HOME}/bin/java ]
		then
			read -p "`echo_msg MSG_W009` : " INPUT
			INPUT=${INPUT:-N}
			case ${INPUT} in
				y|Y)
					echo_msg MSG_I011
					continue
					;;
				n|N)
					JAVA_HOME=${JAVA_HOME:-${JAVA_HOME_DEFAULT}}
					echo_msg MSG_W014
					return 0
					;;
				*)
					echo_msg MSG_W013
					continue
					;;
			esac
		fi
		
		# check java version
		if [ `${JAVA_HOME}/bin/java -version 2>&1 | grep "${JAVA_CHECK_REGEX}" | wc -l` -eq 0 ]
		then
			echo_msg MSG_W010 && ${JAVA_HOME}/bin/java -version 2>&1 && echo_msg MSG_I011
			continue
		fi
		if [ `${JAVA_HOME}/bin/java -version 2>&1 | grep "${OPENJDK_CHECK_REGEX}" | wc -l` -eq 0 ]
		then
			echo_msg MSG_W010 && ${JAVA_HOME}/bin/java -version 2>&1 && echo_msg MSG_I011
			continue
		fi
		
		read -p "`echo_msg MSG_I053` : " INPUT
		INPUT=${INPUT:-Y}
		case ${INPUT} in
			y|Y)
				break
				;;
			n|N)
				echo_msg MSG_I011
				;;
			*)
				echo_msg MSG_W001
				;;
		esac
	done
	return 0
}

function InputWbemModule()
{
	echo
	read -p "`echo_msg MSG_I060` : " INPUT
	INPUT=${INPUT:-N}
	if [ ${INPUT} = "N" -o ${INPUT} = "n" ]
	then
		WBEM_JAR=${WBEM_JAR_DEFAULT}
		return 0
	fi
	
	while [ 1 ]
	do
		read -p "`echo_msg MSG_I054` : " WBEM_JAR
		WBEM_JAR=${WBEM_JAR:-${WBEM_JAR_DEFAULT}}``

		# check jar file existence
		if [ ! -e ${WBEM_JAR} ]
		then
			read -p "`echo_msg MSG_W011` : " INPUT
			INPUT=${INPUT:-N}
			case ${INPUT} in
				y|Y)
					echo_msg MSG_I011
					continue
					;;
				n|N)
					WBEM_JAR=${WBEM_JAR_DEFAULT}
					return 0
					;;
				*)
					echo_msg MSG_W013
					continue
					;;
			esac
		fi
		
		read -p "`echo_msg MSG_I055` : " INPUT
		INPUT=${INPUT:-Y}
		case ${INPUT} in
			y|Y)
				break
				;;
			n|N)
				echo_msg MSG_I011
				;;
			*)
				echo_msg MSG_W001
				;;
		esac
	done
	return 0
}

function InputFtpServer()
{
	echo
	while [ 1 ]
	do
		read -p "`echo_msg MSG_I013` : " FTP_HOST
		FTP_HOST=${FTP_HOST:-127.0.0.1}
		read -p "`echo_msg MSG_I050` : " INPUT
		INPUT=${INPUT:-Y}
		case ${INPUT} in
			y|Y)
				break
				;;
			n|N)
				echo_msg MSG_I011
				;;
			*)
				echo_msg MSG_W001
				;;
		esac
	done
	return 0
}

function InputMountPoint()
{
	echo
	echo_msg MSG_I039
	FILESYSTEMS=`df -P | grep "^/dev" | awk '{ print $1}'`
	for FILESYSTEM in ${FILESYSTEMS}
	do
		MOUNTPOINT=`df -P | grep "^${FILESYSTEM}" | awk '{print $6}'`
		if [ "x${FILESYSTEM}" != "x" ] && [ "x${MOUNTPOINT}" != "x" ]
		then
			echo "   ${FILESYSTEM} - ${MOUNTPOINT}"
		fi
	done
	
	MOUNTPOINT_DB="/"
	DIR=${PG_DATA}
	while [ "x${DIR}" != "x/" ] || [ "x${DIR}" != "x." ]
	do
		if [ `df -P | awk '{print $6}' | grep "^${DIR}$" | wc -l` -gt 0 ]
		then
			MOUNTPOINT_DB=${DIR}
			echo "`echo_msg MSG_I040`"
			break
		fi
		DIR=`dirname ${DIR}`
	done
	
	MOUNTPOINT_LOG="/"
	DIR=${HINEMOS_LOG_DIR}
	while [ "x${DIR}" != "x/" ] || [ "x${DIR}" != "x." ]
	do
		if [ `df -P | awk '{print $6}' | grep "^${DIR}$" | wc -l` -gt 0 ]
		then
			MOUNTPOINT_LOG=${DIR}
			echo "`echo_msg MSG_I041`"
			break
		fi
		DIR=`dirname ${DIR}`
	done
	
	return 0
}

function CopyFiles()
{
	echo
	echo_msg_n MSG_I012
	cp -pr ${SCRIPT_DIR}/hinemos /opt \
		&& cp -pr ${SCRIPT_DIR}/manager_uninstaller* ${HINEMOS_HOME}/sbin \
		&& cp -pr ${SCRIPT_DIR}/install.cfg ${HINEMOS_HOME}/sbin \
		&& cp -pr ${SCRIPT_DIR}/lib/*.lng ${HINEMOS_HOME}/sbin/lib \
		\
		&& ln -s ${HINEMOS_ETC_DIR}/hinemos.cfg ${HINEMOS_HOME}/hinemos.cfg \
		\
		&& ln -s ${WBEM_JAR} ${HINEMOS_HOME}/lib/sblimCIMClient.jar \
		\
		&& tar -xzf ${SCRIPT_DIR}/thirdparty/${PG_PACKAGE} \
		&& mv ${PG_EXTRACT_DIR} ${PG_HOME}
	if [ $? -ne 0 ]
	then
		EchoNG
		echo_msg MSG_E004
		return 255
	fi
	EchoOK
	return 0
}

function ConfigureFiles()
{
	echo
	echo_msg_n MSG_I014
	
	# configure hinemos.cfg
	sed -e "s|%%HINEMOS_HOME%%|${HINEMOS_HOME}|" \
		-e "s|%%HINEMOS_ETC_DIR%%|${HINEMOS_ETC_DIR}|" \
		-e "s|%%HINEMOS_LOG_DIR%%|${HINEMOS_LOG_DIR}|" \
		-e "s|%%JAVA_HOME%%|${JAVA_HOME}|" \
		-e "s|%%PG_HOME%%|${PG_HOME}|" \
		-e "s|%%PG_DATA%%|${PG_DATA}|" \
		-e "s|%%HINEMOS_OS_USER%%|${HINEMOS_OS_USER}|" \
		-e "s|%%LOCALE%%|${LOCALE}|" \
		${SCRIPT_DIR}/lib/hinemos.cfg > ${HINEMOS_ETC_DIR}/hinemos.cfg
	if [ $? -ne 0 ]
	then
		EchoNG
		echo_msg MSG_E004
		return 255
	fi
	
	# configure postgresql.conf
	sed -e "s|%%HINEMOS_LOG_DIR%%|${HINEMOS_LOG_DIR}|" ${SCRIPT_DIR}/hinemos/etc/postgresql/postgresql.conf > ${HINEMOS_ETC_DIR}/postgresql/postgresql.conf
	if [ $? -ne 0 ]
	then
		EchoNG
		echo_msg MSG_E004
		return 255
	fi
	
	# configure persistence.xml
	sed -e "s|%%HINEMOS_HOME%%|${HINEMOS_HOME}|" ${SCRIPT_DIR}/hinemos/etc/META-INF/persistence.xml > ${HINEMOS_ETC_DIR}/META-INF/persistence.xml
	if [ $? -ne 0 ]
	then
		EchoNG
		echo_msg MSG_E004
		return 255
	fi
	
	# configure shell script for collective run function
	HINEMOS_VERSION=`cat ${HINEMOS_HOME}/_version`
	sed -e "s|%%HINEMOS_VERSION%%|${HINEMOS_VERSION}|" ${SCRIPT_DIR}/hinemos/lib/cr/agent_install.sh > ${HINEMOS_HOME}/lib/cr/agent_install.sh	
	sed -e "s|%%FTP_HOST%%|${FTP_HOST}|" ${SCRIPT_DIR}/hinemos/lib/cr/cp.sh > ${HINEMOS_HOME}/lib/cr/cp.sh
	sed -e "s|%%FTP_HOST%%|${FTP_HOST}|" ${SCRIPT_DIR}/hinemos/lib/cr/rpminstall.sh > ${HINEMOS_HOME}/lib/cr/rpminstall.sh
	
	# configure selfcheck-service.properties
	sed -e "s|%%MOUNTPOINT_DB%%|${MOUNTPOINT_DB}|" \
		-e "s|%%MOUNTPOINT_LOG%%|${MOUNTPOINT_LOG}|" \
		${SCRIPT_DIR}/hinemos/etc/selfcheck-service.properties > ${HINEMOS_ETC_DIR}/selfcheck-service.properties
	if [ $? -ne 0 ]
	then
		EchoNG
		echo_msg MSG_E004
		return 255
	fi
		
	# configure snmpd.conf
	if [ -e /etc/snmp/snmpd.conf ] && [ `grep -E "^view.+systemview.+included.+.1\.3\.6\.1$" /etc/snmp/snmpd.conf | wc -l` -eq 0 ]
	then
		echo
		echo_msg MSG_I042
		cp -pr /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.saved_`date +"%Y%m%d-%H%M%S"`
		echo "view    systemview    included   .1.3.6.1" >> /etc/snmp/snmpd.conf
		
		# configure runlevel and restart snmpd
		/etc/init.d/snmpd status > /dev/null 2>&1 && /etc/init.d/snmpd stop
		chkconfig --level 2345 snmpd on && /etc/init.d/snmpd start
		if [ $? -ne 0 ]
		then
			EchoNG
			echo_msg MSG_E004
			return 255
		fi
		
		echo_msg MSG_I043
		echo_msg MSG_I044
		echo_msg MSG_W008
	fi
	EchoOK
	
	return 0
}

function ConfigureRsyslog() {
	echo
	echo_msg_n MSG_I057
	
	BKUP_FILE=${RSYSLOG_CONF}.saved_`date +"%Y%m%d-%H%M%S"`
	if [ `grep "rsyslog_hinemos.conf" ${RSYSLOG_CONF} | grep -v "^#" | wc -l` -eq 0 ]
	then
		echo
		echo_msg_n MSG_I058
		cp -pu ${SCRIPT_DIR}/lib/rsyslog_hinemos.conf /etc/ \
		&& mv ${RSYSLOG_CONF} ${BKUP_FILE} \
		&& echo "\$IncludeConfig /etc/rsyslog_hinemos.conf" >> ${RSYSLOG_CONF} \
		&& echo "" >> ${RSYSLOG_CONF} \
		&& cat ${BKUP_FILE} >> ${RSYSLOG_CONF}
		if [ $? -ne 0 ]
		then
			EchoNG
			echo_msg MSG_E004
			return 255
		fi
		service rsyslog restart
		if [ $? -ne 0 ]
		then
			EchoNG
			echo_msg MSG_E004
			return 255
		fi
	fi
}

function ChangeOwner()
{
	echo
	echo_msg_n MSG_I016
	chown -R ${HINEMOS_OS_USER}:${HINEMOS_OS_USER} ${HINEMOS_HOME} \
		&& chown root:root ${HINEMOS_HOME}/sbin/fping \
		&& chmod 4755 ${HINEMOS_HOME}/sbin/fping \
		&& chown root:root ${HINEMOS_HOME}/sbin/fping6 \
		&& chmod 4755 $HINEMOS_HOME/sbin/fping6
	if [ $? -ne 0 ]
	then
		EchoNG
		echo_msg MSG_E004
		return 255
	fi
	EchoOK
	return 0
}

function InitializeDatabase()
{
	echo
	echo_msg MSG_I029
	
	su -c "${HINEMOS_HOME}/sbin/db_init/pg_init.sh ${LANGUAGE}" - ${HINEMOS_OS_USER}
	if [ $? -ne 0 ]
	then
		echo_msg MSG_E012 && echo_msg MSG_E004
		return 255
	fi
	
	return 0
}

function SIGINTExit()
{
	echo
	echo_msg MSG_E015
	exit 255
}

function echo_msg()
{
	local PARAM=$1
	
	if [ -e ${SCRIPT_DIR}/lib/${LANGUAGE}_install.lng ]
	then
		. ${SCRIPT_DIR}/lib/${LANGUAGE}_install.lng
	fi
	
	eval 'echo "${'${PARAM}'}"'
}

function echo_msg_n()
{
	local PARAM=$1
	echo -n "`echo_msg ${PARAM}`"
}

########################################
# SHELL
########################################

#
# check parameters
#
if [ $# -ne 1 ]; then
	echo_msg MSG_E001
	exit 255
fi

# define trap
trap SIGINTExit 2

# print welcome
Welcome

# confirm installation
ConfirmInstallation || exit 254

# check environment
CheckEnvironment|| exit 253

# check install directory
CheckInstallDirectory || exit 252

# check install user
CreateUser || exit 251

# input java
InputJava || exit 250

# input wbem client module
InputWbemModule || exit 249

# input ftp server
InputFtpServer || exit 247

# input mount point
InputMountPoint || exit 246

# copy files
CopyFiles || exit 245

# configure files
ConfigureFiles || exit 244

# configure rsyslog.conf
ConfigureRsyslog || exit 239

# change owner
ChangeOwner || exit 243

# initialize database
InitializeDatabase || exit 240

echo && echo_msg MSG_I030 && echo

exit 0

