80 lines
2.6 KiB
Bash
80 lines
2.6 KiB
Bash
#!/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
|
|
|