
This update implements the following 4 changes 1. Stop miniboot kickstart from fetching the software repo from the system controller on a local install. 2. Moves the patch Packages, repodata and metadata fetch so that it is done for both local and remote install modes. 3. Fixes prestaging parsing to handle the case where the prestaging dir is completely empty. It was not handling the 'for file in *' properly when empty. 4. Add braces around the wlog $KS prefix. Test Plan: Testing In Progress PASS: Verify Local install does not download the sw repo from sc PASS: Verify Remote install does download the sw repo from sc PASS: Verify subcloud patching for both local and remote install PASS: Verify Miniboot logging PASS: Verify prestage dir handling - no files - bad images check - bad iso image check - no iso found - valid prestaging Change-Id: I2858deb5d18d646f46799b1d850777e4bb2f88a6 Story: 2009291 Task: 43864 Signed-off-by: Eric MacDonald <eric.macdonald@windriver.com>
367 lines
12 KiB
INI
367 lines
12 KiB
INI
%pre --erroronfail
|
|
|
|
# Source common functions
|
|
. /tmp/ks-functions.sh
|
|
|
|
SW_VERSION=xxxPLATFORM_RELEASExxx
|
|
STAGING_DIR="platform-backup"
|
|
BACKUP_PART_LABEL=Platform\\x20Backup
|
|
BACKUP_DEVICE=/dev/disk/by-partlabel/${BACKUP_PART_LABEL}
|
|
BACKUP_MOUNT=/mnt/${STAGING_DIR}
|
|
BOOTIMAGE_ISO=""
|
|
BOOTIMAGE_MOUNT=/mnt/bootimage
|
|
KS="Miniboot pre:"
|
|
|
|
wlog "${KS} local install check"
|
|
|
|
image=false
|
|
check=true
|
|
# Look for and validate the local iso image
|
|
if [ -e ${BACKUP_DEVICE} ]; then
|
|
mkdir -p ${BACKUP_MOUNT}
|
|
mount ${BACKUP_DEVICE} ${BACKUP_MOUNT} 2>/dev/null
|
|
rc=$?
|
|
if [ $rc -eq 0 ] ; then
|
|
sleep 2
|
|
# does the prestaging dir for the specified sw version exist
|
|
if [ -d "${BACKUP_MOUNT}/${SW_VERSION}" ] ; then
|
|
|
|
# are there files in it ?
|
|
if [ "$(ls -A ${BACKUP_MOUNT}/${SW_VERSION})" ] ; then
|
|
|
|
# change to prestaging dir and load the file names
|
|
cd ${BACKUP_MOUNT}/${SW_VERSION}
|
|
|
|
# loop over the files if there are any
|
|
for file in $(ls -A .) ; do
|
|
filename="${file%.*}"
|
|
extension="${file##*.}"
|
|
wlog "${KS} prestaged file : ${file}"
|
|
if [ "${extension}" = "md5" ] ; then
|
|
md5sum -c "${file}"
|
|
if [ $? -eq 0 ] ; then
|
|
wlog "${KS} ${filename} check passed"
|
|
else
|
|
wlog "${KS} ${filename} check failed"
|
|
check=false
|
|
|
|
fi
|
|
elif [ "${extension}" = "iso" ] ; then
|
|
# found the iso name for the mount operation below
|
|
BOOTIMAGE_ISO=${BACKUP_MOUNT}/${SW_VERSION}/${file}
|
|
wlog "${KS} found prestaged iso image ${BOOTIMAGE_ISO}"
|
|
image=true
|
|
fi
|
|
done
|
|
else
|
|
wlog "${KS} no prestaged files"
|
|
fi
|
|
else
|
|
wlog "${KS} Error: ${BACKUP_MOUNT} not mounted"
|
|
fi
|
|
|
|
if [ "${check}" = true ] ; then
|
|
if [ "${image}" = true -a "${BOOTIMAGE_ISO}" != "" ]; then
|
|
wlog "${KS} local iso found : ${BOOTIMAGE_ISO}"
|
|
mkdir -p ${BOOTIMAGE_MOUNT}
|
|
mount -o loop ${BOOTIMAGE_ISO} ${BOOTIMAGE_MOUNT}
|
|
wlog "${KS} local iso mounted for local install"
|
|
else
|
|
wlog "${KS} local iso file not found"
|
|
fi
|
|
else
|
|
wlog "${KS} local install rejected due to validity check error"
|
|
fi
|
|
else
|
|
wlog "${KS} mount of ${BACKUP_DEVICE} to ${BACKUP_MOUNT} failed rc:$rc"
|
|
fi
|
|
else
|
|
wlog "${KS} backup device ${BACKUP_DEVICE} does not exist"
|
|
fi
|
|
|
|
#
|
|
# This controls where the packages come from.
|
|
# Lower cost has higher priority ; making local install preferred.
|
|
#
|
|
# If ${BOOTIMAGE_MOUNT} exists then install from local iso - Local Install
|
|
# Otherwise, they are fetched from the System Controller - Remote Install
|
|
#
|
|
cat << EOF > /tmp/repo-include
|
|
repo --name=local-base --cost=100 --baseurl=file://${BOOTIMAGE_MOUNT}/
|
|
repo --name=local-updates --cost=100 --baseurl=file://${BOOTIMAGE_MOUNT}/patches/
|
|
repo --name=remote-base --cost=200 --baseurl=xxxHTTP_URLxxx/
|
|
repo --name=remote-updates --cost=200 --baseurl=xxxHTTP_URLxxx/patches/
|
|
EOF
|
|
%end
|
|
|
|
# Repository arguments from %pre
|
|
%include /tmp/repo-include
|
|
|
|
|
|
%post --erroronfail
|
|
|
|
# Source common functions
|
|
. /tmp/ks-functions.sh
|
|
|
|
KS="Miniboot post:"
|
|
|
|
# wlog "${KS} cmdLine: $(cat /proc/cmdline)"
|
|
if [ -e /dev/disk/by-label/oe_iso_boot ]; then
|
|
# This is a hybrid ISO/network install. Mount the media to ensure Anaconda
|
|
# ejects it on reboot.
|
|
mkdir /mnt/iso
|
|
wlog "${KS} mount for eject"
|
|
mount /dev/disk/by-label/oe_iso_boot /mnt/iso
|
|
else
|
|
wlog "${KS} /dev/disk/by-label/oe_iso_boot does not exist"
|
|
fi
|
|
|
|
# persist the default http port number to platform configuration. This
|
|
# will get overwritten when config_controller is run.
|
|
echo http_port=8080 >> /etc/platform/platform.conf
|
|
|
|
# Build networking scripts
|
|
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-lo
|
|
DEVICE=lo
|
|
IPADDR=127.0.0.1
|
|
NETMASK=255.0.0.0
|
|
NETWORK=127.0.0.0
|
|
BROADCAST=127.255.255.255
|
|
ONBOOT=yes
|
|
IPV6_AUTOCONF=no
|
|
NAME=loopback
|
|
EOF
|
|
|
|
%end
|
|
|
|
%post --nochroot --erroronfail
|
|
|
|
# Source common functions
|
|
. /tmp/ks-functions.sh
|
|
|
|
# Mirror local software repositories
|
|
SYSIMAGE_MOUNT=/mnt/sysimage
|
|
FEED_DIR=${SYSIMAGE_MOUNT}/www/pages/feed/rel-xxxPLATFORM_RELEASExxx
|
|
UPDATES_DIR=${SYSIMAGE_MOUNT}/www/pages/updates/rel-xxxPLATFORM_RELEASExxx
|
|
PATCHING_DIR=${SYSIMAGE_MOUNT}/opt/patching
|
|
PACKAGES_DIR=${PATCHING_DIR}/packages/xxxPLATFORM_RELEASExxx/
|
|
|
|
KS="Miniboot post:"
|
|
|
|
if [ -d ${SYSIMAGE_MOUNT} ] ; then
|
|
|
|
files="$(ls -lrt ${SYSIMAGE_MOUNT})"
|
|
wlog "${KS} ${SYSIMAGE_MOUNT} files : $files[@]"
|
|
if [ -d ${FEED_DIR} ] ; then
|
|
files=$(ls -lrt ${FEED_MOUNT})
|
|
wlog "${KS} $FEED_DIR files : $files[@]"
|
|
else
|
|
wlog "${KS} error : feed dir '$FEED_DIR' does not exist"
|
|
fi
|
|
|
|
# Check updates Dir
|
|
if [ -d ${UPDATES_DIR} ] ; then
|
|
files=$(ls -lrt ${UPDATES_DIR})
|
|
wlog "${KS} $UPDATES_DIR files : $files[@]"
|
|
else
|
|
wlog "${KS} $UPDATES_DIR does not exist"
|
|
fi
|
|
|
|
# Check Packages Dir
|
|
if [ -d ${PATCHING_DIR} ] ; then
|
|
files=$(ls -lrt ${PATCHING_DIR})
|
|
wlog "${KS} $PATCHING_DIR files : $files[@]"
|
|
|
|
if [ -d ${PATCHING_DIR}/metadata ] ; then
|
|
files=$(ls -lrt ${PATCHING_DIR}/metadata)
|
|
wlog "${KS} $PATCHING_DIR/metadata files : $files[@]"
|
|
|
|
if [ -d ${PATCHING_DIR}/metadata/applied ] ; then
|
|
files=$(ls -lrt ${PATCHING_DIR}/metadata/applied)
|
|
wlog "${KS} $PATCHING_DIR/metadata/applied files : $files[@]"
|
|
else
|
|
wlog "${KS} $PATCHING_DIR/metadata/applied does not exist"
|
|
fi
|
|
if [ -d ${PATCHING_DIR}/metadata/available ] ; then
|
|
files=$(ls -lrt ${PATCHING_DIR}/metadata/available)
|
|
wlog "${KS} $PATCHING_DIR/metadata/available files : $files[@]"
|
|
else
|
|
wlog "${KS} $PATCHING_DIR/metadata/available does not exist"
|
|
fi
|
|
else
|
|
wlog "${KS} $PATCHING_DIR/metadata does not exist"
|
|
fi
|
|
else
|
|
wlog "${KS} $PATCHING_DIR does not exist"
|
|
fi
|
|
|
|
# Check Packages Dir
|
|
if [ -d ${PACKAGES_DIR} ] ; then
|
|
files=$(ls -lrt ${PACKAGES_DIR})
|
|
wlog "${KS} $PACKAGES_DIR files : $files[@]"
|
|
else
|
|
wlog "${KS} $PACKAGES_DIR does not exist"
|
|
fi
|
|
|
|
else
|
|
wlog "${KS} Error : $SYSIMAGE_MOUNT does not exists or is not a directory"
|
|
fi
|
|
|
|
|
|
# Decide on install mode ; local or remote
|
|
if [ -d /mnt/bootimage ]; then
|
|
srcdir=/mnt/bootimage
|
|
else
|
|
# Remote System Controller
|
|
srcdir=/mnt/install/source
|
|
fi
|
|
|
|
# prepare to boot other hosts by mirroring sw repository
|
|
if [ -d $srcdir/Packages ] ; then
|
|
wlog "${KS} copying software repository $srcdir/Packages"
|
|
mkdir -p ${FEED_DIR}
|
|
cp -r $srcdir/Packages ${FEED_DIR}/Packages
|
|
if [ -d $srcdir/repodata ] ; then
|
|
cp -r $srcdir/repodata ${FEED_DIR}/repodata
|
|
else
|
|
wlog "${KS} $srcdir/repodata dir does not exist"
|
|
fi
|
|
fi
|
|
|
|
if [ -d $srcdir/patches ]; then
|
|
if [ -d $srcdir/patches/Packages ] ; then
|
|
wlog "${KS} copying patch Packages $srcdir/patches/Packages"
|
|
mkdir -p ${UPDATES_DIR}
|
|
cp -r $srcdir/patches/Packages ${UPDATES_DIR}/Packages
|
|
else
|
|
wlog "${KS} $srcdir/patches/Packages does not exist"
|
|
fi
|
|
|
|
if [ -d $srcdir/patches/repodata ] ; then
|
|
wlog "${KS} copying patch repository $srcdir/patches/repodata"
|
|
mkdir -p ${UPDATES_DIR}
|
|
cp -r $srcdir/patches/repodata ${UPDATES_DIR}/repodata
|
|
else
|
|
wlog "${KS} $srcdir/patches/repodata does not exist"
|
|
fi
|
|
fi
|
|
|
|
if [ -d $srcdir/patches/metadata ] ; then
|
|
mkdir -p ${PATCHING_DIR}
|
|
wlog "${KS} copying $srcdir/patches/metadata to ${PATCHING_DIR}"
|
|
cp -r $srcdir/patches/metadata ${PATCHING_DIR}/metadata
|
|
fi
|
|
|
|
if [ -d $srcdir/patches ]; then
|
|
mkdir -p ${PACKAGES_DIR}
|
|
wlog "${KS} copying packages"
|
|
find ${UPDATES_DIR}/Packages -name '*.rpm' \
|
|
| xargs --no-run-if-empty -I files cp --preserve=all files ${PACKAGES_DIR}
|
|
fi
|
|
|
|
%end
|
|
|
|
|
|
%post --erroronfail
|
|
|
|
# Source common functions
|
|
. /tmp/ks-functions.sh
|
|
|
|
KS="Miniboot post:"
|
|
|
|
# Create a uuid specific to this installation
|
|
INSTALL_UUID=`uuidgen`
|
|
echo $INSTALL_UUID > /www/pages/feed/rel-xxxPLATFORM_RELEASExxx/install_uuid
|
|
echo "INSTALL_UUID=$INSTALL_UUID" >> /etc/platform/platform.conf
|
|
wlog "${KS} updating platform.conf with install uuid : ${INSTALL_UUID}"
|
|
|
|
# Mirror remote software repositories
|
|
anaconda_logdir=/var/log/anaconda
|
|
mkdir -p $anaconda_logdir
|
|
|
|
# Check for inst.noverifyssl
|
|
if grep -q inst.noverifyssl /proc/cmdline; then
|
|
NOVERIFYSSL_WGET_OPT="--no-check-certificate"
|
|
else
|
|
NOVERIFYSSL_WGET_OPT=""
|
|
fi
|
|
|
|
|
|
# If the patch to $FEED_DIR does not exist then proceed to create it and
|
|
# fetch the ISO content in pieces from the system controller:
|
|
#
|
|
# - Packages
|
|
# - Repodata
|
|
#
|
|
FEED_DIR=/www/pages/feed/rel-xxxPLATFORM_RELEASExxx
|
|
declare -i cut_dirs=NUM_DIRS
|
|
if [ ! -d "${FEED_DIR}/Packages" ]; then
|
|
mkdir -p "${FEED_DIR}/Packages"
|
|
mkdir -p "${FEED_DIR}/repodata"
|
|
cd "${FEED_DIR}"
|
|
feed_url=xxxHTTP_URLxxx
|
|
|
|
wlog "${KS} Remote Install"
|
|
|
|
wlog "${KS} downloading software repository $feed_url"
|
|
|
|
# Fetch Packages
|
|
wget ${NOVERIFYSSL_WGET_OPT} --mirror --no-parent --no-host-directories --reject 'index.html*' \
|
|
--cut-dirs=$cut_dirs $feed_url/Packages/ -o $anaconda_logdir/rpmget.log \
|
|
|| report_post_failure_with_logfile $anaconda_logdir/rpmget.log
|
|
|
|
wlog "${KS} download of $feed_url/Packages/ complete"
|
|
|
|
# Fetch Repodata
|
|
wget ${NOVERIFYSSL_WGET_OPT} --mirror --no-parent --no-host-directories --reject 'index.html*' \
|
|
--cut-dirs=$cut_dirs $feed_url/repodata/ -o $anaconda_logdir/rpmget_repo.log \
|
|
|| report_post_failure_with_logfile $anaconda_logdir/rpmget_repo.log
|
|
|
|
wlog "${KS} download of $feed_url/repodata/ complete"
|
|
else
|
|
wlog "${KS} Local Install"
|
|
fi
|
|
|
|
# Fetch Patch Package Data quietly
|
|
# - Patch Packages
|
|
# - Patches repodata
|
|
# - Patches metadata
|
|
# - Save all patch packages to /opt/patching/packages/xxxPLATFORM_RELEASExxx
|
|
patches_url=xxxHTTP_URLxxx/patches
|
|
wget ${NOVERIFYSSL_WGET_OPT} -q --spider ${patches_url}/
|
|
if [ $? -eq 0 ]; then
|
|
wlog "${KS} downloading patch repository $patches_url"
|
|
cd /www/pages
|
|
mkdir -p updates/rel-xxxPLATFORM_RELEASExxx/Packages
|
|
mkdir -p updates/rel-xxxPLATFORM_RELEASExxx/repodata
|
|
cd updates/rel-xxxPLATFORM_RELEASExxx
|
|
declare -i patches_cut_dirs=$((cut_dirs+1))
|
|
|
|
wlog "${KS} fetch packages"
|
|
wget ${NOVERIFYSSL_WGET_OPT} --mirror --no-parent --no-host-directories --reject 'index.html*' \
|
|
--cut-dirs=$patches_cut_dirs $patches_url/Packages/ -o $anaconda_logdir/patches_rpmget.log \
|
|
|| report_post_failure_with_logfile $anaconda_logdir/patches_rpmget.log
|
|
|
|
wlog "${KS} fetch package repodata"
|
|
wget ${NOVERIFYSSL_WGET_OPT} --mirror --no-parent --no-host-directories --reject 'index.html*' \
|
|
--cut-dirs=$patches_cut_dirs $patches_url/repodata/ -o $anaconda_logdir/patches_rpmget_repo.log \
|
|
|| report_post_failure_with_logfile $anaconda_logdir/patches_rpmget_repo.log
|
|
|
|
mkdir -p /opt/patching/metadata
|
|
mkdir -p /opt/patching/packages/xxxPLATFORM_RELEASExxx
|
|
cd /opt/patching
|
|
|
|
wlog "${KS} fetch patch metadata"
|
|
wget ${NOVERIFYSSL_WGET_OPT} --mirror --no-parent --no-host-directories --reject 'index.html*' \
|
|
--cut-dirs=$patches_cut_dirs $patches_url/metadata/ -o $anaconda_logdir/patches_rpmget_metadata.log \
|
|
|| report_post_failure_with_logfile $anaconda_logdir/patches_rpmget_metadata.log
|
|
|
|
wlog "${KS} save a copy of all patch packages, preserve attributes"
|
|
find /www/pages/updates/rel-xxxPLATFORM_RELEASExxx/Packages -name '*.rpm' \
|
|
| xargs --no-run-if-empty -I files cp --preserve=all files /opt/patching/packages/xxxPLATFORM_RELEASExxx/
|
|
else
|
|
wlog "${KS} get from patches url '$patches_url' failed"
|
|
fi
|
|
|
|
%end
|