#!/bin/sh

# Copyright (C) 2012 Wind River Systems, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA


WORK_DIR="/opt/lsb-test"

if [ `id -u` -ne 0 ]
then
	cat << EOF
	In order to install and run LSB testsuite, you need administrator privileges.
	You are currently running this script as an unprivileged user.

EOF
	exit 1
fi

ARCH=`uname -m`
if [ ${ARCH} != "i686" ] && [ ${ARCH} != "x86_64" ] && [ ${ARCH} != "ppc" ] && [ ${ARCH} != "ppc64" ]
then
	echo "Error: Unsupported architecture"
	exit 1
fi

which rpm
if [ $? -ne 0 ]
then
	echo "No rpm command found"
	exit 1
fi

RET=0

cd ${WORK_DIR} || exit 1
# Step 1: Download the LSB Packages
echo ""
echo "Download LSB packages..."
echo ""

if [ ! -e ./packages_list ]
then
	echo "Error: Could not find packages list" >&2
	exit 1
fi

. ./packages_list

PACKAGES_DIR="/var/opt/lsb/test/manager/packages/ftp.linuxfoundation.org/pub/lsb"

BASE_PACKAGES_DIR="${PACKAGES_DIR}/base/${LSB_RELEASE}/binary"
RUNTIME_BASE_PACKAGES_DIR="${PACKAGES_DIR}/test_suites/released-all/binary/runtime"
RUNTIME_PACKAGES_DIR="${PACKAGES_DIR}/test_suites/${LSB_RELEASE}/binary/runtime"
APP_PACKAGES_DIR="${PACKAGES_DIR}/app-battery/${LSB_RELEASE}/${LSB_ARCH}"
APP_TESTFILES_DIR="${PACKAGES_DIR}/app-battery/tests"
SNAPSHOTS_TESTFILES_DIR="${PACKAGES_DIR}/snapshots/appbat/tests"

if [ ! -d ${PACKAGES_DIR} ]
then
	mkdir -p ${PACKAGES_DIR}
fi

if [ ! -d ${BASE_PACKAGES_DIR} ]
then
	mkdir -p ${BASE_PACKAGES_DIR}
fi

if [ ! -d ${RUNTIME_BASE_PACKAGES_DIR} ]
then
	mkdir -p ${RUNTIME_BASE_PACKAGES_DIR}
fi

if [ ! -d ${RUNTIME_PACKAGES_DIR} ]
then
	mkdir -p ${RUNTIME_PACKAGES_DIR}
fi

if [ ! -d ${APP_PACKAGES_DIR} ]
then
	mkdir -p ${APP_PACKAGES_DIR}
fi

if [ ! -d ${APP_TESTFILES_DIR} ]
then
	mkdir -p ${APP_TESTFILES_DIR}
fi

# Official download server list. You can replace them with your own server.
SERVER_IPADDR="140.211.169.23"
SERVER_NAME="ftp.linuxfoundation.org"

if ! `grep -F -q "${SERVER_NAME}" /etc/hosts`; then
	echo "${SERVER_IPADDR}	${SERVER_NAME}	${SERVER_NAME}" >> /etc/hosts
fi

#ping -c 5 ${SERVER_NAME}
#if [ $? -ne 0 ]
#then
#	echo "The server: ${SERVER_NAME} is unreachable"
#	exit 1
#fi

SERVER1="\
	http://${SERVER_NAME}/pub/lsb/base/released-all/binary"	
SERVER2="\
	http://${SERVER_NAME}/pub/lsb/test_suites/released-all/binary/runtime"
SERVER3="\
	http://${SERVER_NAME}/pub/lsb/test_suites/${LSB_RELEASE}/binary/runtime"
SERVER4="\
	http://${SERVER_NAME}/pub/lsb/app-battery/${LSB_RELEASE}/${LSB_ARCH}"
SERVER5="\
	http://${SERVER_NAME}/pub/lsb/app-battery/tests"

# We using "curl" as a download tool, "wget" is an alternative.
CURL=`which curl`
WGET=`which wget`
if [ ! -z ${CURL} ]
then
	DOWNLOAD_CMD="${CURL} -R -L -f --retry 3 --retry-delay 4 --connect-timeout 180 --compressed -C - -o"
elif [ ! -z ${WGET} ]
then
	DOWNLOAD_CMD="${WGET} -c -t 5 -O"
else
	echo "Can not find a download tool, please install curl or wget."
	exit 1
