#!/bin/sh
#
# $Id$
#-------------------------------------------------------------------------------
# TeamFile サーバ用アップデータースクリプト
#
#-------------------------------------------------------------------------------
# Usage: $0 [ -s ] サイレントモード (進行画面表示なし)
#           [ -I ] 対話式アップデートを行わない
#           [ -B ] バックアップを行わない
#           [ -d (ダウンロード/更新モジュール格納ディレクトリ) ]
#           [ -b (バックアップモジュール格納用ディレクトリ) ]
#           [ -l ] ローカルファイルシステムからパッケージを取得する
#           [ -h ] Usage 表示
#-------------------------------------------------------------------------------

LANG=C
export LANG
#------------------
# set env
#------------------
if test -d "${TF_HOME}"; then
	MT_FUNCTION_HOME="${TF_HOME}/www/bin"
else
	MT_FUNCTION_HOME="/usr/local/teamfile/www/bin"
fi

MT_FUNCTION="${MT_FUNCTION_HOME}/mt-lib"
if test ! -f ${MT_FUNCTION}; then
	echo "The configuration script \"${MT_FUNCTION}\" was missing. Please check it."
	exit 1
fi

# read functions and configuration
. ${MT_FUNCTION}

SILENT_MODE=0
INTERACTIVE_MODE=1
BACKUP_MODE=1
LOCAL_DOWNLOAD=0

TFUPDATER_LOCKFILE="${TMP_BASE_DIR}/tfupdater.lock"
DL_DIR_PATH="${TF_DOWNLOAD_PATH}"
DL_FILELIST_PATH="${TF_DOWNLOAD_PATH}/downloadlist"
DL_SCRIPTLIST_PATH="${TF_DOWNLOAD_PATH}/scriptlist"
UP_FILELIST_PATH="${TF_DOWNLOAD_PATH}/updatedlist"
UP_SCRIPT_TMP_PATH="${TF_DOWNLOAD_PATH}/scripttmp"
BACKUP_BASE_DIR="${BACKUP_ROOT}/before_update"
STOP_APACHE=0
STOP_POSTGRESQL=0

# for perl updater script
if test -n "${PERLLIB}"; then
	PERLLIB="${MT_FUNCTION_HOME}:${PERLLIB}"
else
	PERLLIB="${MT_FUNCTION_HOME}"
fi
export PERLLIB

#---------------
# set trap
#---------------
trap : HUP
trap "echo 'receive INT. Please wait for a while.'; exitscript ${UP_ST_ABORT}" INT
trap "echo 'receive QUIT. Please wait for a while.'; exitscript ${UP_ST_ABORT}" QUIT
trap "echo 'receive TERM. Please wait for a while.'; exitscript ${UP_ST_ABORT}" TERM
trap "echo 'receive KILL. Please wait for a while.'; exitscript ${UP_ST_ABORT}" KILL

#---------------------------------------------------------------------
# Show Usage
#---------------------------------------------------------------------
usage() {
	echo "$0: [-s] [-I] [-B] [-d dirpath] [-b filepath] [-l] [-h]" 
	echo "    -s : silent mode (no output screen)"
	echo "    -I : NO interactive mode"
	echo "    -B : NO backup files"
	echo "    -d : The path of downloaded modules (default: ${TF_DOWNLOAD_PATH})"
	echo "    -b : The backupfiles stored path (default: ${BACKUP_BASE_DIR})"
	echo "    -l : get files via Local file system (default: via Network)"
	echo "    -h : show help"
}

#---------------------------------------------------------------------
# echo
#---------------------------------------------------------------------
ECHO() {
	if test "${SILENT_MODE}" = "0"; then
		echo "$@"
	fi

	echo `date`":  $@" >> ${TF_UPLOG_PATH}
}

#---------------------------------------------------------------------
# echo (no ouput date)
#---------------------------------------------------------------------
ECHO_NODATE() {
	if test "${SILENT_MODE}" = "0"; then
		echo "$@"
	fi

	echo "$@" >> ${TF_UPLOG_PATH}
}

