File ignition-kargs-helper of Package ignition.24947

#!/bin/bash
# Based on Ignition's examples/ignition-kargs-helper

set -euxo pipefail

grubcfg="/sysroot/etc/default/grub"

# Mount root file system. Note that we mount /boot but we don't unmount it
# because we are run in a systemd unit with MountFlags=slave so it is unmounted
# for us.
. /dracut-state.sh
mount "${root#block:}" "${NEWROOT}"
# Also mount x-initrd.mount flagged mounts to get the current /etc state
awk '$4 ~ /x-initrd.mount/ { system("findmnt /sysroot" $2 " >/dev/null || mount -t " $3 " -o " $4 " " $1 " /sysroot" $2) }' /sysroot/etc/fstab

orig_kernelopts="$(grep GRUB_CMDLINE_LINUX_DEFAULT "${grubcfg}")"
orig_kernelopts="${orig_kernelopts#*=}"
# trim the leading and trailing quote
orig_kernelopts="${orig_kernelopts:1:-1}"

# add leading and trailing whitespace to allow for easy sed replacements
kernelopts=" $orig_kernelopts "

while [[ $# -gt 0 ]]
do
    key="$1"

    case $key in
    --should-exist)
        arg="$2"
        # don't repeat the arg
        if [[ ! "${kernelopts[*]}" =~ " ${arg} " ]]; then
            kernelopts="$kernelopts$arg "
        fi
        shift 2
        ;;
    --should-not-exist)
        kernelopts="$(echo "$kernelopts" | sed "s| $2 | |g")"
        shift 2
        ;;
    *)
        echo "Unknown option"
        exit 1
        ;;
    esac
done

# trim the leading and trailing whitespace
kernelopts="$(echo "$kernelopts" | sed -e 's,^[[:space:]]*,,' -e 's,[[:space:]]*$,,')"

# only apply the changes & reboot if changes have been made
if [[ "$kernelopts" != "$orig_kernelopts" ]]; then
    combustiondir="/run/combustion/mount/combustion"
    # The Combustion script may be located on an external device; if so the
    # device is guaranteed to mounted here already:
    #   combustion-prepare: Before=dracutinitqueue.service
    #   ignition-fetch: After=basic.target
    # Unmount the device, as the new Combustion script will be put at the
    # same location below.
    if findmnt "${combustiondir}"/.. >/dev/null; then
        umount "${combustiondir}"/..
    fi
    mkdir -p "${combustiondir}"
    # escape escapes to survive the multiple shell invocations
    kernelopts="${kernelopts//\\/\\\\\\\\}"
    kernelopts="${kernelopts//$/\\\$}"
    cat << EOF > "${combustiondir}/script"
sed -i "s|^\(GRUB_CMDLINE_LINUX_DEFAULT=\).*|\1\"$kernelopts\"|" /etc/default/grub
/usr/sbin/grub2-mkconfig > /boot/grub2/grub.cfg
EOF
    SYSTEMD_OFFLINE=1 combustion

    # Reset health-checker to prevent an unintended rollback
    echo "Clearing GRUB flag"
    chroot /sysroot grub2-editenv - set health_checker_flag=0 || true

    systemctl reboot --force
fi

openSUSE Build Service is sponsored by