fi

cd ${BASE_PACKAGES_DIR}
for pkg in ${BASE_PACKAGES_LIST}; do
	if [ ! -f ${pkg} ]
	then
		#${DOWNLOAD_CMD} ${pkg}".#part" ${SERVER1}/${pkg} > /dev/null 2>&1
		${DOWNLOAD_CMD} ${pkg}".#part" ${SERVER1}/${pkg}
		if [ $? -eq 0 ]
		then
			mv -f ${pkg}".#part" ${pkg}
			echo "Download ${pkg} successfully."
		else
			echo "Download ${pkg} failed."
			RET=1
		fi
	fi
done

cd ${RUNTIME_BASE_PACKAGES_DIR}
for pkg in ${RUNTIME_BASE_PACKAGES_LIST}; do
	if [ ! -f ${pkg} ]
	then
		#${DOWNLOAD_CMD} ${pkg}".#part" ${SERVER2}/${pkg} > /dev/null 2>&1
		${DOWNLOAD_CMD} ${pkg}".#part" ${SERVER2}/${pkg}
		if [ $? -eq 0 ]
		then
			mv -f ${pkg}".#part" ${pkg}
			echo "Download ${pkg} successfully."
		else
			echo "Download ${pkg} failed."
			RET=1
		fi
	fi
done

cd ${RUNTIME_PACKAGES_DIR}
for pkg in ${RUNTIME_PACKAGES_LIST}; do
	if [ ! -f ${pkg} ]
	then
		#${DOWNLOAD_CMD} ${pkg}".#part" ${SERVER3}/${pkg} > /dev/null 2>&1
		${DOWNLOAD_CMD} ${pkg}".#part" ${SERVER3}/${pkg}
		if [ $? -eq 0 ]
		then
			mv -f ${pkg}".#part" ${pkg}
			echo "Download ${pkg} successfully."
		else
			echo "Download ${pkg} failed."
			RET=1
		fi
	fi
done

cd ${APP_PACKAGES_DIR}
for pkg in ${APP_PACKAGES_LIST}; do
	if [ ! -f ${pkg} ]
	then
		#${DOWNLOAD_CMD} ${pkg}".#part" ${SERVER4}/${pkg} > /dev/null 2>&1
		${DOWNLOAD_CMD} ${pkg}".#part" ${SERVER4}/${pkg}
		if [ $? -eq 0 ]
		then
			mv -f ${pkg}".#part" ${pkg}
			echo "Download ${pkg} successfully."
		else
			echo "Download ${pkg} failed."
			RET=1
		fi
	fi
done

cd ${APP_TESTFILES_DIR}
for pkg in ${APP_TESTFILES_LIST}; do
	if [ ! -f ${pkg} ]
	then
		#${DOWNLOAD_CMD} ${pkg}".#part" ${SERVER5}/${pkg} > /dev/null 2>&1
		${DOWNLOAD_CMD} ${pkg}".#part" ${SERVER5}/${pkg}
		if [ $? -eq 0 ]
		then
			mv -f ${pkg}".#part" ${pkg}
			echo "Download ${pkg} successfully."
		else
			echo "Download ${pkg} failed."
			RET=1
		fi
	fi
done

if [ ${RET} -ne 0 ]
then
	echo "Download some packages failed. Please download them again."
	exit 1
fi

# Step 2: Install the LSB Packages
echo ""
echo "Install LSB packages..."
echo ""

# Kill lighttpd
ps aux | grep "lighttpd" | grep -v -q "grep"
if [ $? -eq 0 ]
then
	killall lighttpd >/dev/null 2>&1
fi

# Start avahi-daemon
ps aux | grep "avahi-daemon" | grep -v -q "grep"
if [ $? -ne 0 ]
then
	/etc/init.d/avahi-daemon start >/dev/null 2>&1
fi

LSB_START_CMD="/opt/lsb/test/manager/bin/dist-checker-start.pl"
LSB_STOP_CMD="/opt/lsb/test/manager/bin/dist-checker-stop.pl"

PLATFORM_FILE="/etc/rpm/platform"

RPM_INSTALL_CMD="rpm --quiet --nodeps --replacepkgs --nosignature -i --ignoreos"
RPM_INSTALL_CMD_NOSCRIPTS="rpm --quiet --nodeps --replacepkgs --noscripts --nosignature -i --ignoreos"

