diff --git a/installer/pxe-network-installer/debian/deb_folder/pxe-network-installer.install b/installer/pxe-network-installer/debian/deb_folder/pxe-network-installer.install index 384ad94c..8a9b3c88 100644 --- a/installer/pxe-network-installer/debian/deb_folder/pxe-network-installer.install +++ b/installer/pxe-network-installer/debian/deb_folder/pxe-network-installer.install @@ -1,2 +1,4 @@ var/pxeboot usr/sbin +etc/init.d/pxeboot_feed +lib/systemd/system/pxeboot-feed.service diff --git a/installer/pxe-network-installer/debian/deb_folder/rules b/installer/pxe-network-installer/debian/deb_folder/rules index 9faaec1f..85ac7b8e 100644 --- a/installer/pxe-network-installer/debian/deb_folder/rules +++ b/installer/pxe-network-installer/debian/deb_folder/rules @@ -9,10 +9,12 @@ export platform_release="$(shell grep SW_VERSION /usr/include/build_info.h | cut override_dh_auto_configure: sed -i "s/xxxSW_VERSIONxxx/${platform_release}/g" debian-pxe-* efi-debian-pxe-* + sed -i "s/xxxSW_VERSIONxxx/${platform_release}/g" pxeboot_feed.sh dh_auto_configure override_dh_install: install -v -d -m 755 $(ROOT)/usr/bin + install -v -d -m 755 $(ROOT)/lib/systemd/system install -v -d -m 755 $(ROOT)/var/pxeboot/pxelinux.cfg.files install -v -d -m 755 $(ROOT)/var/pxeboot/rel-${platform_release} install -v -d -m 755 $(ROOT)/usr/share/licenses/pxe-network-installer-1.0.0 @@ -30,6 +32,8 @@ override_dh_install: install -p -D -m 644 efi-pxeboot.cfg.debian $(ROOT)/var/pxeboot/pxelinux.cfg.files/efi-pxeboot.cfg.debian install -p -D -m 755 pxeboot_setup.sh $(ROOT)/usr/sbin/pxeboot_setup.sh install -p -D -m 755 pxeboot-update.sh ${ROOT}/usr/sbin/pxeboot-update-${platform_release}.sh + install -p -D -m 644 pxeboot-feed.service $(ROOT)/lib/systemd/system/pxeboot-feed.service + install -p -D -m 755 pxeboot_feed.sh $(ROOT)/etc/init.d/pxeboot_feed # Legacy BIOS System Node Install grub menus install -p -D -m 700 debian-pxe-controller-install $(ROOT)/var/pxeboot/pxelinux.cfg.files/pxe-controller-install-${platform_release} @@ -58,3 +62,6 @@ override_dh_install: install -p -D -m 700 pxeboot/vesamenu.c32 $(ROOT)/var/pxeboot dh_install + +override_dh_installsystemd: + dh_installsystemd -ppxe-network-installer pxeboot-feed.service diff --git a/installer/pxe-network-installer/pxe-network-installer/pxeboot-feed.service b/installer/pxe-network-installer/pxe-network-installer/pxeboot-feed.service new file mode 100644 index 00000000..ed342d69 --- /dev/null +++ b/installer/pxe-network-installer/pxe-network-installer/pxeboot-feed.service @@ -0,0 +1,13 @@ +[Unit] +Description=StarlingX Pxeboot Feed Refresh +After=config.service +Before=pmon.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/etc/init.d/pxeboot_feed + +[Install] +WantedBy=multi-user.target + diff --git a/installer/pxe-network-installer/pxe-network-installer/pxeboot_feed.sh b/installer/pxe-network-installer/pxe-network-installer/pxeboot_feed.sh new file mode 100755 index 00000000..5fdc7e42 --- /dev/null +++ b/installer/pxe-network-installer/pxe-network-installer/pxeboot_feed.sh @@ -0,0 +1,219 @@ +#!/bin/bash +############################################################################# +# Copyright (c) 2022 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# +# This utility is used to create or update the following directories +# +# /var/www/pages/feed/rel-xx.xx/pxeboot +# /var/pxeboot/rel-xx.xx +# +# ... with the kernel, initrd and other images and signature files from /boot +# +############################################################################# +# +# chkconfig: 2345 98 2 +# +### BEGIN INIT INFO +# Provides: pxeboot_feed +# Required-Start: $null +# Required-Stop: $null +# Default-Start: 3 5 +# Default-Stop: 0 1 2 6 +# Short-Description: StarlingX Installer Pxeboot Feed Refresh +### END INIT INFO + +# Script has options 'debug' argument +debug=false +[ -n "${1}" ] && [ "${1}" == "debug" ] && debug=true + +LOG_TAG=${LOG_TAG:-$(basename "${0}")} + +# return code +RETVAL=1 + +############################################################################# +# Name : ilog +# Purpose : log info message +# Parmaeter: message to log +# Returns : none +############################################################################# + +function ilog { + logger -t "${LOG_TAG}" "${@}" +} + +############################################################################# +# Name : dlog +# Purpose : log and echo debug messages +# Parmaeter: message to log +# Returns : none +############################################################################# + +function dlog { + if [ "${debug}" == true ] ; then + logger -t "${LOG_TAG}" "${@}" + fi +} + +############################################################################# +# Name : rsync_if_not_equal +# Purpose : Speed up the refresh service. +# Assumptions: Reads are faster thyan writes +# Equal case is more likely +# Parameters : $1 - src path/file +# $2 - dst path/file +# Returns : none +############################################################################# + +function rsync_if_not_equal { + local src_file="${1}" + local dst_file="${2}" + local need_rsync=false + + if [ -e "${src_file}" ] ; then + if [ -e "${dst_file}" ] ; then + src=( $(md5sum "${src_file}") ) + dst=( $(md5sum "${dst_file}") ) + if [ "${src[0]}" == "${dst[0]}" ] ; then + dlog "bypass rsync ; ${src_file}" and "${dst_file} are equal" + else + need_rsync=true + fi + else + need_rsync=true + fi + else + ilog "Warning: '${src_file}' not found" + fi + + if [ "${need_rsync}" = true ] ; then + ilog "syncing ${src_file} to ${dst_file}" + rsync "${src_file}" "${dst_file}" + fi +} + +############################################################################# + +# Override release with what is found in platform.conf +rel="" +if [ -e "/etc/platform/platform.conf" ] ; then + rel=$(grep sw_version < /etc/platform/platform.conf | cut -d '=' -f 2) +fi +if [ -z "${rel}" ] ; then + rel="xxxSW_VERSIONxxx" +fi + +# pxeboot objects path +feed="/var/www/pages/feed/rel-${rel}" +pxefeed="${feed}/pxeboot" +pxeboot="/var/pxeboot" + +# ensure the deepest directories are created +if [ ! -d "${pxefeed}/EFI/BOOT" ] ; then + mkdir -p "${pxefeed}/EFI/BOOT" > /dev/null 2>&1 || exit ${RETVAL} +fi +if [ ! -d "${pxeboot}rel-${rel}" ] ; then + mkdir -p "${pxeboot}/rel-${rel}" > /dev/null 2>&1 || exit ${RETVAL} +fi +if [ ! -d "${pxeboot}/EFI/BOOT" ] ; then + mkdir -p "${pxeboot}/EFI/BOOT" > /dev/null 2>&1 || exit ${RETVAL} +fi + +base_path="/boot/ostree" +declare -a file_list=() + +if [ ! -d "${base_path}" ] ; then + ilog "Error: base path '${base_path}' does not exist" + exit ${RETVAL} +fi + +file_list=( $(find "${base_path}" -name 'initramfs*') ) +file_list+=( $(find "${base_path}" -name 'vmlinuz*') ) +dlog "${file_list[*]}" +for f in "${file_list[@]}" ; do + path_file1="" + filename=$(basename "${f}") + dlog "File: ${filename} ... ${f}" + if [ "${filename}" == "initramfs.sig" ] ; then + path_file1="${pxeboot}/rel-${rel}/initrd.sig" + path_file2="${pxefeed}/initrd.sig" + elif [ "${filename}" == "initramfs" ] ; then + path_file1="${pxeboot}/rel-${rel}/initrd" + path_file2="${pxefeed}/initrd" + elif [ "${filename}" == "vmlinuz.sig" ] ; then + path_file1="${pxeboot}/rel-${rel}/bzImage.sig" + path_file2="${pxefeed}/bzImage.sig" + elif [ "${filename}" == "vmlinuz" ] ; then + path_file1="${pxeboot}/rel-${rel}/bzImage" + path_file2="${pxefeed}/bzImage" + elif [[ "${filename}" == *"rt-amd64.sig"* ]] ; then + path_file1="${pxeboot}/rel-${rel}/bzImage-rt.sig" + path_file2="${pxefeed}/bzImage-rt.sig" + elif [[ "${filename}" == *"rt-amd64"* ]] ; then + path_file1="${pxeboot}/rel-${rel}/bzImage-rt" + path_file2="${pxefeed}/bzImage-rt" + elif [[ "${filename}" == *"amd64.sig"* ]] ; then + path_file1="${pxeboot}/rel-${rel}/bzImage-std.sig" + path_file2="${pxefeed}/bzImage-std.sig" + elif [[ "${filename}" == *"amd64"* ]] ; then + path_file1="${pxeboot}/rel-${rel}/bzImage-std" + path_file2="${pxefeed}/bzImage-std" + else + ilog "ignoring unknown file: ${f}" + continue + fi + + rsync_if_not_equal "${f}" "${path_file1}" + rsync_if_not_equal "${f}" "${path_file2}" +done + + +# Other image files +file1="LockDown.efi.sig" +file2="LockDown.efi" +file3="bootx64.efi" +file4="grub.cfg.sig" +file5="grubx64.efi" +file6="mmx64.efi" + +file_list=( $(find "${base_path}" \ + -name "${file1}" -o \ + -name "${file2}" -o \ + -name "${file3}" -o \ + -name "${file4}" -o \ + -name "${file5}" -o \ + -name "${file6}") ) + +dlog "${file_list[*]}" + +for f in "${file_list[@]}" ; do + filename=$(basename "${f}") + dlog "File: ${filename} ... ${f}" + + path_file="EFI/BOOT/${filename}" + path_file1="" + + if [[ "${filename}" == *"${file1}"* || \ + "${filename}" == *"${file2}"* || \ + "${filename}" == *"${file3}"* || \ + "${filename}" == *"${file4}"* || \ + "${filename}" == *"${file5}"* || \ + "${filename}" == *"${file6}"* ]] ; then + path_file1="${pxeboot}/${path_file}" + path_file2="${pxefeed}/${path_file}" + else + ilog "ignoring unknown file: ${f}" + continue + fi + + rsync_if_not_equal "${f}" "${path_file1}" + rsync_if_not_equal "${f}" "${path_file2}" +done + +# rsync efi.img file +rsync_if_not_equal "${pxeboot}/efi.img" "${feed}/efi.img" + +RETVAL=0 +exit ${RETVAL} diff --git a/kickstart/debian/deb_folder/rules b/kickstart/debian/deb_folder/rules index 0b97c279..f83c9596 100644 --- a/kickstart/debian/deb_folder/rules +++ b/kickstart/debian/deb_folder/rules @@ -13,7 +13,7 @@ override_dh_auto_configure: dh_auto_configure override_dh_install: - install -d -m 755 $(ROOT)/var/www/pages/feed/rel-${platform_release} - install -p -D -m 700 kickstart.cfg $(ROOT)/var/www/pages/feed/rel-${platform_release} - install -p -D -m 700 miniboot.cfg $(ROOT)/var/www/pages/feed/rel-${platform_release} + install -d -m 755 $(ROOT)/var/www/pages/feed/rel-${platform_release}/kickstart + install -p -D -m 700 kickstart.cfg $(ROOT)/var/www/pages/feed/rel-${platform_release}/kickstart + install -p -D -m 700 miniboot.cfg $(ROOT)/var/www/pages/feed/rel-${platform_release}/kickstart dh_install diff --git a/kickstart/files/kickstart.cfg b/kickstart/files/kickstart.cfg index 3f02f86c..68426fb6 100644 --- a/kickstart/files/kickstart.cfg +++ b/kickstart/files/kickstart.cfg @@ -2768,7 +2768,6 @@ if [ "${controller}" = true ] ; then pull_options="${commits} --mirror" pxeboot="${IMAGE_ROOTFS}/var/pxeboot" feed="${IMAGE_ROOTFS}/var/www/pages/feed/rel-${sw_release}" - subcloud_feed="${IMAGE_ROOTFS}/var/www/pages/iso/rel-${sw_release}" repo="${feed}/ostree_repo" mkdir -p "${repo}" mkdir -p "${feed}" @@ -2839,26 +2838,11 @@ if [ "${controller}" = true ] ; then #################################################################### - # Setup the feed and pxeboot directories - # - # All the feed and pxeboot setup operation are off of /var which is - # common to normal and rollback filesystems. - # Therefore this only needs to be done once like the ostree repo - # pull but for a different reason. - # + # Fetch and add efi.img to /var/pxeboot ##################################################################### - mkdir -p "${pxeboot}/rel-${sw_release}" mkdir -p "${pxeboot}/EFI/BOOT" - mkdir -p "${feed}/pxeboot" - mkdir -p "${feed}/kickstart" - mkdir -p "${feed}/pxeboot/EFI/BOOT" - - mkdir -p "${subcloud_feed}/pxeboot" - mkdir -p "${subcloud_feed}/kickstart" - mkdir -p "${subcloud_feed}/pxeboot/EFI/BOOT" - # Check for noverifyssl if grep -q noverifyssl /proc/cmdline; then NOVERIFYSSL_WGET_OPT="--no-check-certificate" @@ -2868,52 +2852,12 @@ if [ "${controller}" = true ] ; then # handle USB install if is_usb_install -eq 0 ; then - - # populate /var/pxeboot - ilog "Copy bzImage, initrd and respective secure boot .sig files" - ilog "... from /instboot/pxeboot to ${pxeboot}/rel-${sw_release}" - - cp -a /instboot/pxeboot/bzImage* ${pxeboot}/rel-${sw_release} - cp -a /instboot/pxeboot/initrd* ${pxeboot}/rel-${sw_release} cp -a /instboot/efi.img ${pxeboot} - cp -a /instboot/pxeboot/EFI ${pxeboot} - for f in bootx64.efi bootx64-nosig.efi grub.cfg.sig grubx64.efi LockDown.efi LockDown.efi.sig mmx64.efi ; do - cp -a /instboot/pxeboot/EFI/BOOT/${f} ${pxeboot}/EFI/BOOT - done - - # populate feeds - ilog "Stage images and kickstarts from /instboot to feeds" - for this_feed in ${feed} ${subcloud_feed} ; do - cp -a /instboot/pxeboot/bzImage* ${this_feed}/pxeboot - cp -a /instboot/pxeboot/initrd* ${this_feed}/pxeboot - cp -a /instboot/efi.img ${this_feed} - cp -a /instboot/pxeboot/EFI ${this_feed}/pxeboot - cp -a /instboot/kickstart/kickstart.cfg ${this_feed}/kickstart - cp -a /instboot/kickstart/miniboot.cfg ${this_feed}/kickstart - done # feeds # handle pxeboot install else pxeurl=$(echo $insturl | sed -e s/ostree_repo//) - # Fetch and stage the kernels, signature files and initrd - ilog "Fetch bzImage and initrd files from ${pxeurl}/pxeboot" - pushd ${pxeboot}/rel-${sw_release} > /dev/null - for f in bzImage bzImage-rt bzImage-rt.sig bzImage.sig bzImage-std bzImage-std.sig initrd initrd.sig ; do - ilog "... fetching ${f} to ${pxeboot}/rel-${sw_release}" - - wget ${NOVERIFYSSL_WGET_OPT} ${pxeurl}/pxeboot/${f} -o /${LAT_DIR}/wget.tmp - [ $? -ne 0 ] && report_failure_with_msg "Failed to find ${pxeurl}/pxeboot/${f}" - cat /${LAT_DIR}/wget.tmp >> /${LAT_DIR}/wget_pxeboot_setup.log - - # also copy to the feeds - ilog "... copying ${f} to ${feed}/pxeboot" - cp -a ${f} ${feed}/pxeboot - ilog "... copying ${f} to ${subcloud_feed}/pxeboot" - cp -a ${f} ${subcloud_feed}/pxeboot - done - popd > /dev/null - # Fetch and stage the efi.img ilog "Fetch efi.img from ${pxeurl} to ${pxeboot}" pushd ${pxeboot} > /dev/null @@ -2927,53 +2871,14 @@ if [ "${controller}" = true ] ; then # also copy to the feeds ilog "... copying ${f} to ${feed}" cp -a ${f} ${feed} - ilog "... copying ${f} to ${subcloud_feed}" - cp -a ${f} ${subcloud_feed} done popd > /dev/null - # Fetch and stage the boot loaders - pushd ${pxeboot}/EFI/BOOT > /dev/null - ilog "Copy files from ${pxeurl}/pxeboot/EFI/BOOT to ${pxeboot}/EFI/BOOT" - for f in bootx64.efi bootx64-nosig.efi grub.cfg.sig grubx64.efi LockDown.efi LockDown.efi.sig mmx64.efi; do - ilog "... fetching ${f} to ${pxeboot}/EFI/BOOT" - - wget ${NOVERIFYSSL_WGET_OPT} ${pxeurl}/pxeboot/EFI/BOOT/${f} -o /${LAT_DIR}/wget.tmp - [ $? -ne 0 ] && report_failure_with_msg "Failed to get ${pxeurl}/pxeboot/EFI/BOOT/${f}" - cat /${LAT_DIR}/wget.tmp >> /${LAT_DIR}/wget_pxeboot_setup.log - - # also copy to the feeds - ilog "... copying ${f} to ${feed}/pxeboot/EFI/BOOT" - cp -a ${f} ${feed}/pxeboot/EFI/BOOT - ilog "... copying ${f} to ${subcloud_feed}/pxeboot/EFI/BOOT" - cp -a ${f} ${subcloud_feed}/pxeboot/EFI/BOOT - done - popd > /dev/null - - # Fetch and stage the kickstarts - ilog "Fetch kickstarts from ${pxeurl} to ${feed}/kickstart" - pushd ${feed}/kickstart > /dev/null - for f in kickstart.cfg miniboot.cfg ; do - ilog "... fetching ${f} to ${feed}/kickstart" - - wget ${NOVERIFYSSL_WGET_OPT} ${pxeurl}/kickstart/${f} -o /${LAT_DIR}/wget.tmp - [ $? -ne 0 ] && report_failure_with_msg "Failed to get ${pxeurl}/kickstart/${f}" - cat /${LAT_DIR}/wget.tmp >> /${LAT_DIR}/wget_pxeboot_setup.log - - ilog "... copying ${f} to ${subcloud_feed}/kickstart" - cp -a ${f} ${subcloud_feed}/kickstart - done - [ -e /${LAT_DIR}/wget.tmp ] && rm -f /${LAT_DIR}/wget.tmp - popd > /dev/null fi - # Temporary WorkAround: The current UEFI pxeboot loader does not call the - # default provisioning grub menu in /var/pxeboot/pxelinux.cfg/grub.cfg. - # - # While the above issue is investigated, to support DX and system node - # install for UEFI servers this code moves the lat grub.cfg aside and - # creates a link to the default provisioning mac based grub menu. + # Save and override the LAT grub menu by creating a link to the default + # provisioning mac based grub menu. pushd ${pxeboot}/EFI/BOOT > /dev/null if [ ! -L grub.cfg ] ; then if [ -e grub.cfg ] ; then