X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=meta-starlingx%2Fmeta-stx-distro%2Fclasses%2Fstx-anaconda-image.bbclass;fp=meta-starlingx%2Fmeta-stx-distro%2Fclasses%2Fstx-anaconda-image.bbclass;h=4a1e68d1d8a69338751c44c8bd990ac14dac72da;hb=e0634c6eaf2fe2641a0fb90e84a5defb880b1335;hp=0000000000000000000000000000000000000000;hpb=210d0f78485e760dffcdd3f630f59cec797f3f11;p=pti%2Frtp.git diff --git a/meta-starlingx/meta-stx-distro/classes/stx-anaconda-image.bbclass b/meta-starlingx/meta-stx-distro/classes/stx-anaconda-image.bbclass new file mode 100644 index 0000000..4a1e68d --- /dev/null +++ b/meta-starlingx/meta-stx-distro/classes/stx-anaconda-image.bbclass @@ -0,0 +1,397 @@ + +RPM_POSTPROCESS_COMMANDS_append = "wrl_installer;" +do_rootfs[vardeps] += "INSTALLER_TARGET_BUILD INSTALLER_TARGET_IMAGE" + +# Fix system-shutdown hang at ratelimiting +APPEND_append = " printk.devkmsg=on" + +INSTPRODUCT ?= "${DISTRO_NAME}" +INSTVER ?= "${DISTRO_VERSION}" +INSTBUGURL ?= "http://www.windriver.com/" + +# NOTE: Please update anaconda-init when you change INSTALLER_CONFDIR, use "=" +# but not "?=" since this is not configurable. +INSTALLER_CONFDIR = "${IMAGE_ROOTFS}/installer-config" +KICKSTART_FILE ??= "" +KICKSTART_FILE_EXTRA ??= "" +WRL_INSTALLER_CONF ?= "" + +# Extra packages that will be added in the rpm repo in anaconda installer ISO image +REPO_EXTRA_PKG = "\ + xfsprogs-* \ + glibc-binary-localedata-* \ +" + +build_iso_prepend() { + install -d ${ISODIR} + ln -snf /.discinfo ${ISODIR}/.discinfo + ln -snf /.buildstamp ${ISODIR}/.buildstamp + ln -snf /Packages ${ISODIR}/Packages +} + +build_iso_append() { + implantisomd5 ${IMGDEPLOYDIR}/${IMAGE_NAME}.iso +} + +# Check WRL_INSTALLER_CONF and copy it to +# ${IMAGE_ROOTFS}/.buildstamp.$prj_name when exists +wrl_installer_copy_buildstamp() { + prj_name=$1 + buildstamp=$2 + if [ -f $buildstamp ]; then + bbnote "Using $buildstamp as the buildstamp" + cp $buildstamp ${IMAGE_ROOTFS}/.buildstamp.$prj_name + else + bbfatal "Can't find WRL_INSTALLER_CONF: $buildstamp" + fi +} + +# Hardlink when possible, otherwise copy. +# $1: src +# $2: target +wrl_installer_hardlinktree() { + src_dev="`stat -c %d $1`" + if [ -e "$2" ]; then + tgt_dev="`stat -c %d $2`" + else + tgt_dev="`stat -c %d $(dirname $2)`" + fi + hdlink="" + if [ "$src_dev" = "$tgt_dev" ]; then + hdlink="--link" + fi + cp -rvf $hdlink $1 $2 +} + +wrl_installer_copy_local_repos() { + deploy_dir_rpm=$1 + target_build="$2" + target_image="$3" + + target_image_input_pkglist=$(sed -n 's/^IMAGE_LIST="\(.*\)"/\1/p' ${target_build}/installersupport_${target_image}) + if [ ! -f ${target_image_input_pkglist} ]; then + bberror "The target image pkglist '${target_image_input_pkglist}' doesn't exist!" + fi + + target_image_output_pkglist="${IMGDEPLOYDIR}/${IMAGE_NAME}.${target_image}.pkglist" + target_image_output_pkglist_link="${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${target_image}.pkglist" + + + if [ -d "$deploy_dir_rpm" ]; then + echo "Copy rpms from target build to installer image." + mkdir -p ${IMAGE_ROOTFS}/Packages.$prj_name + + : > ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo + echo "[general]" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo + echo "version = ${DISTRO_VERSION}" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo + + # Determine the max channel priority + channel_priority=5 + for pt in $installer_target_archs ; do + channel_priority=$(expr $channel_priority + 5) + done + + : > ${IMAGE_ROOTFS}/Packages.$prj_name/.feedpriority + for arch in $installer_target_archs; do + if [ -d "$deploy_dir_rpm/"$arch -a ! -d "${IMAGE_ROOTFS}/Packages.$prj_name/"$arch ]; then + channel_priority=$(expr $channel_priority - 5) + echo "$channel_priority $arch" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.feedpriority + fi + done + + cd ${deploy_dir_rpm} + set -x + # Add the packages in target image pkglist + cat ${target_image_input_pkglist} > ${target_image_output_pkglist}.tmp + + # Add the extra packages required by anaconda + for pkgs in ${REPO_EXTRA_PKG}; do + pkg_files=$(find . -type f -name ${pkgs}) + if [ -z "${pkg_files}" ]; then + bbwarn "Package ${pkgs} not found, please check if there is anything wrong or just remove it from the list." + else + for pkg_file in ${pkg_files}; do + basename ${pkg_file} >> ${target_image_output_pkglist}.tmp + done + fi + done + + cat ${target_image_output_pkglist}.tmp|sort|uniq > ${target_image_output_pkglist} + ln -s ${IMAGE_NAME}.${target_image}.pkglist ${target_image_output_pkglist_link} + rm -f ${target_image_output_pkglist}.tmp + + for pkg in $(cat ${target_image_output_pkglist}); do + pkg_file=$(find . -type f -name ${pkg}) + if [ -z "${pkg_file}" ]; then + bbwarn "Package ${pkg} not found, please check if there is anything wrong or just remove it from the list." + else + cp --parents -vf ${pkg_file} ${IMAGE_ROOTFS}/Packages.$prj_name/ + fi + done + cd - + + createrepo_c --update -q ${IMAGE_ROOTFS}/Packages.$prj_name/ + fi +} + +# Update .buildstamp and copy rpm packages to IMAGE_ROOTFS +wrl_installer_copy_pkgs() { + + target_build="$1" + target_image="$2" + prj_name="$3" + if [ -n "$4" ]; then + installer_conf="$4" + else + installer_conf="" + fi + + common_grep="-e '^ALL_MULTILIB_PACKAGE_ARCHS=.*' \ + -e '^MULTILIB_VARIANTS=.*' -e '^PACKAGE_ARCHS=.*'\ + -e '^PACKAGE_ARCH=.*' -e '^PACKAGE_INSTALL_ATTEMPTONLY=.*' \ + -e '^DISTRO=.*' -e '^DISTRO_NAME=.*' -e '^DISTRO_VERSION=.*' \ + " + + if [ -f "$installer_conf" ]; then + eval "grep -e \"^PACKAGE_INSTALL=.*\" $common_grep $installer_conf \ + | sed -e 's/=/=\"/' -e 's/$/\"/' > ${BB_LOGFILE}.distro_vals" + + eval "cat $target_build/installersupport_$target_image | \ + grep -e '^WORKDIR=.*' >> ${BB_LOGFILE}.distro_vals" + + eval `cat ${BB_LOGFILE}.distro_vals` + if [ $? -ne 0 ]; then + bbfatal "Something is wrong in $installer_conf, please correct it" + fi + if [ -z "$PACKAGE_ARCHS" -o -z "$PACKAGE_INSTALL" ]; then + bbfatal "PACKAGE_ARCHS or PACKAGE_INSTALL is null, please check $installer_conf" + fi + else + eval "cat $target_build/installersupport_$target_image | \ + grep $common_grep -e '^PN=.*' -e '^SUMMARY=.*' -e '^WORKDIR=.*'\ + -e '^DESCRIPTION=.*' -e '^export PACKAGE_INSTALL=.*' > ${BB_LOGFILE}.distro_vals" + + eval `cat ${BB_LOGFILE}.distro_vals` + fi + + export installer_default_arch="$PACKAGE_ARCH" + # Reverse it for priority + export installer_default_archs="`for arch in $PACKAGE_ARCHS; do echo $arch; done | tac | tr - _`" + installer_target_archs="$installer_default_archs" + if [ -n "$MULTILIB_VARIANTS" ]; then + export MULTILIB_VARIANTS + mlarchs_reversed="`for mlarch in $ALL_MULTILIB_PACKAGE_ARCHS; do echo $mlarch; \ + done | tac | tr - _`" + for arch in $mlarchs_reversed; do + if [ "$arch" != "noarch" -a "$arch" != "all" -a "$arch" != "any" ]; then + installer_target_archs="$installer_target_archs $arch" + fi + done + fi + export installer_target_archs + + # Save the vars to .buildstamp when no installer_conf + if [ ! -f "$installer_conf" ]; then + cat >> ${IMAGE_ROOTFS}/.buildstamp.$prj_name <<_EOF +DISTRO=$DISTRO +DISTRO_NAME=$DISTRO_NAME +DISTRO_VERSION=$DISTRO_VERSION + +[Rootfs] +LIST=$PN + +[$PN] +SUMMARY=$SUMMARY +DESCRIPTION=$DESCRIPTION + +PACKAGE_INSTALL=$PACKAGE_INSTALL +PACKAGE_INSTALL_ATTEMPTONLY=$PACKAGE_INSTALL_ATTEMPTONLY +ALL_MULTILIB_PACKAGE_ARCHS=$ALL_MULTILIB_PACKAGE_ARCHS +MULTILIB_VARIANTS=$MULTILIB_VARIANTS +PACKAGE_ARCHS=$PACKAGE_ARCHS +PACKAGE_ARCH=$PACKAGE_ARCH +IMAGE_LINGUAS=${IMAGE_LINGUAS} +_EOF + fi + + if [ -d "$WORKDIR/oe-rootfs-repo/rpm" ]; then + # Copy local repos while the image is not initramfs + bpn=${BPN} + if [ "${bpn##*initramfs}" = "${bpn%%initramfs*}" ]; then + wrl_installer_copy_local_repos $WORKDIR/oe-rootfs-repo/rpm $target_build $target_image + fi + echo "$DISTRO::$prj_name::$DISTRO_NAME::$DISTRO_VERSION" >> ${IMAGE_ROOTFS}/.target_build_list + fi +} + +wrl_installer_get_count() { + sum=0 + for i in $*; do + sum=$(expr $sum + 1) + done + echo $sum +} + +wrl_installer[vardepsexclude] = "DATETIME" +wrl_installer() { + cat >${IMAGE_ROOTFS}/.discinfo <<_EOF +${DATETIME} +${DISTRO_NAME} ${DISTRO_VERSION} +${TARGET_ARCH} +_EOF + + : > ${IMAGE_ROOTFS}/.target_build_list + counter=0 + targetimage_counter=0 + for target_build in ${INSTALLER_TARGET_BUILD}; do + target_build="`readlink -f $target_build`" + echo "Installer Target Build: $target_build" + counter=$(expr $counter + 1) + prj_name="`echo $target_build | sed -e 's#/ *$##g' -e 's#.*/##'`" + prj_name="$prj_name-$counter" + + # Generate .buildstamp + if [ -n "${WRL_INSTALLER_CONF}" ]; then + installer_conf="`echo ${WRL_INSTALLER_CONF} | awk '{print $'"$counter"'}'`" + wrl_installer_copy_buildstamp $prj_name $installer_conf + else + cat >${IMAGE_ROOTFS}/.buildstamp.$prj_name <<_EOF +[Main] +Product=${INSTPRODUCT} +Version=${INSTVER} +BugURL=${INSTBUGURL} +IsFinal=True +UUID=${DATETIME}.${TARGET_ARCH} +_EOF + fi + + if [ -f "$target_build" ]; then + filename=$(basename "$target_build") + extension="${filename##*.}" + bpn=${BPN} + # Do not copy image for initramfs + if [ "${bpn##*initramfs}" != "${bpn%%initramfs*}" ]; then + continue + elif [ "x$extension" = "xext2" -o "x$extension" = "xext3" -o "x$extension" = "xext4" ]; then + echo "Image based target install selected." + mkdir -p "${IMAGE_ROOTFS}/LiveOS.$prj_name" + wrl_installer_hardlinktree "$target_build" "${IMAGE_ROOTFS}/LiveOS.$prj_name/rootfs.img" + echo "::$prj_name::" >> ${IMAGE_ROOTFS}/.target_build_list + else + bberror "Unsupported image: $target_build." + bberror "The image must be ext2, ext3 or ext4" + exit 1 + fi + elif [ -d "$target_build" ]; then + targetimage_counter=$(expr $targetimage_counter + 1) + target_image="`echo ${INSTALLER_TARGET_IMAGE} | awk '{print $'"$targetimage_counter"'}'`" + echo "Target Image: $target_image" + wrl_installer_copy_pkgs $target_build $target_image $prj_name $installer_conf + else + bberror "Invalid configuration of INSTALLER_TARGET_BUILD: $target_build." + bberror "It must either point to an image (ext2, ext3 or ext4) or to the root of another build directory" + exit 1 + fi + + ks_cfg="${INSTALLER_CONFDIR}/ks.cfg.$prj_name" + if [ -n "${KICKSTART_FILE}" ]; then + ks_file="`echo ${KICKSTART_FILE} | awk '{print $'"$counter"'}'`" + bbnote "Copying kickstart file $ks_file to $ks_cfg ..." + mkdir -p ${INSTALLER_CONFDIR} + cp $ks_file $ks_cfg + fi + if [ -n "${KICKSTART_FILE_EXTRA}" ]; then + for ks_file in ${KICKSTART_FILE_EXTRA}; do + if [ -f $ks_file ]; then + cp $ks_file ${INSTALLER_CONFDIR} + else + bbwarn "The kickstart file $ks_file in KICKSTART_FILE_EXTRA doesn't exist!" + fi + done + fi + done + + # Setup the symlink if only one target build dir. + if [ "$counter" = "1" ]; then + prj_name="`awk -F:: '{print $2}' ${IMAGE_ROOTFS}/.target_build_list`" + entries=".buildstamp LiveOS Packages installer-config/ks.cfg" + for i in $entries; do + if [ -e ${IMAGE_ROOTFS}/$i.$prj_name ]; then + ln -sf `basename $i.$prj_name` ${IMAGE_ROOTFS}/$i + fi + done + fi +} + +python __anonymous() { + if "selinux" in d.getVar("DISTRO_FEATURES", True).split(): + raise bb.parse.SkipPackage("Unable to build the installer when selinux is enabled.") + + if bb.data.inherits_class('image', d): + if d.getVar("DISTRO", True) != "anaconda": + raise bb.parse.SkipPackage("Set DISTRO = 'anaconda' in local.conf") + + target_builds = d.getVar('INSTALLER_TARGET_BUILD', True) + if not target_builds: + errmsg = "No INSTALLER_TARGET_BUILD is found,\n" + errmsg += "set INSTALLER_TARGET_BUILD = '' and\n" + errmsg += "INSTALLER_TARGET_IMAGE = '' to do RPMs\n" + errmsg += "install, or\n" + errmsg += "set INSTALLER_TARGET_BUILD = '' to do\n" + errmsg += "image copy install" + raise bb.parse.SkipPackage(errmsg) + + count = 0 + for target_build in target_builds.split(): + if not os.path.exists(target_build): + raise bb.parse.SkipPackage("The %s of INSTALLER_TARGET_BUILD does not exist" % target_build) + + if os.path.isdir(target_build): + count += 1 + + # While do package management install + if count > 0: + target_images = d.getVar('INSTALLER_TARGET_IMAGE', True) + if not target_images: + errmsg = "The INSTALLER_TARGET_BUILD is a dir, but not found INSTALLER_TARGET_IMAGE,\n" + errmsg += "set INSTALLER_TARGET_IMAGE = '' to do RPMs install" + raise bb.parse.SkipPackage(errmsg) + + elif count != len(target_images.split()): + errmsg = "The INSTALLER_TARGET_BUILD has %s build dirs: %s\n" % (count, target_builds) + errmsg += "But INSTALLER_TARGET_IMAGE has %s build images: %s\n" % (len(target_images.split()), target_images) + raise bb.parse.SkipPackage(errmsg) + + # The count of INSTALLER_TARGET_BUILD and WRL_INSTALLER_CONF must match when set. + wrlinstaller_confs = d.getVar('WRL_INSTALLER_CONF', True) + if wrlinstaller_confs: + if len(wrlinstaller_confs.split()) != len(target_builds.split()): + raise bb.parse.SkipPackage("The count of INSTALLER_TARGET_BUILD and WRL_INSTALLER_CONF not match!") + for wrlinstaller_conf in wrlinstaller_confs.split(): + if not os.path.exists(wrlinstaller_conf): + raise bb.parse.SkipPackage("The installer conf %s in WRL_INSTALLER_CONF doesn't exist!" % wrlinstaller_conf) + + # The count of INSTALLER_TARGET_BUILD and KICKSTART_FILE must match when set. + kickstart_files = d.getVar('KICKSTART_FILE', True) + if kickstart_files: + if len(kickstart_files.split()) != len(target_builds.split()): + raise bb.parse.SkipPackage("The count of INSTALLER_TARGET_BUILD and KICKSTART_FILE not match!") + for kickstart_file in kickstart_files.split(): + if not os.path.exists(kickstart_file): + bb.warn("The kickstart file %s in KICKSTART_FILE doesn't exist!" % kickstart_file) + +} + +python build_syslinux_cfg () { + import copy + import sys + + workdir = d.getVar('WORKDIR') + if not workdir: + bb.error("WORKDIR not defined, unable to package") + return + + cfile = d.getVar('SYSLINUX_CFG') + if not cfile: + bb.fatal('Unable to read SYSLINUX_CFG') +}