# If the lsb has been started, stop it first.
if [ -x ${LSB_STOP_CMD} ]
then
	${LSB_STOP_CMD}
fi

if [ ! -d /etc/rpm ]
then
	mkdir -p /etc/rpm
fi

if [ ! -f ${PLATFORM_FILE} ]
then
	touch ${PLATFORM_FILE}
fi

if ! `grep -F -q "noarch-suse" ${PLATFORM_FILE}`; then
	if [ ${ARCH} = i686 ];then
		echo "i486-suse" >> ${PLATFORM_FILE}
		echo "i486-noarch" >> ${PLATFORM_FILE}
		echo "i486-pc" >> ${PLATFORM_FILE}
		echo "noarch-suse" >> ${PLATFORM_FILE}
	elif [ ${ARCH} = x86_64 ]; then
		echo "i486-suse" >> ${PLATFORM_FILE}
		echo "i486-noarch" >> ${PLATFORM_FILE}
		echo "i486-pc" >> ${PLATFORM_FILE}
		echo "i486-.*-linux.*" >> ${PLATFORM_FILE}
		echo "noarch-suse" >> ${PLATFORM_FILE}
		echo "${ARCH}-suse" >> ${PLATFORM_FILE}
		echo "${ARCH}-noarch" >> ${PLATFORM_FILE}
		echo "${ARCH}-pc" >> ${PLATFORM_FILE}
	else
		echo "${ARCH}-suse" >> ${PLATFORM_FILE}
		echo "${ARCH}-noarch" >> ${PLATFORM_FILE}
		echo "${ARCH}-pc" >> ${PLATFORM_FILE}
		echo "noarch-suse" >> ${PLATFORM_FILE}
	fi
fi

if [ -d ${BASE_PACKAGES_DIR} ]
then
	cd ${BASE_PACKAGES_DIR}
	for pkg in ${BASE_PACKAGES_LIST}
	do
		rpm --quiet -q ${pkg%\.*}
		if [ $? -ne 0 ]; then
			$RPM_INSTALL_CMD ${pkg}
		fi
	done
fi

if [ -d ${RUNTIME_BASE_PACKAGES_DIR} ]
then
	cd ${RUNTIME_BASE_PACKAGES_DIR}
	for pkg in ${RUNTIME_BASE_PACKAGES_LIST}
	do
		rpm --quiet -q ${pkg%\.*}
		if [ $? -ne 0 ]; then
			$RPM_INSTALL_CMD ${pkg}
		fi
	done
fi

if [ -d ${RUNTIME_PACKAGES_DIR} ]
then
	cd ${RUNTIME_PACKAGES_DIR}
	for pkg in ${RUNTIME_PACKAGES_LIST}
	do
		rpm --quiet -q ${pkg%\.*}
		if [ $? -ne 0 ]; then
			$RPM_INSTALL_CMD ${pkg}
		fi
	done
fi

if [ -d ${APP_PACKAGES_DIR} ]
then
	cd ${APP_PACKAGES_DIR}
	for pkg in ${APP_PACKAGES_LIST}
	do
		echo "${pkg}" | grep -q "apache\|xpdf"
		if [ $? -eq 0 ]
		then
			rpm --quiet -q ${pkg%\.*}
			if [ $? -ne 0 ]; then
				$RPM_INSTALL_CMD_NOSCRIPTS ${pkg}
			fi
		else
			rpm --quiet -q ${pkg%\.*}
			if [ $? -ne 0 ]; then
				$RPM_INSTALL_CMD ${pkg}
			fi
		fi
	done
fi

if [ ! -d ${SNAPSHOTS_TESTFILES_DIR} ]
then
	mkdir -p ${SNAPSHOTS_TESTFILES_DIR}
fi

if [ -d ${APP_TESTFILES_DIR} ]
then
	cd ${APP_TESTFILES_DIR}
	for pkg in ${APP_TESTFILES_LIST}
	do
		cp -f ${pkg} ${SNAPSHOTS_TESTFILES_DIR}
	done
fi

cd ${WORK_DIR}

# Step 3: Set environment
echo ""
echo "Set environment..."
echo ""

check ()
{
	if [ $? -eq 0 ]
	then
		echo "PASS"
	else 
		echo "FAIL"
		exit 1
	fi
}

echo ""
echo "---------------------------------"
echo "Create the Dirnames on target"

if [ ! -d /etc/rpm/sysinfo ]
then
	mkdir -p /etc/rpm/sysinfo
