summaryrefslogblamecommitdiffstats
path: root/installer/slxossetup
blob: c74033b51a55f28d6f5e417e8ef6758044d21cf8 (plain) (tree)


























                                                                





                                                                              






                                                                            
                         














































                                                                                        

























                                                                                            
 






                                                                                      
 


                                                                       
                                                                                     




                                                      
 





                                                                                   
 












                                                                                 




                                                                      



                                                 
 




                                                                              







                                                          




                                        




                                                                                


                                      







                                                                            
#! /bin/bash
#
# slxossetup - OpenSLX script for OS setup
#
# (c) 2006 - OpenSLX.com
#
# Lars Müller <lm@openslx.com>
#

: ${SLX_CONFIG_PATH:=/etc/opt/openslx}
: ${SLX_PRIVATE_PATH:=/var/opt/openslx}

SLX_SYSTEM_NAME=$1
test "$2" && \
	SLX_OSSETUP_MODE=$2 ||
	SLX_OSSETUP_MODE="install"

PATH="/bin:/usr/bin"

if test -z "${SLX_SYSTEM_NAME}"; then
	echo "$0: Error, <system-name> not provided! "
	exit 1
fi
SLX_SYSTEM_BASENAME="${SLX_SYSTEM_NAME%%-*}"
SLX_SYSTEM_VARIANTNAME="${SLX_SYSTEM_NAME##*-}"
test "${SLX_SYSTEM_VARIANTNAME}" = "${SLX_SYSTEM_BASENAME}" && \
	unset SLX_SYSTEM_VARIANTNAME
for dir in . ${SLX_CONFIG_PATH}; do
	if test -d "${dir}/systems/${SLX_SYSTEM_BASENAME}"; then
		SLX_SYSTEM_CONFIG_PATH="${dir}/systems/${SLX_SYSTEM_BASENAME}"
		break
	fi
done

# Read config files for a particular system
for suffix in "" local ${SLX_SYSTEM_VARIANTNAME}; do
	test -f "${SLX_SYSTEM_CONFIG_PATH}/settings${suffix:+.$suffix}" && \
		. "${SLX_SYSTEM_CONFIG_PATH}/settings${suffix:+.$suffix}"
done