#---------------------------------------------------------------------
# exit script
#---------------------------------------------------------------------
exitscript() {
	_STATUS_FILE="${TMP_BASE_DIR}/__statusline"

	if test ${STOP_POSTGRESQL} = 1; then
		start_postgresql > ${_STATUS_FILE} 2>&1
		if test "${SILENT_MODE}" = 0; then
			cat ${_STATUS_FILE}
			echo `date`": "`cat ${_STATUS_FILE}` >> ${TF_UPLOG_PATH}
		fi
	fi

	if test ${STOP_APACHE} = 1; then
		start_teamfile > ${_STATUS_FILE} 2>&1
		if test "${SILENT_MODE}" = 0; then
			cat ${_STATUS_FILE}
			echo `date`": "`cat ${_STATUS_FILE}` >> ${TF_UPLOG_PATH}
		fi
	fi
	if test -f ${_STATUS_FILE}; then
		rm -f ${_STATUS_FILE}
	fi

	unlockscript "${TFUPDATER_LOCKFILE}"
	exit $1
}

#---------------------------------------------------------------------
# load profile
#
#	$1: The file path of profile
#---------------------------------------------------------------------
load_profile() {
	if test -f "$1"; then
		# load data
		. $1

		if test -z "${TFSUP_SITE_INFO}"; then
			TFSUP_SITE_INFO="---"
		fi

		if test -z "${TFSUP_EXECUTE_UPDATE}"; then
			TFSUP_EXECUTE_UPDATE="off"
		fi

		if test -z "${TFSUP_IGNORE_PKG}"; then
			TFSUP_IGNORE_PKG="off"
		fi

		if test -z "${TFSUP_SEND_STATUSMAIL}"; then
			TFSUP_SEND_STATUSMAIL="on"
		fi
	else
		TFSUP_EXECUTE_UPDATE="off"
		TFSUP_IGNORE_PKG="off"
		TFSUP_SEND_STATUSMAIL="on"
	fi
}

