#!/bin/bash

# Copyright (C) 2011 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 -1

export PROG=`basename $0`
DIR=`dirname $0`
if [ `uname -s | grep "SunOS" | wc -l` -ne 0 ]
then
	WHOAMI="/usr/ucb/whoami"
	PS="ps -ef"
else
	WHOAMI="/usr/bin/whoami"
	PS="/usr/ucb/ps auxwww"
fi
USER=`${WHOAMI}`
HOST=`hostname -s`
HINEMOS_AGENT_HOME=${HINEMOS_AGENT_HOME_DEFAULT}
INSTALL_SLEEP=0.2

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

LANGUAGE=$1

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

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

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

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

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

function Welcome()
{
	if [ -e ${SCRIPT_DIR}/hinemos_agent/_version ]
	then
		VERSION=`cat ${SCRIPT_DIR}/hinemos_agent/_version`
	elif [ -e ${SCRIPT_DIR}/../_version ]
	then
		VERSION=`cat ${SCRIPT_DIR}/../_version`
	else
		VERSION=`UNKNOWN`
	fi
	echo
	echo "-------------------------------------------------------"
	echo "   Welcome to the installation for Hinemos Agent"
	echo "                   Version ${VERSION}"
	echo
	echo "       Copyright (C) 2012 NTT DATA Corporation"
	echo "-------------------------------------------------------"
}

function CheckEnvironment()
{
	# check os version
	echo
	echo -n ${MSG_I063}
	if [ `cat /etc/redhat-release | grep "${OS_CHECK_REGEX}" | wc -l` -eq 0 ] || \
	   [ `uname -a | grep "x86_64" | wc -l` -ne ${OS_CHECK_64} ]
	then
		if [ -e /etc/redhat-release ]
		then
			OS_RELEASE=" (`cat /etc/redhat-release`, `uname -a`) "
		fi
		EchoNG
		echo ${MSG_E015} ${OS_RELEASE} && echo ${MSG_E004}
		return 255
	fi
	EchoOK
	
	# check user executed
	echo
	echo -n "${MSG_I001}"
	if [ "x"${USER} != "xroot" ]
	then
		EchoNG
		echo "${MSG_E002}" && echo "${MSG_E004}"
		return 255
	fi
	EchoOK
	
	# check selinux is Disabled
	echo
	echo -n "${MSG_I002}"
	if [ "x${SELINUX_CHECK}" == "xtrue" ] && [ "xDisabled" != "x`/usr/sbin/getenforce`" ]
	then
		EchoNG
		echo "${MSG_E003}" && echo "${MSG_E004}"
		return 255
	fi
	EchoOK
	
	# check openJDK
	echo
	echo "${MSG_I059}"
	for RPM in ${RPM_JDK[@]}
	do
		echo -n "   ${RPM}..."
		rpm -q ${RPM} > /dev/null 2>&1
		if [ $? -ne 0 ]
		then
			EchoNG
			echo ${RPM}"${MSG_E014}" && echo "${MSG_E004}"
			return 255
		fi
	done
	EchoOK
	
	return 0
}

function ConfirmInstallation()
{
	# confirm installation
	echo
	while [ 1 ]
	do
		sleep ${INSTALL_SLEEP} && read -p "${MSG_I009} : " INPUT
		INPUT=${INPUT:-Y}
		case ${INPUT} in
			y|Y)
				break;
				;;
			n|N)
				echo "${MSG_I010}"
				return 255
				;;
			*)
				echo "${MSG_W001}"
				;;
		esac
	done
		
	return 0
}

function ConfirmUninstallation()
{
	# confirm installation
	echo
	while [ 1 ]
	do
		sleep ${INSTALL_SLEEP} && read -p "${MSG_I029} : " INPUT
		INPUT=${INPUT:-Y}
		case ${INPUT} in
			y|Y)
				break;
				;;
			n|N)
				echo "${MSG_I030}"
				return 255
				;;
			*)
				echo "${MSG_W001}"
				;;
		esac
	done
	
	return 0
}

