From 89cbda741f033c7abce4881ac177acc05c6d6773 Mon Sep 17 00:00:00 2001
From: livio <livio@codeberg.org>
Date: Wed, 3 Apr 2024 01:11:35 +0200
Subject: [PATCH] Created boot media list for GRUB payload.

All media list functions got moved on mdet.cfg, changed lbmk build
file in order to include the file. Since it's not possible to delete
menu entries in GRUB, we have to load (and unload) a configuration
file. Everytime the boot list option is selected medias are scanned
and bootable menu entries are created (or updated).
---
 config/grub/config/grub.cfg | 157 ++----------------------------------
 config/grub/config/mdet.cfg | 147 +++++++++++++++++++++++++++++++++
 script/build/roms           |   3 +-
 3 files changed, 156 insertions(+), 151 deletions(-)
 create mode 100644 config/grub/config/mdet.cfg

diff --git a/config/grub/config/grub.cfg b/config/grub/config/grub.cfg
index 364a4caf..4395c5b6 100644
--- a/config/grub/config/grub.cfg
+++ b/config/grub/config/grub.cfg
@@ -60,100 +60,9 @@ fi
 
 # Default enums for non detectable medias. Override as you like, eventually.
 set partnums="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20"
+export partnums
 set medianums="20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0"
-
-# Loads into a variable all the medias from *
-function mediadetect {
-	unset media_devlist
-	set media_devlist=*
-}
-
-# Fills a variable containing possible partition list from a specified and previously detected physical media kind
-function list_pmedia {
-	unset tgt_medias
-	for media_item in ${media_devlist}; do
-		for device_kind in ${1}; do
-				for num in $medianums; do
-				# If media number is an existent detected media
-					if [ $media_item == "($device_kind$num)" ]; then
-					# Add raw media
-						tgt_medias="${tgt_medias} (${device_kind}${num})"
-					# Add every possible partition
-						for part in ${partnums}; do
-								tgt_medias="${tgt_medias} (${device_kind}${num},${part})"
-						done
-					fi
-				done
-		done
-	done
-	#echo $tgt_medias
-}
-
-# List of encrypted medias
-set lvm_crypt="crypt grubcrypt debian devuan"
-# List of logical volumes
-set lvm_volumes="boot root bootvol rootvol"
-
-# Fill LVM search list with every possible combination of media and volume
-set lvmnames=""
-for i in ${lvm_crypt}; do
-	for j in ${lvm_volumes}; do
-		lvmnames="${lvmnames} ${i}-${j}"
-	done
-done
-
-# Fills a variable containing possible partition list from a specified and previously detected logic media kind
-function list_lmedia {
-	unset tgt_medias
-	for media_item in $media_devlist; do
-		for device_kind in ${1}; do
-			for num in ${lvmnames}; do
-				if [ $media_item == "($device_kind/$num)" ]; then
-					tgt_medias="${tgt_medias} (${device_kind}/${num})"
-				fi
-			done
-		done
-	done
-	#echo $tgt_medias
-}
-
-# Create menuitems that boot any valid previously detected media
-function make_boot_menus {
-	for i in ${tgt_medias}; do
-		test -e ${i}
-		if [ $? == 0 ]; then # Media exists so we search there
-			grub_create_menu ${i} # Look for grub entries in known directories
-			isolinux_create_menu ${i}
-		fi
-		echo -n "."
-	done
-	echo
-}
-
-# Scan every physical media to make boot menus
-function scan_p_media_menus {
-	for i in ata ahci usb crypto fd; do
-		echo -n "Scanning ${i}"
-		list_pmedia ${i}
-		make_boot_menus
-	done
-}
-
-# Scan every logical media to make boot menus
-function scan_l_media_menus {
-	for i in lvm md; do
-		echo -n "Scanning ${i}"
-		list_lmedia ${i}
-		make_boot_menus
-	done
-}
-
-menuentry "List all bootable medias" {
-	mediadetect
-	cryptomount -a
-	scan_p_media_menus
-	scan_l_media_menus
-}
+export medianums
 
 # Default list of GRUB possible directories. The @/... entries are for cases where the BTRFS filesystem is being used
 set grub_dirs="" # Complete list of every possible grub directory, automatically filled later
@@ -170,33 +79,11 @@ for i in '' ${grub_dir_super}; do
 		done
 	done
 done
+export grub_dirs
 
 # Default list of GRUB possible config files prefixes
 set grub_conf_names="osboot_ autoboot_ libreboot_ coreboot_"
 