#---------------------------------------------------------------------
# send status mail
# [ arg ]
#	$1 : message text
#---------------------------------------------------------------------
send_status_mail() {
	if test "${TFSUP_SEND_STATUSMAIL}" != "on"; then
		return 0;
	fi

	export TF_BINDIR
	MSGFILE="${TMP_BASE_DIR}/__msg"
	shost=`/bin/hostname`
	sipaddr=`perl -e 'require "$ENV{TF_BINDIR}/mt-lib.pl"; print &getipaddrs();'`
	supdate=`date '+%Y/%m/%d (%a) %H:%M:%S'`
	sunameA=`uname -a`
	sosinfo=`cat /etc/redhat-release`
	tmstatmp=`echo $supdate | sed -e 's|[ ][ ]*([a-zA-Z0-9][a-zA-Z0-9]*)[ ][ ]*|_|' -e 's|[/:]||g'`
	if test -z "${TF_DL_USERID}"; then
		ATTACHMENTFILE="${TMP_BASE_DIR}/result_${tmstatmp}.xml"
	else
		ATTACHMENTFILE="${TMP_BASE_DIR}/result(${TF_DL_USERID})_${tmstatmp}.xml"
	fi

	TYPE_RELEASE=${OS_RELEASE_STR}
	TYPE_OS=`uname -s`
	TYPE_PLATFORM=`uname -i`
	TYPE_ARCH=`uname -p`

	DL_URI_LIST=`echo ${TF_DL_LOCATION} | sed -e 's:@os@:'"${TYPE_OS}"':g' -e 's:@platform@:'"${TYPE_PLATFORM}"':g' -e 's:@arch@:'"${TYPE_ARCH}"':g' -e 's:@release@:'"${TYPE_RELEASE}"':g'`

	# create msg body file (txt)
	cat - > ${MSGFILE} <<_ML_BODY_MSG_
[ Server information ]

* SupportID = ${TF_DL_USERID}
* Hostname  = ${shost}
* IPaddr    = ${sipaddr}
* Date      = ${supdate}
* SiteInfo  = ${TFSUP_SITE_INFO}
* SiteUri   = ${DL_URI_LIST}

$1
See attachment file for detail status.
_ML_BODY_MSG_
	RETVAL=$?
	if test "${RETVAL}" != "0"; then
		ECHO "Failed to create e-mail msg body."
		return 1;
	fi

	# create attachment file (xml)
	conffiles=`show_configuration_files`
	CONF_XML=
	F_CONF="${TMP_BASE_DIR}/__configdump"
	rm -f ${F_CONF}
	touch ${F_CONF}

	for conf in ${conffiles};
	do
		CONF_XML="${CONF_XML}<configfilepath><![CDATA[${conf}]]></configfilepath>"
		sed -e '/^#/d' -e '/[\t ][\t ]*#/d' ${conf} >> ${F_CONF}
		echo "" >> ${F_CONF}
	done

	cat - > ${ATTACHMENTFILE} <<_ML_ATTACHMENT_FILE_
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.teamfile.com/XSL/tfsup_result2.xsl" ?>
<tfsupdatedata>
<server-information>
	<userid><![CDATA[${TF_DL_USERID}]]></userid>
	<hostname><![CDATA[${shost}]]></hostname>
	<kernelinfo><![CDATA[${sunameA}]]></kernelinfo>
	<osinfo><![CDATA[$sosinfo]]></osinfo>
	<ipaddress><![CDATA[${sipaddr}]]></ipaddress>
	<updatedate><![CDATA[${supdate}]]></updatedate>
	<configfilepathlist>${CONF_XML}</configfilepathlist>
	<configdump><![CDATA[
`cat ${F_CONF}`
]]></configdump>
</server-information>
<site-information>
	<siteinfo><![CDATA[${TFSUP_SITE_INFO}]]></siteinfo>
	<siteuri><![CDATA[${DL_URI_LIST}]]></siteuri>
</site-information>
<server-log><![CDATA[
`cat ${TF_UPLOG_PATH}`
]]></server-log>
<statics-information>
	<diskinfo><![CDATA[
`df -h`
]]></diskinfo>
	<processinfo><![CDATA[
`ps auxwww`
]]></processinfo>
	<vmstat><![CDATA[
`vmstat 1 5`
]]></vmstat>
	<cpuinfo><![CDATA[
`cat /proc/cpuinfo`
]]></cpuinfo>
</statics-information>
</tfsupdatedata>
_ML_ATTACHMENT_FILE_
	RETVAL=$?
	if test "${RETVAL}" != "0"; then
		ECHO "Failed to create e-mail attachment file."
		return 1;
	fi

	# send e-mail
	$TF_SENDMAIL --from="${TFSUP_MAIL_FROM}" --to="${TFSUP_RCPT_TO}" \
			--subject="${TFSUP_SUBJECT} (${TF_DL_USERID})" \
			--host="${TFSUP_SMTP_NAME}" --port="${TFSUP_SMTP_PORT}" \
			--msgf="${MSGFILE}" --attach="${ATTACHMENTFILE}"
	rm -f ${MSGFILE} ${ATTACHMENTFILE} ${F_CONF}

	return 0;
}