function CheckRPM()
{
	# net-snmp
	local RET=0
	echo
	echo "${MSG_I013}" && sleep ${INSTALL_SLEEP}
	for RPM in ${RPM_SNMP[@]}
	do
		echo -n "   ${RPM}..."
		rpm -q ${RPM} > /dev/null 2>&1
		if [ $? -eq 0 ]
		then
			EchoOK
		else
			EchoNG
			RET=1
		fi
	done
	if [ ${RET} -eq 0 ]
	then
		RET=0
		
		PKG_NET_SNMP=`rpm -q net-snmp`
		PKG_NET_SNMP_LIB=`rpm -q net-snmp-libs`
		
		echo -n "   ${SNMP_VERSION}..."
		if [[ "x${PKG_NET_SNMP}" < "x${SNMP_VERSION}" ]]
		then
			EchoNG
			RET=1
			echo "${MSG_W006} (current ${PKG_NET_SNMP} < recommend ${SNMP_VERSION})"
		else
			EchoOK
		fi
		
		echo -n "   ${SNMP_LIBS_VERSION}..."
		if [[ "x${PKG_NET_SNMP_LIB}" < "x${SNMP_LIBS_VERSION}" ]]
		then
			EchoNG
			RET=1
			echo "${MSG_W006} (current ${PKG_NET_SNMP_LIB} < recommend ${SNMP_LIBS_VERSION})"
		else
			EchoOK
		fi
	else
		echo "${MSG_W003}"
		echo "${MSG_W004}"
	fi
	
	if [ ${RET} -ne 0 ]
	then
		while [ 1 ]
		do
			sleep ${INSTALL_SLEEP} && read -p "${MSG_I012} : " INPUT
			INPUT=${INPUT:-N}
			case ${INPUT} in
				y|Y)
					break
					;;
				n|N)
					echo "${MSG_I010}"
					return 255
					;;
				*)
					echo "${MSG_W001}"
					;;
			esac
		done
	fi
	
	# expect and so on (for collective run)
	RET=0
	echo "${MSG_I013}" && sleep ${INSTALL_SLEEP}
	for RPM in ${RPM_CRUN[@]}
	do
		echo -n "   ${RPM}..."
		rpm -q ${RPM} > /dev/null 2>&1
		if [ $? -eq 0 ]
		then
			EchoOK
		else
			EchoNG
			RET=1
		fi
	done
	if [ ${RET} -ne 0 ]
	then
		echo "${MSG_W005}"
		echo "${MSG_W004}"
		
		while [ 1 ]
		do
			sleep ${INSTALL_SLEEP} && read -p "${MSG_I012} : " INPUT
			INPUT=${INPUT:-N}
			case ${INPUT} in
				y|Y)
					break
					;;
				n|N)
					echo "${MSG_I010}"
					return 255
					;;
				*)
					echo "${MSG_W001}"
					;;
			esac
		done
	fi
	
	return 0
}

function CheckInstallDirectory()
{
	echo
	while [ 1 ]
	do
		read -p "${MSG_I044} : " INPUT
		INPUT=${INPUT:-Y}
			case ${INPUT} in
				y|Y)
					HINEMOS_AGENT_HOME=${HINEMOS_AGENT_HOME_DEFAULT}
					ID=""
					break
					;;
				n|N)
					while [ 1 ]
					do
						read -p "${MSG_I045} : " INPUT
						INPUT=${INPUT}
						case "x${INPUT}" in
							x)
								echo "${MSG_W015}"
								;;
							*)
								if [ ${#INPUT} -gt 32 ]
								then
									echo "${MSG_W016}"
									continue
								fi
								ID=_${INPUT} && ReloadMSG
								read -p "${MSG_I046} : " INPUT
								INPUT=${INPUT:-Y}
								case ${INPUT} in
									y|Y)
										HINEMOS_AGENT_HOME=${HINEMOS_AGENT_HOME_DEFAULT}${ID} && ReloadMSG
										break
										;;
									n|N)
										echo "${MSG_I018}"
										;;
									*)
										echo "${MSG_W001}"
										;;
								esac
						esac
					done
					break
					;;
				*)
					echo "${MSG_W001}"
					;;
			esac
	done

	echo
	ReloadMSG
	echo "${MSG_I015}" && sleep ${INSTALL_SLEEP}
	if [ -d ${HINEMOS_AGENT_HOME} ]
	then
		echo "${MSG_W007}"
		ls -lA ${HINEMOS_AGENT_HOME} | sed "s/^/   /"
		while [ 1 ]
		do
			sleep ${INSTALL_SLEEP} && read -p "${MSG_I012} : " INPUT
			INPUT=${INPUT:-N}
			case ${INPUT} in
				y|Y)
					# force installation
					break
					;;
				n|N)
					echo "${MSG_I010}"
					return 255
					;;
				*)
					echo "${MSG_W001}"
					;;
			esac
		done
	else
		mkdir -p ${HINEMOS_AGENT_HOME}
		if [ $? -ne 0 ]
		then
			echo "${MSG_E005}" && echo "${MSG_E004}"
			return 255
		fi
		echo "${MSG_I016}"
	fi
	return 0
}

