Files
lbmk/include/inject.sh
Leah Rowe d5351aee37 inject: fix mac address insertion
during previous re-factoring, i sorted variable initialisations.

that was all well and good, but prior to that, i initialised
the new_mac string to empty at first, and then to
the "xx" letters; the latter made the first initialisation
redundant, but in the re-factoring, I put the blanking of
the string afterward.

this disabled mac address insertion, because the way the script
works is precisely to avoid mac address insertion when the mac
string is empty. this is used when running the "nuke" command.

silly me.

yes, i'm very silly. very very silly. so silly.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2025-12-25 13:41:37 +01:00

234 lines
4.4 KiB
Bash

# SPDX-License-Identifier: GPL-3.0-only
# Copyright (c) 2022 Caleb La Grange <thonkpeasant@protonmail.com>
# Copyright (c) 2022 Ferass El Hafidi <vitali64pmemail@protonmail.com>
# Copyright (c) 2023-2025 Leah Rowe <leah@libreboot.org>
cbcfgsdir="config/coreboot"
tmpromdel="$XBMK_CACHE/DO_NOT_FLASH"
nvm="util/nvmutil/nvm"
ifdtool="elf/coreboot/default/ifdtool"
checkvars="CONFIG_GBE_BIN_PATH"
if [ -n "$checkvarsxbmk" ]; then
checkvars="$checkvars $checkvarsxbmk"
fi
if [ -n "$checkvarschk" ]; then
checkvars="$checkvars $checkvarschk"
fi
archive=""
board=""
boarddir=""
IFD_platform=""
ifdprefix=""
new_mac=""
tmpromdir=""
tree=""
xchanged=""
eval "`setvars "" $checkvars`"
inject()
{
remkdir "$tmpromdel"
if [ $# -lt 1 ]; then
err "No options specified" "inject" "$@"
fi
archive="$1";
new_mac="xx:xx:xx:xx:xx:xx"
nuke=""
xchanged=""
[ $# -gt 1 ] && case "$2" in
nuke)
new_mac=""
nuke="nuke"
;;
setmac)
if [ $# -gt 2 ]; then
new_mac="$3" && \
if [ -z "$new_mac" ]; then
err "Empty MAC address specified" "inject" "$@"
fi
fi
;;
*)
err "Unrecognised inject mode: '$2'" "inject" "$@" ;;
esac
if [ "$new_mac" = "keep" ]; then
new_mac=""
fi
check_release
if check_target; then
if ! patch_release; then
return 0
fi
fi
if [ "$xchanged" = "y" ]; then
remktar
fi
if [ "$xchanged" = "y" ]; then
printf "\n'%s' was modified\n" "$archive" 1>&2
else
printf "\n'%s' was NOT modified\n" "$archive" 1>&2
fi
x_ rm -Rf "$tmpromdel"
}
check_release()
{
if [ -L "$archive" ]; then
err "'$archive' is a symlink" "check_release" "$@"
fi
if e "$archive" f missing; then
err "'$archive' missing" "check_release" "$@"
fi
archivename="`basename "$archive" || err "Can't get '$archive' name"`" \
|| err "can't get '$archive' name" "check_release" "$@"
if [ -z "$archivename" ]; then
err "Can't determine archive name" "check_release" "$@"
fi
case "$archivename" in
*_src.tar.xz)
err "'$archive' is a src archive!" "check_release" "$@"
;;
grub_*|seagrub_*|custom_*|seauboot_*|seabios_withgrub_*)
err "'$archive' is a ROM image" "check_release" "$@"
;;
*.tar.xz) _stripped_prefix="${archivename#*_}"
board="${_stripped_prefix%.tar.xz}"
;;
*)
err "'$archive': cannot detect board" "check_release" "$@"
;;
esac; :
}
check_target()
{
if [ "$board" != "${board#serprog_}" ]; then
return 1
fi
boarddir="$cbcfgsdir/$board"
. "$boarddir/target.cfg" || \
err "Can't read '$boarddir/target.cfg'" "check_target" "$@"
if [ -z "$tree" ]; then
err "tree unset in '$boarddir/target.cfg'" "check_target" "$@"
fi
x_ ./mk -d coreboot "$tree"
ifdtool="elf/coreboot/$tree/ifdtool"
if [ -n "$IFD_platform" ]; then
ifdprefix="-p $IFD_platform"
fi
}
patch_release()
{
if [ "$nuke" != "nuke" ]; then
x_ ./mk download "$board"
fi
has_hashes="n"
tmpromdir="$tmpromdel/bin/$board"
remkdir "${tmpromdir%"/bin/$board"}"
x_ tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}"
for _hashes in "vendorhashes" "blobhashes"; do
if e "$tmpromdir/$_hashes" f; then
has_hashes="y"
hashfile="$_hashes"
break
fi
done
if ! readkconfig; then
return 1
elif [ -n "$new_mac" ] && [ -n "$CONFIG_GBE_BIN_PATH" ]; then
modify_mac
fi
}
readkconfig()
{
x_ rm -f "$xbtmp/cbcfg"
fx_ scankconfig x_ find "$boarddir/config" -type f
if e "$xbtmp/cbcfg" f missing; then
return 1
fi
. "$xbtmp/cbcfg" || \
err "Can't read '$xbtmp/cbcfg'" "readkconfig" "$@"
if ! setvfile "$@"; then
return 1
fi
}
scankconfig()
{
for cbc in $checkvars; do
grep "$cbc" "$1" 2>/dev/null 1>>"$xbtmp/cbcfg" || :
done
}
modify_mac()
{
x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbtmp/gbe"
if [ -n "$new_mac" ] && [ "$new_mac" != "restore" ]; then
x_ make -C util/nvmutil clean
x_ make -C util/nvmutil
x_ "$nvm" "$xbtmp/gbe" setmac "$new_mac"
fi
fx_ newmac x_ find "$tmpromdir" -maxdepth 1 -type f -name "*.rom"
printf "\nThe following GbE NVM data will be written:\n"
x_ "$nvm" "$xbtmp/gbe" dump | grep -v "bytes read from file" || :
}
newmac()
{
if e "$1" f; then
xchanged="y"
x_ "$ifdtool" $ifdprefix -i GbE:"$xbtmp/gbe" "$1" -O "$1"
fi
}
remktar()
{
(
x_ cd "${tmpromdir%"/bin/$board"}"
printf "Re-building tar archive (please wait)\n"
mkrom_tarball "bin/$board" 1>/dev/null
) || err "Cannot re-generate '$archive'" "remktar" "$@"
mv "${tmpromdir%"/bin/$board"}/bin/${relname}_${board}.tar.xz" \
"$archive" || \
err "'$archive' -> Can't overwrite" "remktar" "$@"; :
}