#---------------------------------------------------------------------
# check update (for Linux)
# [ return ]
#     UP_ST_NOUPDATE : No updated packages found
#     UP_ST_OK       : updated packages found
#---------------------------------------------------------------------
check_update_linux() {

	FILELIST=`cat ${DL_FILELIST_PATH}`

	pushd ${DL_DIR_PATH} >/dev/null 2>&1

	ECHO "# Checking updated release package..."

	# check updated package list
	for line in ${FILELIST}; do
		pkg=`echo ${line}`
		if test ! -f ${pkg}; then
			continue
		fi

		build_status_line "Checking" "${pkg}"
		if test "${SILENT_MODE}" = "0"; then
			$ECHO_N "${DL_STATUS_LINE} ... "$ECHO_C
		fi
		$ECHO_N `date`":  ${DL_STATUS_LINE} ... "$ECHO_C >> ${TF_UPLOG_PATH}

		validate_rpm_update ${pkg}
		RETVAL=$?
		case "${RETVAL}" in
			${RPM_VALIDATE_ST_NEWER} | ${RPM_VALIDATE_ST_DEPENDENCY})
				ECHO_NODATE "[ updated-release ]"
				UPDATED_LIST="${UPDATED_LIST} ${pkg}"
				;;
			${RPM_VALIDATE_ST_INSTALLED})
				ECHO_NODATE "already installed (same)"
				;;
			${RPM_VALIDATE_ST_OLDER})
				echo "already installed (old)"
				;;
			${RPM_VALIDATE_ST_BROKEN} | ${RPM_VALIDATE_ST_ERROR})
				ECHO_NODATE "skip"
				;;
		esac
	done
	ECHO "# ok."

	# checkupdate
	SCRIPTLIST=
	if test -f ${DL_SCRIPTLIST_PATH}; then
		SCRIPTLIST=`cat ${DL_SCRIPTLIST_PATH}`
	fi
	UPDATED_SCRIPT_LIST=
	STR_OPT=
	if test "${SILENT_MODE}" = 1; then
		STR_OPT="-s"
	fi
	rm -f ${DL_SCRIPTLIST_PATH}
	touch ${DL_SCRIPTLIST_PATH}
	for sf in ${SCRIPTLIST}; do
		# execute command
		if test ! -x $sf; then
			chmod a+x $sf
		fi
		./$sf -m ${UPSP_MODE_CHECKUPDATE} -d "${DL_DIR_PATH}" -u "${UP_FILELIST_PATH}" -p "${UP_SCRIPT_TMP_PATH}" ${STR_OPT} >> ${TF_UPLOG_PATH} 2>&1
		RETVAL=$?
		if test "${RETVAL}" = "1"; then
			UPDATED_SCRIPT_LIST="${UPDATED_SCRIPT_LIST} $sf"
		fi
	done

	popd >/dev/null 2>&1

	if test -z "${UPDATED_LIST}" && test -z "${UPDATED_SCRIPT_LIST}"; then
		return ${UP_ST_NOUPDATE}
	fi

	if test -n "${UPDATED_LIST}"; then
		ECHO "# ----- Update module list -----"
		for pkg in ${UPDATED_LIST}; do
			ECHO "${pkg}"
			echo "${pkg}" >> ${UP_FILELIST_PATH}
		done
	fi

	if test -n "${UPDATED_SCRIPT_LIST}"; then
		ECHO "# ----- Update script list -----"
		for sf in ${UPDATED_SCRIPT_LIST}; do
			ECHO "${sf}"
			echo "${sf}" >> ${DL_SCRIPTLIST_PATH}
		done
	fi

	return ${UP_ST_OK}
}