function slxossetup_rpm()
{
	SLX_METADATA_PATH="${SLX_PRIVATE_PATH}/metadata/${SLX_SYSTEM_NAME}"
	SLX_STAGE1_PATH="${SLX_PRIVATE_PATH}/stage1/${SLX_SYSTEM_NAME}"

	for dir in ${SLX_METADATA_PATH} ${SLX_STAGE1_PATH}; do
		if test -d "${dir}"; then
			echo "$0: Error, ${dir} already exists! "
			exit 1
		fi
	done

	smart --data-dir="${SLX_METADATA_PATH}" \
		config \
		--set \
		rpm-root="${SLX_STAGE1_PATH}"

	for variable in ${!SLX_INST_SOURCE_BASEURL_*}; do
		# Unset SMART_* to let smart fail if they are not set for a particular
		# channel; unset PACKAGEKEYS to prevent adding them multiple times.
		unset SMART_NAME SMART_TYPE PACKAGEKEYS
		SMART_CHANNEL="${variable##*_}"
		SMART_BASEURL=$( eval echo \$$variable)
		SMART_NAME=$( eval echo \$SLX_INST_SOURCE_NAME_${SMART_CHANNEL})
		SMART_TYPE=$( eval echo \$SLX_INST_SOURCE_TYPE_${SMART_CHANNEL})
		PACKAGEKEYS=$( eval echo \$SLX_INST_SOURCE_PACKAGEKEYS_${SMART_CHANNEL})

		smart --data-dir="${SLX_METADATA_PATH}" \
			channel \
			--add "${SMART_CHANNEL}" \
			name="${SMART_NAME}" \
			type="${SMART_TYPE}" \
			baseurl=${SMART_BASEURL} \
			-y

		for packagekey in ${PACKAGEKEYS}; do
			case "${packagekey}" in
				*/*) ;;
				*) packagekey="${SMART_BASEURL}/${packagekey}" ;;
			esac
			rpm --root="${SLX_STAGE1_PATH}" \
				--import "${packagekey}"
		done
	done

	smart --data-dir="${SLX_METADATA_PATH}" \
		update

	if test "${SLX_BASE_PREREQ_PACKAGES}"; then
		# Download and unpack prerequired packages before any package installation
		SLX_PACKAGE_PATH="${SLX_METADATA_PATH}/packages"
		TMP_DIR=$( mktemp -d "${SLX_METADATA_PATH}/packages.XXXXXXXX")
		if test $? -ne 0; then
			echo "$0: Warning, can not create temp package download directory! "
			echo "    Using ${SLX_PACKAGE_DOWNLOAD_PATH} instead. "
			SLX_PACKAGE_DOWNLOAD_PATH="${SLX_PACKAGE_PATH}"
		else
			SLX_PACKAGE_DOWNLOAD_PATH="${TMP_DIR}"
		fi
		test -d "${SLX_PACKAGE_DOWNLOAD_PATH}" || \
			mkdir -p "${SLX_PACKAGE_DOWNLOAD_PATH}"
		pushd "${SLX_PACKAGE_DOWNLOAD_PATH}" >/dev/null
		smart --data-dir="${SLX_METADATA_PATH}" \
			download \
			"${SLX_BASE_PREREQ_PACKAGES}"
		popd >/dev/null

		test -d "${SLX_STAGE1_PATH}" || \
			mkdir -p "${SLX_STAGE1_PATH}"
		pushd "${SLX_STAGE1_PATH}" >/dev/null
		for package in ${SLX_BASE_PREREQ_PACKAGES}; do
			rpm2cpio ${SLX_PACKAGE_DOWNLOAD_PATH}/${package}-*.rpm | \
				cpio -i --make-directories
		done

		# Move package from temp to package dir.
		if test "${SLX_PACKAGE_DOWNLOAD_PATH}" != "${SLX_PACKAGE_PATH}"; then
			test -d "${SLX_PACKAGE_PATH}" || \
				mkdir -p "${SLX_PACKAGE_PATH}"
			mv "${SLX_PACKAGE_DOWNLOAD_PATH}/"*.rpm "${SLX_PACKAGE_PATH}/"
			rmdir "${SLX_PACKAGE_DOWNLOAD_PATH}"
		fi

		# Cleanup etc to prevent .rpnnew files
		if test "${SLX_BASE_PREREQ_CLEANUP_PATH}"; then
			for path in ${SLX_BASE_PREREQ_CLEANUP_PATH}; do
				find "${SLX_STAGE1_PATH}/${path}" -type f -print0 | \
					xargs -0 rm -f
			done
		fi
		popd >/dev/null
	fi

	# Install prerequired files
	cp -a "${SLX_SYSTEM_CONFIG_PATH}"/prereqfiles/* "${SLX_STAGE1_PATH}"
	find "${SLX_STAGE1_PATH}" -type d -name .svn -print0 | \
		xargs -0 rm -rf
	test -x "${SLX_SYSTEM_CONFIG_PATH}"/scripts/postprereq && \
		"${SLX_SYSTEM_CONFIG_PATH}"/scripts/postprereq "${SLX_STAGE1_PATH}"

	for file in ${SLX_INSTALL_FAKE_FILE}; do
		dir="${file%/*}"
		test -d "${SLX_STAGE1_PATH}/${dir}" || \
			mkdir -p "${SLX_STAGE1_PATH}/${dir}"
		touch "${SLX_STAGE1_PATH}/${file}"
	done

	for mountpoint in ${SLX_INSTALL_BIND_MOUNT}; do
		test -d "${SLX_STAGE1_PATH}/${mountpoint}" || \
			mkdir -p "${SLX_STAGE1_PATH}/${mountpoint}"
		mount -o bind "/${mountpoint}" "${SLX_STAGE1_PATH}/${mountpoint}"
	done

	unset packagelist
	for variable in ${!SLX_INSTALL_PACKAGES_*}; do
		packagelist="${packagelist} $( eval echo \$$variable)"
	done

	smart --data-dir="${SLX_METADATA_PATH}" \
		install \
		${packagelist} \
		-y

	# Move any .rpmnew file to the right name
	for file in $( find "${SLX_STAGE1_PATH}" -type f -name '*.rpmnew'); do
		mv "${file}" "${file%.rpmnew}"
	done

	for mountpoint in ${SLX_INSTALL_BIND_MOUNT}; do
		umount "${SLX_STAGE1_PATH}/${mountpoint}"
	done
	
	for file in ${SLX_INSTALL_FAKE_FILE}; do
		test -s "${SLX_STAGE1_PATH}/${file}" || \
			rm -f "${SLX_STAGE1_PATH}/${file}"
	done
}

function slxossetup()
{
	case "${SLX_SYSTEM_BASENAME}" in
		*suse*)
			# Inform SUSE RPMs that we're performing an installation
			export YAST_IS_RUNNING="instsys"
			slxossetup_rpm
			;;
		*fedora*)
			slxossetup_rpm
			;;
		*) echo "$0: Error, unkown system ${SLX_SYSTEM_BASENAME}" ;;
	esac
}

case "${SLX_OSSETUP_MODE}" in
	install) slxossetup ;;
	*) echo "Usage: $0 system-name [install]" ;;
esac