fi

cat > /etc/rpm/sysinfo/Dirnames << EOF
/etc/opt/lsb
/home/tet/LSB.tools
/opt/lsb-tet3-lite/lib/ksh
/opt/lsb-tet3-lite/lib/perl
/opt/lsb-tet3-lite/lib/posix_sh
/opt/lsb-tet3-lite/lib/tet3
/opt/lsb-tet3-lite/lib/xpg3sh
/opt/lsb/appbat/lib/python2.4/site-packages/qm
/opt/lsb/appbat/lib/python2.4/site-packages/qm/external
/opt/lsb/appbat/lib/python2.4/site-packages/qm/external/DocumentTemplate
/opt/lsb/appbat/lib/python2.4/site-packages/qm/test
/opt/lsb/appbat/lib/python2.4/site-packages/qm/test/classes
/opt/lsb/appbat/lib/python2.4/site-packages/qm/test/web
/opt/lsb/test/doc
/opt/lsb/test/lib
/opt/lsb/test/qm/diagnostics
/opt/lsb/test/qm/doc
/opt/lsb/test/qm/doc/test/html
/opt/lsb/test/qm/doc/test/print
/opt/lsb/test/qm/dtml
/opt/lsb/test/qm/dtml/test
/opt/lsb/test/qm/messages/test
/opt/lsb/test/qm/tutorial/test/tdb
/opt/lsb/test/qm/tutorial/test/tdb/QMTest
/opt/lsb/test/qm/web
/opt/lsb/test/qm/web/images
/opt/lsb/test/qm/web/stylesheets
/opt/lsb/test/qm/xml
/opt/lsb/test/share
/usr/share/doc/lsb-runtime-test
/var/opt/lsb
/opt/lsb/test/desktop
/opt/lsb/test/desktop/fontconfig
/opt/lsb/test/desktop/freetype
/opt/lsb/test/desktop/gtkvts
/opt/lsb/test/desktop/libpng
/opt/lsb/test/desktop/xft
/opt/lsb/test/desktop/xml
/opt/lsb/test/desktop/xrender


EOF

if [ -f /etc/rpm/sysinfo/Dirnames ]
then
	echo "Success to creat Dirnames file"
else 
	echo "Fail to creat Dirnames file"
fi

[ -x /sbin/ldconfig ] && {
echo ""
echo "---------------------------------"
echo "Update cache"
/sbin/ldconfig
check;
}

# Check loop device
if [ ! -b /dev/loop0 ]
then
	insmod /lib/modules/`uname -r`/kernel/drivers/block/loop.ko
	if [ $? != 0 ];then
		echo "Insmod loop.ko failed."
	fi
fi

# Resolve localhost
LOCALHOST=`hostname`
if ! `grep -F -q "$LOCALHOST" /etc/hosts`; then
	echo "127.0.0.1	$LOCALHOST" >> /etc/hosts
fi

# Workaround to add part of locales for LSB test
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE -f ISO-8859-15 de_DE.ISO-8859-15
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-15 en_US.ISO-8859-15
localedef -i en_US -f ISO-8859-1 en_US.ISO-8859-1
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i en_US -f ISO-8859-1 en_US.ISO8859-1
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i ja_JP -f EUC-JP ja_JP.eucjp
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN
localedef -i es_ES -f ISO-8859-1 es_ES
localedef -i fr_FR@euro -f ISO-8859-1 fr_FR@euro
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i zh_TW -f BIG5 zh_TW.BIG5
localedef -i en_US -f ISO-8859-15 en_US.ISO-8859-15

echo ""
echo "Installation done!"
echo ""

# Step 4: Start LSB test
if [ -x ${LSB_START_CMD} ]
then
	${LSB_START_CMD}
fi

echo "---------------------------------"
echo "Run all the certification version of LSB Tests"
echo "---------------------------------"

LSB_DIST_CHECKER="/opt/lsb/test/manager/utils/dist-checker.pl"
SESSION="${WORK_DIR}/session"
if [ ! -e ${SESSION} ]
then
	echo "Error: Could not find session file."
	echo "You must run LSB test from webbrower."
	exit 1
fi

if [ -x ${LSB_DIST_CHECKER} ]
then
	${LSB_DIST_CHECKER} -v2 -f ${SESSION}
	check
fi

echo ""
echo "LSB test complete. Please check the log file in /var/opt/lsb/test/manager/results/"
echo ""