#---------------------------------------------------------------------
# Update TeamFile for Linux
# if "updatemodule.sh" was found, we use this script for updating teamfile
#---------------------------------------------------------------------
update_teamfile_linux() {

	pushd ${DL_DIR_PATH} >/dev/null 2>&1

	STR_OPT=
	if test "${SILENT_MODE}" = 1; then
		STR_OPT="-s"
	fi

	SCRIPTLIST=
	if test -f ${DL_SCRIPTLIST_PATH}; then
		SCRIPTLIST=`cat ${DL_SCRIPTLIST_PATH}`
	fi
	R_SCRIPTLIST=
	#-----------------------------
	# (1) preinstall operation
	#-----------------------------
	for sf in ${SCRIPTLIST}; do
		if test ! -x $sf; then
			chmod a+x $sf
		fi
		# execute command
		./$sf -m ${UPSP_MODE_PREINSTALL} -d "${DL_DIR_PATH}" -u "${UP_FILELIST_PATH}" -p "${UP_SCRIPT_TMP_PATH}" ${STR_OPT} >> ${TF_UPLOG_PATH} 2>&1
		RETVAL=$?
		if test "${RETVAL}" != "0"; then
			ECHO "Failed to execute \"preinstall\" operation. (script = $sf)"
			for sf in ${R_SCRIPTLIST}; do
				./$sf -m ${UPSP_MODE_PREINSTALL} -d "${DL_DIR_PATH}" -u "${UP_FILELIST_PATH}" -p "${UP_SCRIPT_TMP_PATH}" -R ${STR_OPT} >> ${TF_UPLOG_PATH} 2>&1
			done
			return ${UP_ST_ERR}
		fi

		R_SCRIPTLIST="${R_SCRIPTLIST} $sf"
	done

	R_SCRIPTLIST=
	#-----------------------------
	# (2) install operation
	#-----------------------------
	for sf in ${SCRIPTLIST}; do

		if test ! -x $sf; then
			chmod a+x $sf
		fi
		# execute command
		./$sf -m ${UPSP_MODE_INSTALL} -d "${DL_DIR_PATH}" -u "${UP_FILELIST_PATH}" -p "${UP_SCRIPT_TMP_PATH}" ${STR_OPT} >> ${TF_UPLOG_PATH} 2>&1
		RETVAL=$?
		if test "${RETVAL}" != "0"; then
			ECHO "Failed to execute \"install\" operation. (script = $sf)"
			for sf in ${R_SCRIPTLIST}; do
				./$sf -m ${UPSP_MODE_INSTALL} -d "${DL_DIR_PATH}" -u "${UP_FILELIST_PATH}" -p "${UP_SCRIPT_TMP_PATH}" -R ${STR_OPT} >> ${TF_UPLOG_PATH} 2>&1
			done
			return ${UP_ST_ERR}
		fi

		R_SCRIPTLIST="${R_SCRIPTLIST} $sf"
	done

	FILELIST=`cat ${UP_FILELIST_PATH}`
	if test -n "${FILELIST}"; then
		_RPMLIST="${TMP_BASE_DIR}/__rpmlist"
		rpm -Uvh ${FILELIST} > ${_RPMLIST} 2>&1
		RETVAL=$?

		cat ${_RPMLIST} >> ${TF_UPLOG_PATH}
		if test ${SILENT_MODE} = 0; then
			cat ${_RPMLIST}
		fi
		rm -f ${_RPMLIST}
	fi
	if test "${RETVAL}" != "0"; then
		ECHO "Failed to update TeamFile server modules. "
		ECHO "Please check error message."
		return ${UP_ST_ERR}
	fi

	R_SCRIPTLIST=
	#-----------------------------
	# (3) postinstall operation
	#-----------------------------
	for sf in ${SCRIPTLIST}; do

		if test ! -x $sf; then
			chmod a+x $sf
		fi
		# execute command
		./$sf -m ${UPSP_MODE_POSTINSTALL} -d "${DL_DIR_PATH}" -u "${UP_FILELIST_PATH}" -p "${UP_SCRIPT_TMP_PATH}" ${STR_OPT} >> ${TF_UPLOG_PATH} 2>&1
		RETVAL=$?
		if test "${RETVAL}" != "0"; then
			ECHO "Failed to execute \"postinstall\" operation. (script = $sf)"
			for sf in ${R_SCRIPTLIST}; do
				./$sf -m ${UPSP_MODE_POSTINSTALL} -d "${DL_DIR_PATH}" -u "${UP_FILELIST_PATH}" -p "${UP_SCRIPT_TMP_PATH}" -R ${STR_OPT} >> ${TF_UPLOG_PATH} 2>&1
			done
			return ${UP_ST_ERR}
		fi

		R_SCRIPTLIST="${R_SCRIPTLIST} $sf"
	done

	popd >/dev/null 2>&1
	return ${UP_ST_OK}
}


