Skip to content

Commit

Permalink
Merge pull request #559 from heads105/fc30kexec2
Browse files Browse the repository at this point in the history
Parse grub config files for Fedora 29/30
  • Loading branch information
tlaurion authored May 3, 2019
2 parents 124ae91 + 73c6f3f commit 08ad2d4
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 0 deletions.
99 changes: 99 additions & 0 deletions initrd/bin/kexec-parse-bls
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#!/bin/sh
set -e -o pipefail
bootdir="$1"
file="$2"
blsdir="$3"
kernelopts=""

if [ -z "$bootdir" -o -z "$file" ]; then
die "Usage: $0 /boot /boot/grub/grub.cfg blsdir"
fi

reset_entry() {
name=""
kexectype="elf"
kernel=""
initrd=""
modules=""
append="$kernelopts"
}

filedir=`dirname $file`
bootdir="${bootdir%%/}"
bootlen="${#bootdir}"
appenddir="${filedir:$bootlen}"
# assumption. grubenv is in same location as config file
# ignored if doesn't exist
grubenv="$filedir/grubenv"

fix_path() {
path="$@"
if [ "${path:0:1}" != "/" ]; then
path="$appenddir/$path"
fi
}

echo_entry() {
if [ "$kexectype" = "elf" ]; then
if [ -z "$kernel" ]; then return; fi

fix_path $kernel
entry="$name|$kexectype|kernel $path"
if [ -n "$initrd" ]; then
fix_path $initrd
entry="$entry|initrd $path"
fi
if [ -n "$append" ]; then
entry="$entry|append $append"
fi

echo $(eval "echo \"$entry\"")
fi
if [ "$kexectype" = "multiboot" -o "$kexectype" = "xen" ]; then
if [ -z "$kernel" ]; then return; fi

fix_path $kernel
echo $(eval "echo \"$name|$kexectype|kernel $path$modules\"")
fi
}

bls_entry() {
# add info to menuentry
trimcmd=`echo $line | tr '\t ' ' ' | tr -s ' '`
cmd=`echo $trimcmd | cut -d\ -f1`
val=`echo $trimcmd | cut -d\ -f2-`
case $cmd in
title)
name=$val
;;
linux*)
kernel=$val
;;
initrd*)
initrd=$val
;;
options)
# default is "options $kernelopts"
# need to substitute that variable if set in .cfg/grubenv
append=`echo "$val" | sed "s@\\$kernelopts@$kernelopts@"`
;;
esac
}

# This is the default append value if no options field in bls entry
grep -q "set default_kernelopts" "$file" &&
kernelopts=`grep "set default_kernelopts" "$file" |
tr "'" "\"" | cut -d\" -f 2`
[ -f "$grubenv" ] && grep -q "^kernelopts" "$grubenv" &&
kernelopts=`grep "^kernelopts" "$grubenv" | tr '@' '_' | cut -d= -f 2-`
reset_entry
find $blsdir -type f -name \*.conf |
while read f
do
while read line
do
bls_entry
done < "$f"
echo_entry
reset_entry
done
8 changes: 8 additions & 0 deletions initrd/bin/kexec-select-boot
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,14 @@ scan_options() {
for i in `find $bootdir -name "$config"`; do
kexec-parse-boot "$bootdir" "$i" >> $option_file
done
# FC29/30+ may use BLS format grub config files
# https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault
# only parse these if $option_file is still empty
if [ ! -s $option_file ] && [ -d "$bootdir/loader/entries" ]; then
for i in `find $bootdir -name "$config"`; do
kexec-parse-bls "$bootdir" "$i" "$bootdir/loader/entries" >> $option_file
done
fi
if [ ! -r $option_file ]; then
die "Failed to parse any boot options"
fi
Expand Down

0 comments on commit 08ad2d4

Please sign in to comment.