summaryrefslogblamecommitdiffstats
path: root/installer/slxossetup
blob: 25bfa523953ff33c9bbb69132c397c1fcdcba57e (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"

for binary in smart; do
	if ! type -p "${binary}" >/dev/null; then
		echo "$0: Error, required binary, ${binary} not found in PATH, ${PATH}! "
		exit 1
	fi
done

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_smart()
{
	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 \
		"${NAME_DEST_ROOT}"="${SLX_STAGE1_PATH}"

	for variable in ${!SLX_INST_SOURCE_NAME_*}; 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_COMPONENTS \
			SMART_DISTRIBUTION \
			SMART_NAME \
			SMART_TYPE \
			PACKAGEKEYS

		SMART_CHANNEL="${variable##*_}"
		SMART_BASEURL=$( eval echo \$SLX_INST_SOURCE_BASEURL_${SMART_CHANNEL})
		SMART_NAME=$( eval echo \$$variable)
		test "${SMART_NAME}" || \
			SMART_NAME="${SMART_CHANNEL}"

		SMART_TYPE=$( eval echo \$SLX_INST_SOURCE_TYPE_${SMART_CHANNEL})
		# Use default repo type if not available from settings config file
		test "${SMART_TYPE}" || \
			SMART_TYPE="${REPO_TYPE}"

		# Has this config distribution, components
		SMART_DISTRIBUTION=$( eval echo \$SLX_INST_SOURCE_DISTRIBUTION_${SMART_CHANNEL})
		SMART_COMPONENTS=$( eval echo \$SLX_INST_SOURCE_COMPONENTS_${SMART_CHANNEL})
		# Check if one of our global settings is still undefined
		for setting in ${GLOBAL_SETTINGS}; do
			test $( eval echo \$SMART_${setting}) || \
				eval SMART_${setting}=\$SLX_INST_SOURCE_${setting}
		done

		# Prefix the config name for optional parameters
		test "${SMART_DISTRIBUTION}" && \
		SMART_DISTRIBUTION="distribution=\"${SMART_DISTRIBUTION}\""
		test "${SMART_COMPONENTS}" && \
			SMART_COMPONENTS="components=\"${SMART_COMPONENTS}\""

		PACKAGEKEYS=$( eval echo \$SLX_INST_SOURCE_PACKAGEKEYS_${SMART_CHANNEL})

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

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

	for path in ${SLX_STAGE1_CREATE_DIR}; do
		mkdir -p "${SLX_STAGE1_PATH}/${path}"
	done
	for file in ${SLX_STAGE1_CREATE_FILE}; do
		touch "${SLX_STAGE1_PATH}/${file}"
	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
	if test -d "${SLX_SYSTEM_CONFIG_PATH}/prereqfiles"; then
		cp -a "${SLX_SYSTEM_CONFIG_PATH}"/prereqfiles/* "${SLX_STAGE1_PATH}"
		find "${SLX_STAGE1_PATH}" -type d -name .svn -print0 | \
			xargs -0 rm -rf
	fi
	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"
			REPO_TYPE="rpm-md"
			NAME_DEST_ROOT="rpm-root"
			slxossetup_smart
			;;
		*fedora*)
			REPO_TYPE="rpm-md"
			NAME_DEST_ROOT="rpm-root"
			slxossetup_smart
			;;
		*ubuntu*)
			GLOBAL_SETTINGS="BASEURL COMPONENTS"
			REPO_TYPE="apt-deb"
			NAME_DEST_ROOT="deb-root"
			SLX_STAGE1_CREATE_DIR="/var/lib/dpkg/updates"
			SLX_STAGE1_CREATE_FILE="/var/lib/dpkg/available /var/lib/dpkg/status"
			slxossetup_smart
			;;
		*) echo "$0: Error, unkown system ${SLX_SYSTEM_BASENAME}" ;;
	esac
}

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