#---------------------------------------------------------------------
# main
#---------------------------------------------------------------------
while getopts sIBd:b:lh OPT
do
	case $OPT in
		s)
			SILENT_MODE=1
			;;
		I)
			INTERACTIVE_MODE=0
			;;
		B)
			BACKUP_MODE=0
			;;
		d)
			DL_DIR_PATH="$OPTARG"
			;;
		b)
			BACKUP_BASE_DIR="$OPTARG"
			;;
		l)
			LOCAL_DOWNLOAD=1
			;;
		h)
			usage
			exit ${DL_ST_MISSING_PARAM}
			;;
		\?)
			usage
			exit ${DL_ST_MISSING_PARAM}
			;;
	esac
done
shift `expr $OPTIND - 1`

#---------------------------------------------------------------------
# (1) check parameters
#---------------------------------------------------------------------
# check ostype
getOsType
OSTYPE=$?
if test "${OSTYPE}" = "${OS_MACOSX102}" || \
   test "${OSTYPE}" = "${OS_MACOSX103}" || \
   test "${OSTYPE}" = "${OS_SOLARIS}"; then
	ECHO "Sorry, MacOSX or Solaris does not support this operation."
	exit ${UP_ST_NOTSUPPORTED}
fi
UNAME_S=`uname -s`

# check root privilege
isRootPrivilege
RETVAL=$?
if test "${RETVAL}" = "0"; then
	ECHO "Need to root privilege !"
	exit ${UP_ST_NOPRIVILEGE}
fi

# lock updater
if test "${SILENT_MODE}" = 0; then
	lockscript "${TFUPDATER_LOCKFILE}"
	RETVAL=$?
else
	lockscript "${TFUPDATER_LOCKFILE}" >> ${TF_UPLOG_PATH}
	RETVAL=$?
fi
if test "${RETVAL}" != "0"; then
	exit ${UP_ST_ALREADY_RUNNING}
fi

# check download path
if test ! -d "${DL_DIR_PATH}"; then
	ECHO "The path of downloaded modules was not valid directory."
	exitscript ${UP_ST_MISSING_PARAM}
fi

# check backup directory path
if test ${BACKUP_MODE} = 1; then
	if test -z "${BACKUP_BASE_DIR}"; then
		ECHO "The path of backupfiles is EMPTY."
		exitscript ${UP_ST_MISSING_PARAM}

	elif test "${BACKUP_BASE_DIR}" = "/"; then
		ECHO "The path of backupfiles MUST NOT be root."
		exitscript ${UP_ST_INVALID_PARAM}
	fi
fi

# check $TF_DOWNLOADER
if test ${LOCAL_DOWNLOAD} = 0 && test ! -x "$TF_DOWNLOADER"; then
	ECHO "$TF_DOWNLOADER is missing or not is executable."
	exitscript ${UP_ST_ERR}
fi

# check log file
if test ! -f "${TF_UPLOG_PATH}"; then
	touch ${TF_UPLOG_PATH}
fi

# check script temporary directory
if test ! -d "${UP_SCRIPT_TMP_PATH}"; then
	mkdir -p ${UP_SCRIPT_TMP_PATH}
fi

#---------------------------------------------------------------------
# (2) Download updated modules
#---------------------------------------------------------------------
# remove old download list and script list file
rm -f ${DL_FILELIST_PATH} ${DL_SCRIPTLIST_PATH}
touch ${DL_FILELIST_PATH} ${DL_SCRIPTLIST_PATH}

ECHO "# Download operation start"

OPT_STR=""
if test ${SILENT_MODE} != 0; then
	OPT_STR="-s"
fi