function InputIpAddress()
{
	echo
	while [ 1 ]
	do
		sleep ${INSTALL_SLEEP} && read -p "${MSG_I017} : " MANAGER_IP_ADDRESS
		read -p "${MANAGER_IP_ADDRESS} ${MSG_I019} : " INPUT
		INPUT=${INPUT:-Y}
		case ${INPUT} in
			y|Y)
				# force installation
				break
				;;
			n|N)
				echo "${MSG_I018}"
				;;
			*)
				echo "${MSG_W001}"
				;;
		esac
	done
	return 0
}

function CopyFiles()
{
	echo
	echo -n "${MSG_I020}" && sleep ${INSTALL_SLEEP}
	cp -pr ${SCRIPT_DIR}/hinemos_agent/* ${HINEMOS_AGENT_HOME} \
		&& mkdir -p ${HINEMOS_AGENT_HOME}/sbin/conf \
		&& cp -pr ${SCRIPT_DIR}/install.cfg ${HINEMOS_AGENT_HOME}/sbin \
		&& cp -pr ${SCRIPT_DIR}/agent_installer_* ${HINEMOS_AGENT_HOME}/sbin \
		&& cp -pr ${SCRIPT_DIR}/conf/*_install.lng ${HINEMOS_AGENT_HOME}/sbin/conf \
		&& cp -p ${SCRIPT_DIR}/LICENSE ${HINEMOS_AGENT_HOME}/
	if [ $? -ne 0 ]
	then
		EchoNG
		echo "${MSG_E004}"
		return 255
	fi
	EchoOK
	return 0
}

function ConfigureFiles()
{
	echo
	echo "${MSG_I021}" && sleep ${INSTALL_SLEEP}
	
	# configure hinemos.cfg
	sed -e "s|%%HINEMOS_AGENT_HOME%%|${HINEMOS_AGENT_HOME}|" \
	-e "s/%%ID%%/${ID}/" \
	-e "s/%%LOCALE%%/${LOCALE}/" \
	${SCRIPT_DIR}/conf/hinemos_agent.cfg > ${HINEMOS_AGENT_HOME}/conf/hinemos_agent.cfg.tmp
	if [ $? -ne 0 ]
	then
		EchoNG
		echo "${MSG_E004}"
		return 255
	fi
		
	# edit JAVA_HOME
	echo ""
	echo "${MSG_I057}"
	echo "----------"
	${JAVA_DIR_OSORIGINAL}/bin/java -version
	echo "----------"
	echo "${MSG_I058}"
	sed -e "s|${HINEMOS_AGENT_HOME}/%%JAVA_DIR%%|${JAVA_DIR_OSORIGINAL}|" \
	${HINEMOS_AGENT_HOME}/conf/hinemos_agent.cfg.tmp > ${HINEMOS_AGENT_HOME}/conf/hinemos_agent.cfg
	RET=$?
	rm -f ${HINEMOS_AGENT_HOME}/conf/hinemos_agent.cfg.tmp
	if [ ${RET} -ne 0 ]
	then
		EchoNG
		echo "${MSG_E004}"
		return 255
	fi
	
	# configure Agent
	sed -e "s/%%MANAGER_IP_ADDRESS%%/${MANAGER_IP_ADDRESS}/" \
		-e "s|%%AGENT_HOME%%|${HINEMOS_AGENT_HOME}|" \
		${SCRIPT_DIR}/hinemos_agent/conf/Agent.properties > ${HINEMOS_AGENT_HOME}/conf/Agent.properties
	if [ $? -ne 0 ]
	then
		EchoNG
		echo "${MSG_E004}"
		return 255
	fi
	
	sed -e "s|%%HINEMOS_AGENT_HOME%%|${HINEMOS_AGENT_HOME}|" \
		-e "s/%%HOST%%/${HOST}/" \
		${SCRIPT_DIR}/hinemos_agent/conf/log4j.properties > ${HINEMOS_AGENT_HOME}/conf/log4j.properties
	if [ $? -ne 0 ]
	then
		EchoNG
		echo "${MSG_E004}"
		return 255
	fi
	EchoOK
	
	return 0
}

function CopyServiceScripts()
{
	echo 
	while [ 1 ]
	do
		read -p "${MSG_I050} : " INPUT
		INPUT=${INPUT:-Y}
		case ${INPUT} in
			y|Y)
				cp -p ${SCRIPT_DIR}/hinemos_agent/sbin/service/hinemos_agent /etc/init.d/hinemos_agent${ID}
				chkconfig --add hinemos_agent${ID}
				echo "${MSG_I051}"
				break
				;;
			n|N)
				echo "${MSG_I052}"
				break
				;;
			*)
				echo "${MSG_W001}"
				;;
		esac
	done
	return 0
}

function ConfigureRsyslog()
{	
	# configure rsyslog.conf
	if [ ! -e ${RSYSLOG_CONF} ]
	then
		echo "${MSG_I062}"
		return 0
	fi
	
	if [ `grep -F "@${MANAGER_IP_ADDRESS}:514" ${RSYSLOG_CONF} | wc -l` -eq 0 ] && [ `grep "rsyslog_hinemos.conf" ${RSYSLOG_CONF} | wc -l` -eq 0 ]
	then
		echo
		echo -n "${MSG_I060}" && sleep ${INSTALL_SLEEP}
		cp -pr ${RSYSLOG_CONF} ${RSYSLOG_CONF}.saved_`date +"%Y%m%d-%H%M%S"`
		echo "#" >> ${RSYSLOG_CONF}
		echo "# Hinemos Agent ${VERSION} (for syslog monitoring)" >> ${RSYSLOG_CONF}
		echo "#" >> ${RSYSLOG_CONF}
		echo "*.info;mail.none;authpriv.none;cron.none        @@${MANAGER_IP_ADDRESS}:514" >> ${RSYSLOG_CONF}
		
		# restart rsyslog
		service rsyslog status
		if [ $? -ne 0 ]
		then
			echo "${MSG_I064}"
			return 0
		fi
		
		service rsyslog restart
		if [ $? -ne 0 ]
		then
			EchoNG
			echo "${MSG_E004}"
			return 255
		fi
		
		echo "${MSG_I061} (appended \"*.info;mail.none;authpriv.none;cron.none        @${MANAGER_IP_ADDRESS}:514\")"
	fi
	
	return 0
}

function ConfigureNetSnmp()
{	
	# configure snmpd.conf
	if [ -e ${SNMP_CONF} ] && [ `grep -E "^view.+systemview.+included.+.1\.3\.6\.1$" ${SNMP_CONF} | wc -l` -eq 0 ]
	then
		echo
		echo -n "${MSG_I023}" && sleep ${INSTALL_SLEEP}
		cp -pr ${SNMP_CONF} ${SNMP_CONF}.saved_`date +"%Y%m%d-%H%M%S"`
		echo "view    systemview    included   .1.3.6.1" >> ${SNMP_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_E004}"
			return 255
		fi
		
		echo "${MSG_I024} (appended \"view systemview included .1.3.6.1\")"
		echo "${MSG_I043}"
		echo "${MSG_W014}"
	fi
	
	return 0
}

function CheckProcess()
{
	local PID
	
	echo && echo "${MSG_I031}" && sleep ${INSTALL_SLEEP}
	
	# Hinemos Agent
	if [ -e /var/run/hinemos_agent${DEL_ID}.pid ]
	then
		read PID < /var/run/hinemos_agent${DEL_ID}.pid
		if [ `ps --no-headers --pid ${PID} e | grep "/bin/java.*com.clustercontrol.agent.Agent" | wc -l` -gt 0 ]
		then
			echo "${MSG_E008}"
			return 255
		fi
	fi
	
	return 0
}

function RemoveFiles()
{
	echo
	if [ `find /opt -mindepth 1 -maxdepth 1 -type d -path "/opt/hinemos_agent*" | wc -l` -ne 0 ]
	then
		echo "${MSG_I047}"
		find /opt -mindepth 1 -maxdepth 1 -type d -path "/opt/hinemos_agent*"
		
		# if installed script is executed
		DEL_ID="undef"
		if [ -e ${SCRIPT_DIR}/../conf/hinemos_agent.cfg ]
		then
			. ${SCRIPT_DIR}/../conf/hinemos_agent.cfg
			DEL_ID=${ID} && ReloadMSG
			
			echo
			while [ 1 ]
			do
				sleep ${INSTALL_SLEEP} && read -p "${MSG_I055} : " INPUT
				INPUT=${INPUT:-Y}
				case ${INPUT} in
					y|Y)
						break;
						;;
					n|N)
						echo "${MSG_I030}"
						return 255
						;;
					*)
						echo "${MSG_W001}"
						;;
				esac
			done
		fi
		
		# if default agent is not removed
		if [ "x${DEL_ID}" == "xundef" ]
		then
			echo
			echo "${MSG_I048}"
			read -p "/opt/hinemos_agent" INPUT
			
			DEL_ID=${INPUT}
			echo
			HINEMOS_AGENT_HOME=/opt/hinemos_agent${DEL_ID} && ReloadMSG
		fi
		
		echo
		echo "${MSG_I037}"
		if [ ! -d ${HINEMOS_AGENT_HOME} ]
		then
			echo "${MSG_I038}"
			return 255
		fi
		
		CheckProcess || return 255
		
		while [ 1 ]
		do
			sleep ${INSTALL_SLEEP} && read -p "${MSG_I039} : " INPUT
			INPUT=${INPUT:-Y}
			case ${INPUT} in
				y|Y)
					break
					;;
				n|N)
					echo "${MSG_W013}"
					return 0
					;;
				*)
					echo "${MSG_W001}"
					;;
			esac
		done
		
		if [ `ls -l /etc/init.d/ | grep hinemos_agent${DEL_ID}$ | wc -l` -ne 0 ]
		then
			chkconfig --del hinemos_agent${DEL_ID}
			rm -rf /etc/init.d/hinemos_agent${DEL_ID}
			echo "${MSG_I054}"
		fi
		
		rm -rf ${HINEMOS_AGENT_HOME}
		if [ $? -ne 0 ]
		then
			echo "${MSG_E011}"
			return 255
		fi
		echo "${MSG_I040}"
		
	else
		echo "${MSG_I049}"
		return 255
	fi
	return 0
}

function ReloadMSG()
{
	if [ -e ${SCRIPT_DIR}/conf/${LANGUAGE}_install.lng ]
	then
		. ${SCRIPT_DIR}/conf/${LANGUAGE}_install.lng
	else
		echo "failed reloading a language file. (${LANGUAGE}_install.lng)"
	fi
}

function SIGINTExit()
{
	echo
	echo "${MSG_E004} (SIGINT)"
	exit -1
}

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

#
# check parameters
#
if [ $# -ne 1 ]; then
	echo "${MSG_E001}"
	exit -1
fi

# define trap
trap SIGINTExit 2

# print welcome
Welcome

# check environment
CheckEnvironment || exit -2

# main loop
while [ 1 ]
do
	sleep ${INSTALL_SLEEP} && echo
	echo "${MSG_I003}"
	if [ -e ${SCRIPT_DIR}/hinemos_agent ]
	then
		# if installed script is executed
		echo "${MSG_I004}"
	fi
	echo "${MSG_I005}"
	echo "${MSG_I006}"
	echo
	read -p "${MSG_I007}" INPUT
	case ${INPUT} in
		1)
			if [ -e ${SCRIPT_DIR}/hinemos_agent ]
			then
				ConfirmInstallation || continue
				CheckInstallDirectory || continue
				CheckRPM || continue
				InputIpAddress || continue
				CopyFiles || continue
				ConfigureFiles || continue
				CopyServiceScripts || continue
				ConfigureRsyslog || continue
				ConfigureNetSnmp || continue
				echo && echo "${MSG_I028}" && echo
			else
				# if installed script is executed
				echo "${MSG_W001}"
			fi
			;;
		2)
			ConfirmUninstallation || continue
			RemoveFiles || continue
			echo && echo "${MSG_I041}"
			echo && echo "${MSG_I008}" && echo
			# if installed script is executed
			if [ ! -e ${SCRIPT_DIR}/hinemos_agent ]
			then
				break
			fi
			;;
		9)
			echo && echo "${MSG_I008}" && echo
			break
			;;
		*)
			echo "${MSG_W001}"
			;;
	esac
	
done

exit 0