#!/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/released-all/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.28"
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 ""