if test ${LOCAL_DOWNLOAD} = 0; then
	$TF_DOWNLOADER -d "${DL_DIR_PATH}" -f "${DL_FILELIST_PATH}" -e "${DL_SCRIPTLIST_PATH}" "${OPT_STR}"
	RETVAL=$?
	if test "${RETVAL}" != "${DL_ST_FOUND_LIST}"; then
		exitscript ${UP_ST_NOUPDATE}
	fi
else
	# missing $TF_MODULELIST_FILE (meta files)
	if test ! -f ${DL_DIR_PATH}/${TF_MODULELIST_FILE}; then
		exitscript ${UP_ST_NOUPDATE}
	fi

	PKGS=`cat ${DL_DIR_PATH}/${TF_MODULELIST_FILE} | sed -e '/^#/d' | cut -d, -s -f1`
	for f in ${PKGS}; do

		pkg="${DL_DIR_PATH}/$f"
		target_line=`cat ${DL_DIR_PATH}/${TF_MODULELIST_FILE} | sed -e '/^#/d' | sed -n -e  "/$f/p"`
		listed_md5=`echo ${target_line} | cut -d, -s -f2`
		listed_flag=`echo ${target_line} | cut -d, -s -f3`

		if test -f ${pkg}; then
			get_md5 ${pkg}
			if test "${MD5_DIGEST}" != "${listed_md5}"; then
				ECHO "Missmatch MD5 (file = $f, md5 = ${MD5_DIGEST}, listed md5 = ${listed_md5})"
				exitscript ${UP_ST_MISSMATCH_HASH}
			else
				build_status_line "Checking" "$f"
				ECHO "${DL_STATUS_LINE} ... ok"

				if test "${listed_flag}" = "s"; then
					echo "$f" >> ${DL_SCRIPTLIST_PATH}
				elif test "${listed_flag}" = "p"; then
					echo "$f" >> ${DL_FILELIST_PATH}
				fi
			fi
		fi
	done
fi

ECHO "# Download operation end"

#---------------------------------------------------------------------
# (3) allowing update operation ?
#---------------------------------------------------------------------
# load profile
load_profile "${DL_DIR_PATH}/${TF_PROFILE_FILE}"

# allowing update operation ?
if test ${TFSUP_EXECUTE_UPDATE} != "on"; then
	exitscript ${UP_ST_NOTALLOWED_UPDATE}
fi

#---------------------------------------------------------------------
# (4) check update
#---------------------------------------------------------------------
rm -f ${UP_FILELIST_PATH}
touch ${UP_FILELIST_PATH}

if test "${UNAME_S}" = "Linux"; then
	check_update_linux
fi
RETVAL=$?
if test "${RETVAL}" != "${UP_ST_OK}"; then
	ECHO "No need to update TeamFile."
	exitscript ${UP_ST_NOUPDATE}
fi

#---------------------------------------------------------------------
# (5) Stop Apache and PostgreSQL
#---------------------------------------------------------------------
_STATUS_FILE="${TMP_BASE_DIR}/__status"
isTeamFileRuning
RETVAL=$?
if test "${RETVAL}" = "1"; then
	STOP_APACHE=1
	stop_teamfile > ${_STATUS_FILE} 2>&1
	if test "${SILENT_MODE}" = 0; then
		cat ${_STATUS_FILE}
	fi
fi

isPostgreSQLRuning
RETVAL=$?
if test "${RETVAL}" = "1"; then
	STOP_POSTGRESQL=1
	stop_postgresql > ${_STATUS_FILE} 2>&1
	if test "${SILENT_MODE}" = 0; then
		cat ${_STATUS_FILE}
	fi
fi
rm -f ${_STATUS_FILE}

