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
|