-# Creates a menuentry for GRUB. First argument is menu text without spaces then root and configfile
-function grub_menuentry {
-	menuentry "Boot GRUB from $1" ${1} ${2} ${3} {
-		set root="${2}"
-		unset superusers
-		configfile ${3}
-	}
-}
-
-function grub_create_menu {
-	set root="${1}"
-	for dir in ${grub_dirs}; do
-		# In order to save time, we do not attempt anything on non existing directory.
-		if [ -d /"${dir}"/ ]; then
-		for name in '' ${grub_conf_names}; do
-			if [ -f /"${dir}"/"${name}"grub.cfg ]; then
-				grub_menuentry ${1} /${dir}/${name}grub.cfg
-			fi
-		done
-		fi
-	done
-}
-
 function try_user_grub_config {
 	set root="${1}"
 	for dir in ${grub_dirs}; do
@@ -239,40 +126,7 @@ for i in '' ${isolinux_dir_super}; do
 		done
 	done
 done
-
-# Creates a menuentry for ISOLINUX. First argument is menu text without spaces then root and configfile
-function isolinux_menuentry {
-	menuentry "Boot ISOLINUX from $1" ${1} ${2} ${3} {
-		set root="${2}"
-		syslinux_configfile -i ${3}
-	}
-}
-
-# Pretty same as above function
-function syslinux_menuentry {
-	menuentry "Boot SYSLINUX from $1" ${1} ${2} ${3} {
-		set root="${2}"
-		syslinux_configfile -s ${3}
-	}
-}
-
-function isolinux_create_menu {
-	set root="${1}"
-	for dir in ${isolinux_dirs}; do
-		# In order to save time, we do not attempt anything on non existing directory.
-		if [ -d /"${dir}"/ ]; then
-			if [ -f "${dir}"/isolinux/isolinux.cfg ]; then
-				isolinux_menuentry ${1} "${dir}"/isolinux/isolinux.cfg
-			elif [ -f "${dir}"/syslinux/syslinux.cfg ]; then
-				syslinux_menuentry ${1} "${dir}"/syslinux/syslinux.cfg
-			elif [ -f "${dir}"/syslinux/extlinux.conf ]; then
-				syslinux_menuentry ${1} "${dir}"/syslinux/extlinux.conf
-			elif [ -f "${dir}"/extlinux/extlinux.conf ]; then
-				syslinux_menuentry ${1} "${dir}"/extlinux/extlinux.conf
-			fi
-		fi
-	done
-}
+export isolinux_dirs
 
 function try_isolinux_config {
 	set root="${1}"
@@ -377,6 +231,9 @@ menuentry 'Search for GRUB/SYSLINUX/EXTLINUX/ISOLINUX on AHCI  [a]' --hotkey='a'
 menuentry 'Search for GRUB/SYSLINUX/EXTLINUX/ISOLINUX on ATA/IDE  [d]' --hotkey='d' {
 	search_bootcfg ahci
 }
+menuentry "List all bootable medias  [l]" --hotkey='l' {
+	configfile (memdisk)/boot/grub/mdet.cfg
+}
 if [ -f (cbfsdisk)/grubtest.cfg ]; then
 menuentry 'Load test configuration (grubtest.cfg) inside of CBFS  [t]' --hotkey='t' {
 	set root='(cbfsdisk)'
diff --git a/config/grub/config/mdet.cfg b/config/grub/config/mdet.cfg
new file mode 100644
index 00000000..6a81dc58
--- /dev/null
+++ b/config/grub/config/mdet.cfg
@@ -0,0 +1,147 @@
+# Loads into a variable all the medias from *
+function mediadetect {
+	unset media_devlist
+	set media_devlist=*
+}
+
+# Fills a variable containing possible partition list from a specified and previously detected physical media kind
+function list_pmedia {
+	unset tgt_medias
+	for media_item in ${media_devlist}; do
+		for device_kind in ${1}; do
+				for num in $medianums; do
+				# If media number is an existent detected media
+					if [ $media_item == "($device_kind$num)" ]; then
+					# Add raw media
+						tgt_medias="${tgt_medias} (${device_kind}${num})"
+					# Add every possible partition
+						for part in ${partnums}; do
+								tgt_medias="${tgt_medias} (${device_kind}${num},${part})"
+						done
+					fi
+				done
+		done
+	done
+	#echo $tgt_medias
+}
+
+# List of encrypted medias
+set lvm_crypt="crypt grubcrypt debian devuan"
+# List of logical volumes
+set lvm_volumes="boot root bootvol rootvol"
+
+# Fill LVM search list with every possible combination of media and volume
+set lvmnames=""
+for i in ${lvm_crypt}; do
+	for j in ${lvm_volumes}; do
+		lvmnames="${lvmnames} ${i}-${j}"
+	done
+done
+
+# Fills a variable containing possible partition list from a specified and previously detected logic media kind
+function list_lmedia {
+	unset tgt_medias
+	for media_item in $media_devlist; do
+		for device_kind in ${1}; do
+			for num in ${lvmnames}; do
+				if [ $media_item == "($device_kind/$num)" ]; then
+					tgt_medias="${tgt_medias} (${device_kind}/${num})"
+				fi
+			done
+		done
+	done
+	#echo $tgt_medias
+}
+
+# Create menuitems that boot any valid previously detected media
+function make_boot_menus {
+	for i in ${tgt_medias}; do
+		test -e ${i}
+		if [ $? == 0 ]; then # Media exists so we search there
+			grub_create_menu ${i} # Look for grub entries in known directories
+			isolinux_create_menu ${i}
+		fi
+		echo -n "."
+	done
+	echo
+}
+
+# Scan every physical media to make boot menus
+function scan_p_media_menus {
+	for i in ata ahci usb crypto fd; do
+		echo -n "Scanning ${i}"
+		list_pmedia ${i}
+		make_boot_menus
+	done
+}
+
+# Scan every logical media to make boot menus
+function scan_l_media_menus {
+	for i in lvm md; do
+		echo -n "Scanning ${i}"
+		list_lmedia ${i}
+		make_boot_menus
+	done
+}
+
+# Creates a menuentry for GRUB. First argument is menu text without spaces then root and configfile
+function grub_menuentry {
+	menuentry "Boot GRUB from $1" ${1} ${2} ${3} {
+		set root="${2}"
+		unset superusers
+		configfile ${3}
+	}
+}
+
+function grub_create_menu {
+	set root="${1}"
+	for dir in ${grub_dirs}; do
+		# In order to save time, we do not attempt anything on non existing directory.
+		if [ -d /"${dir}"/ ]; then
+		for name in '' ${grub_conf_names}; do
+			if [ -f /"${dir}"/"${name}"grub.cfg ]; then
+				grub_menuentry ${1} /${dir}/${name}grub.cfg
+			fi
+		done
+		fi
+	done
+}
+
+# Creates a menuentry for ISOLINUX. First argument is menu text without spaces then root and configfile
+function isolinux_menuentry {
+	menuentry "Boot ISOLINUX from $1" ${1} ${2} ${3} {
+		set root="${2}"
+		syslinux_configfile -i ${3}
+	}
+}
+
+# Pretty same as above function
+function syslinux_menuentry {
+	menuentry "Boot SYSLINUX from $1" ${1} ${2} ${3} {
+		set root="${2}"
+		syslinux_configfile -s ${3}
+	}
+}
+
+function isolinux_create_menu {
+	set root="${1}"
+	for dir in ${isolinux_dirs}; do
+		# In order to save time, we do not attempt anything on non existing directory.
+		if [ -d /"${dir}"/ ]; then
+			if [ -f "${dir}"/isolinux/isolinux.cfg ]; then
+				isolinux_menuentry ${1} "${dir}"/isolinux/isolinux.cfg
+			elif [ -f "${dir}"/syslinux/syslinux.cfg ]; then
+				syslinux_menuentry ${1} "${dir}"/syslinux/syslinux.cfg
+			elif [ -f "${dir}"/syslinux/extlinux.conf ]; then
+				syslinux_menuentry ${1} "${dir}"/syslinux/extlinux.conf
+			elif [ -f "${dir}"/extlinux/extlinux.conf ]; then
+				syslinux_menuentry ${1} "${dir}"/extlinux/extlinux.conf
+			fi
+		fi
+	done
+}
+
+mediadetect
+cryptomount -a
+scan_p_media_menus
+scan_l_media_menus
diff --git a/script/build/roms b/script/build/roms
index a90e1daa..db7bcce9 100755
--- a/script/build/roms
+++ b/script/build/roms
@@ -163,7 +163,8 @@ build_grub_payload()
 	    --modules="${grub_modules}" \
 	    --install-modules="${grub_install_modules}" \
 	    "/boot/grub/grub.cfg=${grubcfgsdir}/config/grub_memdisk.cfg" \
-	    "/boot/grub/grub_default.cfg=${grubcfgsdir}/config/grub.cfg" || \
+	    "/boot/grub/grub_default.cfg=${grubcfgsdir}/config/grub.cfg" \
+	    "/boot/grub/mdet.cfg=${grubcfgsdir}/config/mdet.cfg" || \
 	    $err "could not generate grub.elf"
 }
 
-- 
GitLab