#---------------------------------------------------------------------
# (6) backup data
#---------------------------------------------------------------------
if test ${BACKUP_MODE} = 1; then

	ANS="y"
	if test ${INTERACTIVE_MODE} = 1; then
		echo ""
		$ECHO_N "Do you want to backup previous files before updating TeamFile ? (y/n) (default: y) : "$ECHO_C
		read ANS
	fi

	if test "${ANS}" != 'n'; then
		ECHO "Backup operation start."

		BACKUP_CONF_DIR="${BACKUP_BASE_DIR}/conf"
		BACKUP_BIN_DIR="${BACKUP_BASE_DIR}/binary"
		BACKUP_DATA_DIR="${BACKUP_BASE_DIR}/data"

		# remove old directory
		if test -d ${BACKUP_BASE_DIR}; then
			tmp=`echo ${BACKUP_BASE_DIR} | sed -e 's:[/]\+:/:g' -e '1s:/$::'`
			if test ${tmp} != "/"; then
				rm -rf ${BACKUP_BASE_DIR}
			fi
		fi

		# create backup directory
		if test ${INTERACTIVE_MODE} = 1; then
			create_backup_dir ${BACKUP_BASE_DIR} ${INTERACTIVE_MODE}
		else
			create_backup_dir ${BACKUP_BASE_DIR} >> ${TF_UPLOG_PATH}
		fi
		RETVAL=$?
		if test "${RETVAL}" != "0"; then
			ECHO "Failed to backup operation."
			send_status_mail
			exitscript ${UP_ST_BACKUP_FAIL}
		fi

		# backup configuration
		ECHO "Backup configuration. (${BACKUP_CONF_DIR})"
		if test ${INTERACTIVE_MODE} = 1; then
			backup_configuration ${BACKUP_CONF_DIR} ${INTERACTIVE_MODE}
		else
			backup_configuration ${BACKUP_CONF_DIR} >> ${TF_UPLOG_PATH}
		fi
		RETVAL=$?
		if test "${RETVAL}" != "0"; then
			ECHO "Failed to backup configuration."
			send_status_mail
			exitscript ${UP_ST_BACKUP_FAIL}
		fi

		# backup binary
		ECHO "Backup binary. (${BACKUP_BIN_DIR})"
		if test ${INTERACTIVE_MODE} = 1; then
			backup_binary ${BACKUP_BIN_DIR} ${INTERACTIVE_MODE}
		else
			backup_binary ${BACKUP_BIN_DIR} >> ${TF_UPLOG_PATH}
		fi
		RETVAL=$?
		if test "${RETVAL}" != "0"; then
			ECHO "Failed to backup binary."
			send_status_mail
			exitscript ${UP_ST_BACKUP_FAIL}
		fi

		# backup PostgreSQL data directory
		if test "${REPOS_DBTYPE}" = "pg"; then
			ECHO "Backup PostgreSQL data. (${BACKUP_DATA_DIR})"
			if test ${INTERACTIVE_MODE} = 1; then
				backup_pgdata_directory ${BACKUP_DATA_DIR} ${INTERACTIVE_MODE}
			else
				backup_pgdata_directory ${BACKUP_DATA_DIR} >> ${TF_UPLOG_PATH}
			fi
			RETVAL=$?
			if test "${RETVAL}" != "0"; then
				ECHO "Failed to backup binary."
				send_status_mail
				exitscript ${UP_ST_BACKUP_FAIL}
			fi
		fi
		ECHO "# Backup operation end."
	fi
fi

#---------------------------------------------------------------------
# (7) Update modules
#---------------------------------------------------------------------
if test ${INTERACTIVE_MODE} = 1; then
	$ECHO_N "Do you want to update TeamFile now ? (y/n) (default: n) : "$ECHO_C
	read ANS
	if test "${ANS}" != "y"; then
		echo "Ok, aborted."
		exitscript ${UP_ST_ABORT}
	fi
fi

if test "${UNAME_S}" = "Linux"; then
	update_teamfile_linux
fi
RETVAL=$?
if test "${RETVAL}" != "0"; then
	ECHO "Failed to update modules."
	send_status_mail
	exitscript ${RETVAL}
fi

#---------------------------------------------------------------------
# (8) Start Apache and PostgreSQL and exit
#---------------------------------------------------------------------
ECHO "Success."
send_status_mail
exitscript ${UP_ST_OK}


