diff --git a/bsp-files/centos-ks-gen.pl b/bsp-files/centos-ks-gen.pl index 0d98dfaf..2025cbb1 100755 --- a/bsp-files/centos-ks-gen.pl +++ b/bsp-files/centos-ks-gen.pl @@ -87,6 +87,7 @@ write_config_file("controller-worker-lowlatency", # write_config_file("controller", "${output_dir}/prestaged_installer_ks.cfg", + "pre_prestaging_install_check.cfg", "pre_common_head.cfg", "pre_pkglist_prestage.cfg", "pre_disk_setup_common.cfg", diff --git a/bsp-files/kickstarts/pre_prestaging_install_check.cfg b/bsp-files/kickstarts/pre_prestaging_install_check.cfg new file mode 100644 index 00000000..e8627d66 --- /dev/null +++ b/bsp-files/kickstarts/pre_prestaging_install_check.cfg @@ -0,0 +1,66 @@ +%pre --erroronfail + +# Get the FD used by subshells to log output +exec {stdout}>&1 + +# Source common functions +. /tmp/ks-functions.sh + +wlog "pre prestaging install check" + +# First, parse /proc/cmdline to find the boot args +set -- `cat /proc/cmdline` +for I in $*; do case "$I" in *=*) eval $I 2>/dev/null;; esac; done + +if [ -z "$rootfs_device" ]; then + rootfs_device=$(get_disk_dev) +fi + +orig_rootfs_device=$rootfs_device +by_path_rootfs_device=$(get_by_path $rootfs_device) +rootfs_device=$(get_disk $by_path_rootfs_device) +wlog "Found rootfs $orig_rootfs_device on: $by_path_rootfs_device->$rootfs_device." + +part_numbers=( $(parted -s ${rootfs_device} print | awk '$1 == "Number" {i=1; next}; i {print $1}') ) +# print the partnumber info for informational purposes +for i in ${part_numbers[@]}; do + wlog "partnumber: ${i}" +done + +# Get the correct rootfs prefix +ROOTFS_PART_PREFIX=${rootfs_device} +# check if rootfs part is nvme (eg. /dev/nvme0n1). The partitions have a "p" in the part prefix. +# for example, /dev/nvme0n1p1 +# so we need to add the letter "p" to get the prefix. +# The part numbers will be used later in the code. +case $rootfs_device in + *"nvme"*) + ROOTFS_PART_PREFIX=${ROOTFS_PART_PREFIX}p + ;; +esac + +# temporary mount directory +temp_mount=/mnt + +wlog "Searching for existing installation..." +for part in "${part_numbers[@]}"; do + device=${ROOTFS_PART_PREFIX}${part} + wlog "Searching on ${device}" + # mount this part at a temporary mount point + mount ${device} ${temp_mount} + if [ $? -ne 0 ]; then + wlog "unable to mount ${device}" + continue + fi + # Check for the presence of install_uuid in one of the partitions on + # the root device + if [ -e ${temp_mount}/var/www/pages/feed/rel-xxxPLATFORM_RELEASExxx/install_uuid ]; then + wlog "Found valid installation on ${device}" + umount ${temp_mount} + # do not modify the system in any way + report_pre_failure_with_msg "Prestage rejected. Existing installation detected. Please eject the media before rebooting." + fi + wlog "Unmounting ${device}" + umount ${temp_mount} +done +%end