b7ecbcc3ba
Extended build-iso to create the package_checksums file after the Packages subdirectory has been created and all rpms are signed. It can be found in the root directory of the mounted iso. The kickstarts will have to be extended to copy the package_checksums from the iso to the final location on the controller. Story: 2009948 Task: 45219 Signed-off-by: Scott Little <scott.little@windriver.com> Change-Id: I4cf064911600f89e356527ee274f40c6ce14a990
854 lines
27 KiB
Bash
Executable File
854 lines
27 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
#
|
|
# Copyright (c) 2018-2020 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
# Build the export/bootimage.iso file
|
|
#
|
|
# This script uses environment variables to determine the source of
|
|
# packages, and bundles the packages into a bootable .iso
|
|
#
|
|
# It starts by building a basic "vanilla CentOS" ISO, and then adds our
|
|
# packages to it.
|
|
|
|
BUILD_ISO_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}" )" )"
|
|
source "${BUILD_ISO_DIR}/image-utils.sh"
|
|
source "${BUILD_ISO_DIR}/git-utils.sh"
|
|
|
|
# Set REPOQUERY, REPOQUERY_SUB_COMMAND, REPOQUERY_RESOLVE and
|
|
# REPOQUERY_WHATPROVIDES_DELIM for our build environment.
|
|
source "${BUILD_ISO_DIR}/pkg-manager-utils.sh"
|
|
|
|
usage () {
|
|
echo ""
|
|
echo "Usage: "
|
|
echo " build-iso [--auto <mode>] [--file <filename>] "
|
|
echo " [--device <device>] [--skip-sign]"
|
|
echo " [--sudo|udev]"
|
|
echo " --file <bootimage.iso> destination ISO file"
|
|
echo " --auto <controller|cpe> Modify kickstart to auto-install controller or cpe"
|
|
echo " mode"
|
|
echo " --device <sda> Use a different boot/rootds device (default is sda)"
|
|
echo " --skip-sign do not add file signature to RPMs"
|
|
echo " --sudo Use \"sudo\" command to access EFI image filesystem (default)"
|
|
echo " --udev Use udev to access EFI image filesystem"
|
|
echo ""
|
|
echo " Note that environment variable BUILD_ISO_USE_UDEV=1 will have the same effect"
|
|
echo " as the --udev option"
|
|
echo ""
|
|
}
|
|
|
|
MY_YUM_CONF=""
|
|
STD_REPO_ID="local-std"
|
|
RT_REPO_ID="local-rt"
|
|
LOWER_LAYER_STD_REPO_ID=""
|
|
LOWER_LAYER_RT_REPO_ID=""
|
|
|
|
NPROCS=$(nproc)
|
|
|
|
export MOCK=/usr/bin/mock
|
|
|
|
CREATEREPO=$(which createrepo_c)
|
|
if [ $? -ne 0 ]; then
|
|
CREATEREPO="createrepo"
|
|
fi
|
|
|
|
# TEMPORARY: Check for isohybrid now to give a warning about installing pkg
|
|
if [ ! -f /usr/bin/isohybrid ]; then
|
|
echo "Missing required utility: /usr/bin/isohybrid"
|
|
echo "Installation of syslinux is required:"
|
|
echo " sudo yum install -y syslinux"
|
|
exit 1
|
|
fi
|
|
|
|
function install_pkg_list {
|
|
local PKGLIST=$1
|
|
if [ "x$PKGLIST" == "x" ]; then
|
|
return 1
|
|
fi
|
|
|
|
OLD_PWD=$PWD
|
|
|
|
echo "Installing packages listed in $PKGLIST and dependancies"
|
|
\rm -f $OUTPUT_DIR/dist/report_deps.txt
|
|
$CREATEREPO $CGCS_REPO_DIR
|
|
$CREATEREPO $CGCS_RT_REPO_DIR
|
|
|
|
\cp -v $MY_YUM_CONF $OUTPUT_DIR
|
|
|
|
\cd $OUTPUT_DIST_DIR/isolinux/Packages
|
|
$INTERNAL_REPO_ROOT/build-tools/build_iso/cgts_deps.sh --deps=$PKGLIST
|
|
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "Could not install dependencies"
|
|
exit 1
|
|
fi
|
|
|
|
# clean up
|
|
echo "Removing local-std yum repo $CGCS_REPO_DIR/repodata"
|
|
echo "Removing local-rt yum repo $CGCS_RT_REPO_DIR/repodata"
|
|
|
|
\cd $OLD_PWD
|
|
}
|
|
|
|
# Generate the report of where all packages come from
|
|
function make_report {
|
|
local PKGLISTFILES=$@
|
|
if [ "x$PKGLISTFILES" == "x" ]; then
|
|
return 1
|
|
fi
|
|
echo "MAKING $REPORT_FILE"
|
|
echo "-----------------" >> $REPORT_FILE
|
|
|
|
echo "ISO REPORT" > $REPORT_FILE
|
|
date >> $REPORT_FILE
|
|
echo "-----------------" >> $REPORT_FILE
|
|
|
|
echo " " >> $REPORT_FILE
|
|
echo "-----------------" >> $REPORT_FILE
|
|
echo "EXPLICIT INCLUDES" >> $REPORT_FILE
|
|
echo "-----------------" >> $REPORT_FILE
|
|
for PKGLIST in $PKGLISTFILES; do
|
|
while read PKG; do
|
|
PKG=`echo $PKG | sed "s/#.*//"`;
|
|
if [ "${PKG}x" != "x" ]; then
|
|
echo $PKG >> $REPORT_FILE
|
|
fi
|
|
done < $PKGLIST
|
|
done
|
|
|
|
echo " " >> $REPORT_FILE
|
|
echo "-----------------" >> $REPORT_FILE
|
|
echo " PACKAGES " >> $REPORT_FILE
|
|
echo "-----------------" >> $REPORT_FILE
|
|
cat $BUILT_REPORT | sort | uniq >> $REPORT_FILE
|
|
|
|
echo " " >> $REPORT_FILE
|
|
echo "-----------------" >> $REPORT_FILE
|
|
echo " WARNINGS " >> $REPORT_FILE
|
|
echo "-----------------" >> $REPORT_FILE
|
|
|
|
# Note that the warnings file may have multiple lines for the same
|
|
# missing dependency. A sort | uniq solves this so we don't duplicate
|
|
# warnings
|
|
cat $WARNINGS_REPORT | sort | uniq >> $REPORT_FILE
|
|
|
|
echo "ISO REPORT: $REPORT_FILE"
|
|
}
|
|
|
|
function init_vars {
|
|
#####################################
|
|
# Input definitions
|
|
|
|
# Where all CentOS packages live
|
|
# Where essential CentOS (minimal install) packages live
|
|
INTERNAL_REPO_ROOT=
|
|
STX_DIR=
|
|
|
|
# Where BSP files live
|
|
export BSP_FILES_PATH=
|
|
|
|
# Where our own packages live
|
|
CGCS_REPO_DIR=$MY_WORKSPACE/std/rpmbuild/RPMS
|
|
CGCS_RT_REPO_DIR=$MY_WORKSPACE/rt/rpmbuild/RPMS
|
|
|
|
MY_YUM_CONF=$(create-yum-conf)
|
|
if [ $? -ne 0 ]; then
|
|
echo "ERROR: create-yum-conf failed"
|
|
exit 1
|
|
fi
|
|
|
|
# LOWER_LAYER_STD_REPO_ID should be something like StxCentos7Distro or StxCentos8Distro
|
|
LOWER_LAYER_STD_REPO_ID=$(grep '\[StxCentos.*Distro\]' ${MY_YUM_CONF} | sed -e 's/^\[//' -e 's/\].*//')
|
|
LOWER_LAYER_RT_REPO_ID=$(grep '\[StxCentos.*Distro-rt\]' ${MY_YUM_CONF} | sed -e 's/^\[//' -e 's/\].*//')
|
|
|
|
DISTRO_REPO_DIR=$(for d in $(grep baseurl $MY_YUM_CONF | grep file: | awk -F : '{print $2}' | sed 's:///:/:g'); do if [ -d $d/images ]; then echo $d ;fi; done)
|
|
|
|
#####################################
|
|
# Output definitons
|
|
|
|
# where to put stuff (curent dir unless MY_WORKSPACE defined)
|
|
OUTPUT_DIR="$PWD/export"
|
|
if [ ! -z "$MY_WORKSPACE" ] && [ -d "$MY_WORKSPACE" ] ; then
|
|
OUTPUT_DIR="$MY_WORKSPACE/export"
|
|
CGCS_REPO_DIR="$MY_WORKSPACE/std/rpmbuild/RPMS"
|
|
CGCS_RT_REPO_DIR="$MY_WORKSPACE/rt/rpmbuild/RPMS"
|
|
fi
|
|
|
|
# Directory in which to populate files to be distributed
|
|
if [ $CUMULUS -eq 0 ]; then
|
|
OUTPUT_DIST_DIR=$OUTPUT_DIR/dist
|
|
else
|
|
OUTPUT_DIST_DIR=$OUTPUT_DIR/dist-cumulus
|
|
fi
|
|
|
|
# Package disc image
|
|
OUTPUT_FILE=$OUTPUT_DIR/$DEST_FILE
|
|
|
|
# Generate an error if the output file is below this threshold
|
|
MINIMUM_EXPECTED_SIZE=500000000
|
|
|
|
# For backward compatibility. Old repo location or new?
|
|
CENTOS_REPO=${MY_REPO}/centos-repo
|
|
if [ ! -d ${CENTOS_REPO} ]; then
|
|
CENTOS_REPO=${MY_REPO}/cgcs-centos-repo
|
|
if [ ! -d ${CENTOS_REPO} ]; then
|
|
CENTOS_REPO=${MY_REPO}/centos-repo
|
|
fi
|
|
fi
|
|
|
|
# report variables
|
|
REPORT_FILE=$OUTPUT_DIR/report.txt
|
|
BUILT_REPORT=$OUTPUT_DIR/local.txt
|
|
CLOUD_REPORT=$OUTPUT_DIR/cloud.txt
|
|
CLOUD_COMMON_REPORT=$OUTPUT_DIR/cloudcommon.txt
|
|
CENTOS_REPORT=$OUTPUT_DIR/centos.txt
|
|
EPEL_REPORT=$OUTPUT_DIR/epel.txt
|
|
WARNINGS_REPORT=$OUTPUT_DIR/warnings.txt
|
|
|
|
\rm -f $REPORT_FILE
|
|
\rm -f $BUILT_REPORT
|
|
\rm -f $CLOUD_REPORT
|
|
\rm -f $CLOUD_COMMON_REPORT
|
|
\rm -f $CENTOS_REPORT
|
|
\rm -f $WARNINGS_REPORT
|
|
}
|
|
|
|
# check input variables
|
|
function check_vars {
|
|
# Where to store data
|
|
printf "Finding cgcs-root\n"
|
|
printf " Checking \$MY_REPO (value \"$MY_REPO\")\n"
|
|
|
|
if [ ! -z "$MY_REPO" ] && [ -d "$MY_REPO" ] ; then
|
|
INTERNAL_REPO_ROOT=$MY_REPO
|
|
printf " Found!\n"
|
|
fi
|
|
|
|
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
|
printf " No joy -- checking \$MY_REPO_ROOT_DIR (value \"$MY_REPO_ROOT_DIR\")\n"
|
|
if [ ! -z "$MY_REPO_ROOT_DIR" ] && [ -d "$MY_REPO_ROOT_DIR/cgcs-root" ] ; then
|
|
INTERNAL_REPO_ROOT=$MY_REPO_ROOT_DIR/cgcs-root
|
|
printf " Found!\n"
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
|
printf " No joy -- checking for \$MY_WORKSPACE/cgcs-root\n"
|
|
if [ -d "$MY_WORKSPACE/cgcs-root" ] ; then
|
|
INTERNAL_REPO_ROOT=$MY_WORKSPACE/cgcs-root
|
|
printf " Found!\n"
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
|
printf " Error -- could not locate cgcs-root repo.\n"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -z "${CENTOS_REPO}" ] && [ ! -d ${CENTOS_REPO} ]; then
|
|
echo " Error -- directory '${CENTOS_REPO}' not found."
|
|
exit 1
|
|
fi
|
|
|
|
STX_DIR=$INTERNAL_REPO_ROOT/stx
|
|
|
|
printf "\nChecking that we can access $DISTRO_REPO_DIR\n"
|
|
if [ ! -d "$DISTRO_REPO_DIR" ] ; then
|
|
printf " Error -- could not access $DISTRO_REPO_DIR\n"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -e "$DISTRO_REPO_DIR/repodata" ] ; then
|
|
printf " Error -- $DISTRO_REPO_DIR is there, but does not seem sane\n"
|
|
fi
|
|
|
|
printf "\nOkay, input looks fine...\n\n"
|
|
printf "Creating output directory $OUTPUT_DIST_DIR\n"
|
|
if [ $CLEAN_FLAG -eq 1 ]; then
|
|
echo " Cleaning..."
|
|
if [ -e $OUTPUT_DIST_DIR ] ; then
|
|
chmod -R a+w $OUTPUT_DIST_DIR
|
|
\rm -rf $OUTPUT_DIST_DIR
|
|
fi
|
|
if [ -e $OUTPUT_DIST_DIR ] ; then
|
|
printf "Error: could not remove old $OUTPUT_DIST_DIR\n"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
\mkdir -p $OUTPUT_DIST_DIR
|
|
if [ ! -d $OUTPUT_DIST_DIR ] ; then
|
|
printf "Error: could not create $OUTPUT_DIST_DIR\n"
|
|
exit 1
|
|
fi
|
|
|
|
RELEASE_INFO="$(get_release_info)"
|
|
if [ $? -ne 0 ]; then
|
|
echo "ERROR: failed to find a release info file."
|
|
exit 1
|
|
fi
|
|
|
|
export PLATFORM_RELEASE=$(source "$RELEASE_INFO" && echo $PLATFORM_RELEASE)
|
|
|
|
# Where BSP files live
|
|
export BSP_FILES_PATH="$(get_bsp_dir)"
|
|
echo " Done"
|
|
echo ""
|
|
}
|
|
|
|
function init_output_dir {
|
|
echo "Creating base output directory in $OUTPUT_DIST_DIR"
|
|
\mkdir -p $OUTPUT_DIST_DIR/isolinux/images
|
|
\mkdir -p $OUTPUT_DIST_DIR/isolinux/ks
|
|
\mkdir -p $OUTPUT_DIST_DIR/isolinux/LiveOS
|
|
\mkdir -p $OUTPUT_DIST_DIR/isolinux/Packages
|
|
\mkdir -p $OUTPUT_DIST_DIR/utils
|
|
|
|
\mkdir -p $OUTPUT_DIST_DIR/isolinux/EFI
|
|
# This directory will contains files required for the PXE network installer
|
|
\mkdir -p $OUTPUT_DIST_DIR/isolinux/pxeboot
|
|
|
|
echo " Preparing package lists"
|
|
image_inc_list iso std centos > "${PKGLIST_STX}"
|
|
image_inc_list iso dev centos > "${PKGLIST_DEV}"
|
|
image_inc_list iso layer centos ${LAYER} > "${PKGLIST_THIS_LAYER}"
|
|
|
|
echo " Copying base files"
|
|
|
|
# Generate .discinfo file
|
|
date +%s.%N > $OUTPUT_DIST_DIR/isolinux/.discinfo
|
|
echo $PLATFORM_RELEASE >> $OUTPUT_DIST_DIR/isolinux/.discinfo
|
|
echo "x86_64" >> $OUTPUT_DIST_DIR/isolinux/.discinfo
|
|
|
|
\cp -L -ru $DISTRO_REPO_DIR/isolinux/* $OUTPUT_DIST_DIR/isolinux/
|
|
\cp -L -ru $DISTRO_REPO_DIR/images/pxeboot $OUTPUT_DIST_DIR/isolinux/images/
|
|
|
|
echo " Installing startup files"
|
|
|
|
\cp -L "$BSP_FILES_PATH/centos.syslinux.cfg" "$OUTPUT_DIST_DIR/isolinux/syslinux.cfg"
|
|
\cp -L "$BSP_FILES_PATH/centos.syslinux.cfg" "$OUTPUT_DIST_DIR/isolinux/isolinux.cfg"
|
|
sed -i 's/wr_usb_boot/oe_iso_boot/' $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
|
|
|
# Modify the isolinux.cfg to auto install if requested
|
|
# Option 0 is Controller(serial). Option 2 is CPE serial.
|
|
if [ "$AUTO_INSTALL" == "controller" ] ; then
|
|
echo "Modifying ISO to auto-install controller load"
|
|
perl -p -i -e 's/timeout 0/timeout 1\ndefault 0/' $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
|
elif [ "$AUTO_INSTALL" == "cpe" ] ; then
|
|
echo "Modifying ISO to auto-install CPE (combined load)"
|
|
perl -p -i -e 's/timeout 0/timeout 1\ndefault 2/' $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
|
fi
|
|
|
|
# Modify the device if requested
|
|
if [ ! -z "$DEVICE" ] ; then
|
|
echo "Modifying ISO to use device $DEVICE"
|
|
perl -p -i -e "s/device=sda/device=${DEVICE}/g" $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
|
fi
|
|
|
|
# Copy UEFI files
|
|
\cp -L -ru $DISTRO_REPO_DIR/EFI/* $OUTPUT_DIST_DIR/isolinux/EFI/
|
|
\cp -L "$BSP_FILES_PATH/grub.cfg" "$OUTPUT_DIST_DIR/isolinux/EFI/BOOT/grub.cfg"
|
|
\cp -L "$BSP_FILES_PATH/pxeboot_grub.cfg" "$OUTPUT_DIST_DIR/isolinux/pxeboot/pxeboot_grub.cfg"
|
|
|
|
# Update the efiboot.img (See https://wiki.archlinux.org/index.php/Remastering_the_Install_ISO)
|
|
# We need to mount the image file, replace the grub.cfg file with the StarlingX one, and unmount.
|
|
# Script update-efiboot-image will do this. If there is not loop device on the build machine
|
|
# then this script must be executed manually prior.
|
|
|
|
if [ ! -e "/dev/loop-control" -a ! -f "$OUTPUT_DIR/efiboot.img" ]; then
|
|
CMD="export PROJECT=$PROJECT; \
|
|
export SRC_BUILD_ENVIRONMENT=$SRC_BUILD_ENVIRONMENT; \
|
|
export MY_BUILD_ENVIRONMENT=$MY_BUILD_ENVIRONMENT; \
|
|
export MY_BUILD_ENVIRONMENT_FILE=$MY_BUILD_ENVIRONMENT_FILE; \
|
|
export MY_BUILD_DIR=$MY_BUILD_DIR; \
|
|
export MY_WORKSPACE=$MY_WORKSPACE; \
|
|
export MY_REPO=$MY_REPO; \
|
|
export LAYER=$LAYER; \
|
|
export MY_BUILD_CFG=$MY_BUILD_CFG; \
|
|
export MY_MOCK_ROOT=$MY_MOCK_ROOT; \
|
|
export PATH=$MY_REPO/build-tools:\$PATH; \
|
|
export BUILD_ISO_USE_UDEV=$BUILD_ISO_USE_UDEV; \
|
|
export BSP_FILES_PATH=$BSP_FILES_PATH; \
|
|
update-efiboot-image"
|
|
echo $CMD
|
|
|
|
if [ "$HOSTNAME" == "yow-cgts3-centos7" ]; then
|
|
echo "Attempting to run update-efiboot-image on yow-cgts3-lx"
|
|
ssh -o StrictHostKeyChecking=no yow-cgts3-lx "$CMD"
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to run update-efiboot-image on yow-cgts3-lx"
|
|
fi
|
|
fi
|
|
|
|
if [ "$HOSTNAME" == "yow-cgts2-centos7" ]; then
|
|
echo "Attempting to run update-efiboot-image on yow-cgts2-lx"
|
|
ssh -o StrictHostKeyChecking=no yow-cgts2-lx "$CMD"
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to run update-efiboot-image on yow-cgts2-lx"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [ ! -e "/dev/loop-control" -a ! -f "$OUTPUT_DIR/efiboot.img" ]; then
|
|
printf "\n**************************************************************************************************** \n"
|
|
printf "No loop device on this machine. Please ensure $OUTPUT_DIR/efiboot.img \n"
|
|
printf "exist prior to executing build-iso by. It can be created by running \n"
|
|
printf " $INTERNAL_REPO_ROOT/build-tools/update-efiboot-image \n"
|
|
printf "on a machine that does support a loop device. Please ensure all standard \n"
|
|
printf "build environment variables are defined (e.g. MY_REPO, MY_WORKSPACE, etc.). \n"
|
|
printf " \n"
|
|
printf "e.g. If building on yow-cgts3-centos7, you'll want to run the script on \n"
|
|
printf " yow-cgts3-lx which shares the same file system, but supports loop devices \n"
|
|
printf "****************************************************************************************************** \n"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -f "$OUTPUT_DIR/efiboot.img" ]; then
|
|
|
|
# The script update-efiboot-image was run outside the build-iso script, do nothing.
|
|
printf " The image file $OUTPUT_DIR/efiboot.img already exists\n"
|
|
else
|
|
printf " The image file $OUTPUT_DIR/efiboot.img does not exist \n"
|
|
if [ ! -f "$INTERNAL_REPO_ROOT/build-tools/update-efiboot-image" ]; then
|
|
printf "*** Error: script update-efiboot-image does not exist *** \n"
|
|
exit 1
|
|
fi
|
|
|
|
# Run the script
|
|
BUILD_ISO_USE_UDEV=$BUILD_ISO_USE_UDEV $INTERNAL_REPO_ROOT/build-tools/update-efiboot-image
|
|
RET=$?
|
|
if [ $RET != 0 ]; then
|
|
printf "*** Error: update-efiboot-image script returned failure $RET *** \n"
|
|
exit 1
|
|
fi
|
|
|
|
fi
|
|
|
|
\cp -L $OUTPUT_DIR/efiboot.img $OUTPUT_DIST_DIR/isolinux/images/
|
|
\rm -f $OUTPUT_DIR/efiboot.img
|
|
|
|
# Copy and set up pxeboot setup files
|
|
\cp "$BSP_FILES_PATH/pxeboot_setup.sh" "$OUTPUT_DIST_DIR/isolinux/pxeboot_setup.sh"
|
|
\cp "$BSP_FILES_PATH/pxeboot.cfg" "$OUTPUT_DIST_DIR/isolinux/pxeboot/pxeboot.cfg"
|
|
chmod +x $OUTPUT_DIST_DIR/isolinux/pxeboot_setup.sh
|
|
|
|
\rm -f $OUTPUT_DIST_DIR/comps.xml
|
|
\cp -L $INTERNAL_REPO_ROOT/build-tools/build_iso/comps.xml.gz $OUTPUT_DIST_DIR/
|
|
gunzip $OUTPUT_DIST_DIR/comps.xml.gz
|
|
|
|
TMP_DIR=$MY_WORKSPACE/tmp
|
|
\mkdir -p $TMP_DIR
|
|
TMPDIR=$TMP_DIR yum clean all -c $MY_YUM_CONF
|
|
\rm -rf $TMP_DIR/yum-$USER-*
|
|
echo " Done"
|
|
echo ""
|
|
}
|
|
|
|
function package_content_checksum {
|
|
local p=$1
|
|
local md5
|
|
local r
|
|
r=$(basename $p)
|
|
md5=$( ( rpm2cpio $p;
|
|
rpm -q --info -p $p;
|
|
rpm -q --dump -p $p;
|
|
rpm -q --scripts -p $p ) | md5sum | cut -d ' ' -f 1)
|
|
echo "$r $md5"
|
|
}
|
|
|
|
function final_touches {
|
|
OLD_PWD=$PWD
|
|
|
|
# Update the comps.xml
|
|
if [ ! -f $OUTPUT_DIST_DIR/comps.xml.bak ]; then
|
|
\cp $OUTPUT_DIST_DIR/comps.xml $OUTPUT_DIST_DIR/comps.xml.bak
|
|
fi
|
|
|
|
local EXTRA_ARGS=""
|
|
if [ "x${RELEASE_BUILD}" == "x" ]; then
|
|
EXTRA_ARGS="--pkglist '${PKGLIST_DEV}'"
|
|
fi
|
|
|
|
for PKGLIST_LOWER_LAYER in ${PKGLIST_LOWER_LAYER_LIST}; do
|
|
EXTRA_ARGS+=" --pkglist ${PKGLIST_LOWER_LAYER}"
|
|
done
|
|
|
|
python "$BSP_FILES_PATH/platform_comps.py" \
|
|
--groups "$OUTPUT_DIST_DIR/comps.xml" \
|
|
--pkglist "${PKGLIST_MINIMAL}" \
|
|
--pkglist "${PKGLIST_STX}" \
|
|
--pkglist "${PKGLIST_THIS_LAYER}" \
|
|
${EXTRA_ARGS}
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to update comps.xml"
|
|
exit 1
|
|
fi
|
|
|
|
# create the repo
|
|
\cd $OUTPUT_DIST_DIR/isolinux
|
|
$CREATEREPO -q -g ../comps.xml .
|
|
|
|
# Create package_checksums
|
|
printf "creating package_checksums file\n"
|
|
for r in $(ls Packages/*rpm); do
|
|
package_content_checksum $r
|
|
done > package_checksums
|
|
|
|
# build the ISO
|
|
printf "Building image $OUTPUT_FILE\n"
|
|
\cd $OUTPUT_DIST_DIR
|
|
chmod 664 isolinux/isolinux.bin
|
|
mkisofs -o $OUTPUT_FILE \
|
|
-R -D -A 'oe_iso_boot' -V 'oe_iso_boot' \
|
|
-quiet \
|
|
-b isolinux.bin -c boot.cat -no-emul-boot \
|
|
-boot-load-size 4 -boot-info-table \
|
|
-eltorito-alt-boot \
|
|
-e images/efiboot.img \
|
|
-no-emul-boot \
|
|
isolinux/
|
|
|
|
isohybrid --uefi $OUTPUT_FILE
|
|
implantisomd5 $OUTPUT_FILE
|
|
|
|
\cd $OLD_PWD
|
|
}
|
|
|
|
function extract_pkg_from_local_repo {
|
|
local pkgname=$1
|
|
local pkg_mgr_conf=$2
|
|
shift 2
|
|
|
|
local repoid=""
|
|
local repoid_arg=""
|
|
|
|
for repoid in $@; do
|
|
repoid_arg+=" --repoid=${repoid}"
|
|
done
|
|
|
|
echo "TMPDIR=$TMP_DIR"\
|
|
"${REPOQUERY} --config=${pkg_mgr_conf} ${repoid_arg}"\
|
|
"${REPOQUERY_SUB_COMMAND} --location"\
|
|
"--arch=noarch,x86_64 -q ${pkgname}"
|
|
local pkgfile=$(TMPDIR=$TMP_DIR \
|
|
${REPOQUERY} --config=${pkg_mgr_conf} ${repoid_arg} \
|
|
${REPOQUERY_SUB_COMMAND} --location \
|
|
--arch=noarch,x86_64 -q ${pkgname})
|
|
if [ -z "${pkgfile}" ]; then
|
|
echo "Could not find package $pkgname in $@"
|
|
exit 1
|
|
fi
|
|
|
|
rpm2cpio ${pkgfile/file://} | cpio -idmv
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to extract files from ${pkgfile/file://}"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function extract_installer_files {
|
|
# Changes to copied files here must also be reflected in patch-iso
|
|
|
|
PKGDIR=$OUTPUT_DIST_DIR/isolinux/Packages
|
|
|
|
(
|
|
\cd $OUTPUT_DIR
|
|
\rm -rf kickstarts extra_cfgs kickstart.work
|
|
\mkdir kickstarts extra_cfgs kickstart.work
|
|
|
|
echo "Retrieving kickstarts..."
|
|
|
|
\cd kickstart.work
|
|
|
|
echo "MY_YUM_CONF=${MY_YUM_CONF}"
|
|
cat ${MY_YUM_CONF}
|
|
extract_pkg_from_local_repo platform-kickstarts ${MY_YUM_CONF} ${STD_REPO_ID} ${LOWER_LAYER_STD_REPO_ID}
|
|
extract_pkg_from_local_repo platform-kickstarts-pxeboot ${MY_YUM_CONF} ${STD_REPO_ID} ${LOWER_LAYER_STD_REPO_ID}
|
|
extract_pkg_from_local_repo platform-kickstarts-extracfgs ${MY_YUM_CONF} ${STD_REPO_ID} ${LOWER_LAYER_STD_REPO_ID}
|
|
|
|
\cp --preserve=all var/www/pages/feed/rel-*/*.cfg pxeboot/*.cfg ../kickstarts/ &&
|
|
\cp --preserve=all extra_cfgs/*.cfg ../extra_cfgs/
|
|
if [ $? -ne 0 ]; then
|
|
echo "Failed to copy extracted kickstarts"
|
|
exit 1
|
|
fi
|
|
|
|
\cd ..
|
|
|
|
# Copy kickstarts to ISO
|
|
\cp --preserve=all kickstarts/controller_ks.cfg $OUTPUT_DIST_DIR/isolinux/ks.cfg
|
|
# Modify the kickstart to shutdown instead of reboot if doing an auto install
|
|
if [ ! -z "$AUTO_INSTALL" ] ; then
|
|
sed -i 's/^reboot --eject/shutdown/' $OUTPUT_DIST_DIR/isolinux/ks.cfg
|
|
fi
|
|
|
|
\mv kickstarts/pxeboot* $OUTPUT_DIST_DIR/isolinux/pxeboot/
|
|
\cp --preserve=all kickstarts/* $OUTPUT_DIST_DIR/isolinux
|
|
|
|
# Update OAM interface for cumulus auto install
|
|
if [ $CUMULUS -eq 1 ]; then
|
|
# Cumulus wants tty1
|
|
perl -p -i -e 's/console=tty0/console=tty1/' $OUTPUT_DIST_DIR/isolinux/isolinux.cfg
|
|
|
|
# CUMULUS setup scripts specify ens3 for OAM
|
|
OAM_IFNAME=ens3
|
|
|
|
cat <<EOM >> $OUTPUT_DIST_DIR/isolinux/ks.cfg
|
|
%post
|
|
#For cumulus tis on tis automated install
|
|
cat << EOF > /etc/sysconfig/network-scripts/ifcfg-${OAM_IFNAME}
|
|
IPADDR=10.10.10.3
|
|
NETMASK=255.255.255.0
|
|
BOOTPROTO=static
|
|
ONBOOT=yes
|
|
DEVICE=${OAM_IFNAME}
|
|
MTU=1500
|
|
GATEWAY=10.10.10.1
|
|
EOF
|
|
%end
|
|
EOM
|
|
fi
|
|
|
|
# For PXE boot network installer
|
|
|
|
echo ${OUTPUT_DIST_DIR}/isolinux/Packages
|
|
|
|
local WORKDIR=pxe-network-installer.content
|
|
local ORIG_PWD=$PWD
|
|
|
|
\rm -rf $WORKDIR
|
|
\mkdir $WORKDIR
|
|
\cd $WORKDIR
|
|
|
|
extract_pkg_from_local_repo pxe-network-installer ${MY_YUM_CONF} ${STD_REPO_ID} ${LOWER_LAYER_STD_REPO_ID}
|
|
extract_pkg_from_local_repo grub2-efi-x64-pxeboot ${MY_YUM_CONF} ${STD_REPO_ID} ${LOWER_LAYER_STD_REPO_ID}
|
|
extract_pkg_from_local_repo grub2-efi-x64-modules ${MY_YUM_CONF} ${STD_REPO_ID} ${LOWER_LAYER_STD_REPO_ID}
|
|
|
|
\mkdir -p $OUTPUT_DIST_DIR/isolinux/pxeboot/EFI/centos/x86_64-efi
|
|
|
|
\cp --preserve=all var/pxeboot/pxelinux.0 var/pxeboot/menu.c32 var/pxeboot/chain.c32 $OUTPUT_DIST_DIR/isolinux/pxeboot &&
|
|
\cp --preserve=all usr/lib/grub/x86_64-efi/* $OUTPUT_DIST_DIR/isolinux/pxeboot/EFI/centos/x86_64-efi/ &&
|
|
\cp --preserve=all var/pxeboot/EFI/grubx64.efi $OUTPUT_DIST_DIR/isolinux/pxeboot/EFI/
|
|
if [ $? -ne 0 ]; then
|
|
echo "Error: Could not copy all files from installer"
|
|
exit 1
|
|
fi
|
|
|
|
\cp --preserve=all var/www/pages/feed/rel-*/LiveOS/squashfs.img $OUTPUT_DIST_DIR/isolinux/LiveOS
|
|
if [ $? -ne 0 ]; then
|
|
echo "Error: Could not copy squashfs from LiveOS"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
# Replace vmlinuz and initrd.img with our own pre-built ones
|
|
\rm -f \
|
|
$OUTPUT_DIST_DIR/isolinux/vmlinuz \
|
|
$OUTPUT_DIST_DIR/isolinux/images/pxeboot/vmlinuz \
|
|
$OUTPUT_DIST_DIR/isolinux/initrd.img \
|
|
$OUTPUT_DIST_DIR/isolinux/images/pxeboot/initrd.img
|
|
\cp --preserve=all var/pxeboot/rel-*/installer-bzImage_1.0 \
|
|
$OUTPUT_DIST_DIR/isolinux/vmlinuz &&
|
|
\cp --preserve=all var/pxeboot/rel-*/installer-bzImage_1.0 \
|
|
$OUTPUT_DIST_DIR/isolinux/images/pxeboot/vmlinuz &&
|
|
\cp --preserve=all var/pxeboot/rel-*/installer-intel-x86-64-initrd_1.0 \
|
|
$OUTPUT_DIST_DIR/isolinux/initrd.img &&
|
|
\cp --preserve=all var/pxeboot/rel-*/installer-intel-x86-64-initrd_1.0 \
|
|
$OUTPUT_DIST_DIR/isolinux/images/pxeboot/initrd.img
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "Error: Failed to copy installer images"
|
|
exit 1
|
|
fi
|
|
|
|
\cd $ORIG_PWD
|
|
\rm -rf $WORKDIR
|
|
)
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
function setup_upgrades_files {
|
|
# Changes to copied files here must also be reflected in patch-iso
|
|
|
|
# Copy the upgrade files
|
|
UPGRADES_DIR="$OUTPUT_DIST_DIR/isolinux/upgrades"
|
|
\rm -rf $UPGRADES_DIR
|
|
\mkdir -p $UPGRADES_DIR
|
|
\cp $BSP_FILES_PATH/upgrades/* $UPGRADES_DIR
|
|
sed -i "s/xxxSW_VERSIONxxx/${PLATFORM_RELEASE}/g" $UPGRADES_DIR/metadata.xml
|
|
chmod +x $UPGRADES_DIR/*.sh
|
|
# Write the version out (used in upgrade scripts - this is the same as SW_VERSION)
|
|
echo "VERSION=$PLATFORM_RELEASE" > $UPGRADES_DIR/version
|
|
}
|
|
|
|
function sign_iso {
|
|
# Sign the .iso with the developer private key
|
|
# Sigining with the formal key is only to be done for customer release
|
|
# builds
|
|
local isofilename=$(basename $OUTPUT_DIR/$DEST_FILE)
|
|
local isofilenoext="${isofilename%.*}"
|
|
openssl dgst -sha256 -sign ${MY_REPO}/build-tools/signing/dev-private-key.pem -binary -out $OUTPUT_DIR/$isofilenoext.sig $OUTPUT_DIR/$DEST_FILE
|
|
}
|
|
|
|
#############################################
|
|
# Main code
|
|
#############################################
|
|
|
|
# Check args
|
|
HELP=0
|
|
CLEAN_FLAG=1 # TODO -- doesn't yet work without --clean
|
|
DEST_FILE=bootimage.iso
|
|
AUTO_FLAG=0
|
|
AUTO_INSTALL=""
|
|
CUMULUS=0
|
|
SIGN_RPM_FILES=1
|
|
DEVICE=""
|
|
if [ -z "$BUILD_ISO_USE_UDEV" ]; then
|
|
BUILD_ISO_USE_UDEV=0
|
|
fi
|
|
|
|
# read the options
|
|
TEMP=`getopt -o hf:a:d: --long help,file:,auto:,device:,cumulus,clean,skip-sign,sudo,udev -n 'test.sh' -- "$@"`
|
|
eval set -- "$TEMP"
|
|
|
|
# extract options and their arguments into variables.
|
|
while true ; do
|
|
case "$1" in
|
|
-h|--help) HELP=1 ; shift ;;
|
|
--clean) CLEAN_FLAG=1 ; shift ;;
|
|
--skip-sign) SIGN_RPM_FILES=0 ; shift ;;
|
|
--cumulus) CUMULUS=1 ; shift ;;
|
|
-f | --file) DEST_FILE="$2"; shift; shift ;;
|
|
-d | --device) DEVICE="$2"; shift; shift ;;
|
|
-a | --auto) AUTO_FLAG=1; AUTO_INSTALL="$2"; shift; shift ;;
|
|
--sudo) BUILD_ISO_USE_UDEV=0 ; shift ;;
|
|
--udev) BUILD_ISO_USE_UDEV=1 ; shift ;;
|
|
--) shift ; break ;;
|
|
*) echo "Internal error!" ; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
if [ $AUTO_FLAG -eq 1 ]; then
|
|
if [[ "$AUTO_INSTALL" != "controller" && "$AUTO_INSTALL" != "cpe" ]] ; then
|
|
echo "Unsupported --auto value: $AUTO_INSTALL"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ $HELP -eq 1 ]; then
|
|
usage
|
|
exit 0
|
|
fi
|
|
|
|
|
|
(
|
|
printf "\n*************************\n"
|
|
printf "Create StarlingX/CentOS Boot CD\n"
|
|
printf "*************************\n\n"
|
|
|
|
# Init variables
|
|
init_vars
|
|
check_vars
|
|
DISTRO="centos"
|
|
|
|
PKGLIST_MINIMAL="${INTERNAL_REPO_ROOT}/build-tools/build_iso/minimal_rpm_list.txt"
|
|
PKGLIST_STX="${OUTPUT_DIR}/image.inc"
|
|
PKGLIST_DEV="${OUTPUT_DIR}/image-dev.inc"
|
|
PKGLIST_THIS_LAYER="${OUTPUT_DIR}/image-layer.inc"
|
|
PKGLIST_LOWER_LAYER_DIR="${CENTOS_REPO}/layer_image_inc"
|
|
|
|
PKGLIST_LOWER_LAYER_LIST=""
|
|
if [ -d ${PKGLIST_LOWER_LAYER_DIR} ]; then
|
|
PKGLIST_LOWER_LAYER_LIST="$(find ${PKGLIST_LOWER_LAYER_DIR} -name '*image.inc')"
|
|
fi
|
|
|
|
# Create skeleton build dir
|
|
init_output_dir
|
|
|
|
# Create the vanilla DVD
|
|
echo "Copying vanilla CentOS RPMs"
|
|
install_pkg_list "${PKGLIST_MINIMAL}"
|
|
if [ $? -eq 2 ]; then
|
|
echo "Error: Failed to install packages from ${PKGLIST_MINIMAL}"
|
|
exit 1
|
|
fi
|
|
|
|
# Find all StarlingX packages built locally
|
|
echo "Installing StarlingX packages"
|
|
install_pkg_list "${PKGLIST_STX}"
|
|
if [ $? -eq 2 ]; then
|
|
echo "Error: Failed to install packages from ${PKGLIST_STX}"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
for PKGLIST_LOWER_LAYER in $PKGLIST_LOWER_LAYER_LIST; do
|
|
install_pkg_list "${PKGLIST_LOWER_LAYER}"
|
|
if [ $? -eq 2 ]; then
|
|
echo "Error: Failed to install packages from ${PKGLIST_LOWER_LAYER}"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
if [ "x${RELEASE_BUILD}" == "x" ]; then
|
|
echo "Installing StarlingX developer packages"
|
|
install_pkg_list "${PKGLIST_DEV}"
|
|
if [ $? -eq 2 ]; then
|
|
echo "Error: Failed to install packages from ${PKGLIST_DEV}"
|
|
exit 1
|
|
fi
|
|
|
|
for PKGLIST_LOWER_LAYER in $PKGLIST_LOWER_LAYER_LIST; do
|
|
install_pkg_list "${PKGLIST_LOWER_LAYER}"
|
|
if [ $? -eq 2 ]; then
|
|
echo "Error: Failed to install packages from ${PKGLIST_LOWER_LAYER}"
|
|
exit 1
|
|
fi
|
|
done
|
|
fi
|
|
|
|
\cd $OUTPUT_DIST_DIR
|
|
chmod -R 644 isolinux/Packages/*
|
|
|
|
# Extract installer files
|
|
extract_installer_files
|
|
|
|
# Upgrades files
|
|
setup_upgrades_files
|
|
|
|
# add file signatures to all rpms
|
|
if [ $SIGN_RPM_FILES -ne 0 ]; then
|
|
sign-rpms -d $OUTPUT_DIST_DIR/isolinux/Packages
|
|
if [ $? -ne 0 ] ; then
|
|
echo "failed to add file signatures to RPMs"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Finalize and build ISO
|
|
final_touches
|
|
|
|
# Sign the ISO
|
|
sign_iso
|
|
|
|
make_report "${PKGLIST_MINIMAL}" "${PKGLIST_STX}" "${PKGLIST_THIS_LAYER}" ${PKGLIST_LOWER_LAYER_LIST}
|
|
|
|
# Check sanity
|
|
FILESIZE=$(wc -c <"$OUTPUT_FILE")
|
|
if [ $FILESIZE -ge $MINIMUM_EXPECTED_SIZE ]; then
|
|
printf "Done."
|
|
printf "Output file: $OUTPUT_FILE\n\n"
|
|
else
|
|
printf "Output file $OUTPUT_FILE smaller than expected -- probable error\n\n"
|
|
exit 1
|
|
fi
|
|
|
|
) 2>&1 | stdbuf -o0 awk '{ print strftime("%H:%M:%S"), $0; fflush(); }' ; exit ${PIPESTATUS[0]}
|