diff --git a/include/init.sh b/include/init.sh index 8321fb1..0ddd036 100644 --- a/include/init.sh +++ b/include/init.sh @@ -16,7 +16,7 @@ xbmkpath="$PATH" eval "`setvars "" _nogit board reinstall versiondate aur_notice configdir \ datadir version xbmkpwd relname xbmkpwd xbmktmp python pyver xbmklocal \ - xbmklock`" + xbmklock cvxbmk cvchk`" xbmk_init() { diff --git a/include/inject.sh b/include/inject.sh index 22ff895..d5015ed 100644 --- a/include/inject.sh +++ b/include/inject.sh @@ -4,68 +4,81 @@ # Copyright (c) 2023-2025 Leah Rowe cbcfgsdir="config/coreboot" -hashfiles="vendorhashes blobhashes" # used to detect and error out - # if running on an archive that needs vendor files -dontflash="!!! AN ERROR OCCURED! Do NOT flash these images !!!" +hashfiles="vendorhashes blobhashes" # blobhashes for backwards compatibility +dontflash="!!! AN ERROR OCCURED! Please DO NOT flash if injection failed. !!!" +vfix="DO_NOT_FLASH_YET._FIRST,_INJECT_FILES_VIA_INSTRUCTIONS_ON_LIBREBOOT.ORG_" tmpromdel="$xbmklocal/DO_NOT_FLASH" nvm="util/nvmutil/nvm" ifdtool="elf/ifdtool/default/ifdtool" +cv="CONFIG_GBE_BIN_PATH" +[ -n "$cvxbmk" ] && cv="$cv $cvxbmk" +[ -n "$cvchk" ] && cv="$cv $cvchk" + +eval "`setvars "" archive boarddir cbdir IFD_platform ifdprefix tree new_mac \ + tmpromdir $cv`" + inject() { remkdir "$tmpromdel" set +u +e [ $# -lt 1 ] && err "No options specified. - $dontflash" - eval "`setvars "" new_mac xchanged`" + eval "`setvars "" nukemode new_mac xchanged`" archive="$1"; new_mac="xx:xx:xx:xx:xx:xx" [ $# -gt 1 ] && case "$2" in + nuke) + new_mac="" + nukemode="nuke" ;; setmac) [ $# -gt 2 ] && new_mac="$3" && \ [ -z "$new_mac" ] && err "Empty MAC address specified" ;; - *) err "Unrecognised inject mode: '$2'" + *) + err "Unrecognised inject mode: '$2'" esac + [ "$new_mac" = "keep" ] && new_mac="" [ -n "$new_mac" ] && [ "$new_mac" != "restore" ] && \ x_ make -C util/nvmutil clean && x_ make -C util/nvmutil - check_release "$archive" || err "'$archive' is not a release archive" + check_release + check_target && patch_release - if readcfg && readkconfig; then - patch_release_roms - fi + [ "$xchanged" = "y" ] && remktar - [ "$xchanged" != "y" ] && printf "\n'%s' *NOT* modified.\n" "$archive" - [ "$xchanged" = "y" ] && printf "\n'%s' %s.\n" "$archive" "$xtype"; : + xnot=" NOT" && [ "$xchanged" = "y" ] && xnot="" + printf "\n'%s' was%s modified\n" "$archive" "$xnot" 1>&2 + + x_ rm -Rf "$tmpromdel" } check_release() { [ -L "$archive" ] && err "'$archive' is a symlink. $dontflash" - e "$archive" f missing && return 1 + e "$archive" f missing && err "'$archive' missing" - archivename="`basename "$archive"`" + archivename="`basename "$archive"`" || err "Can't get '$archive' name" [ -z "$archivename" ] && err "Can't determine archive name. $dontflash" case "$archivename" in *_src.tar.xz) err "'$archive' is a src archive, silly!" ;; grub_*|seagrub_*|custom_*|seauboot_*|seabios_withgrub_*) - return 1 ;; + err "'$archive' is a ROM image (it must be a tarball)" ;; *.tar.xz) _stripped_prefix="${archivename#*_}" board="${_stripped_prefix%.tar.xz}" ;; - *) err "'$archive': could not detect board type - $dontflash" + *) + err "'$archive': could not detect board type - $dontflash" esac; : } -readcfg() +check_target() { if [ "$board" = "serprog_rp2040" ] || [ "$board" = "serprog_stm32" ] \ || [ "$board" = "serprog_pico" ]; then - printf "'%s' is a serprog firmware archive.\n" "$archive" 1>&2 return 1 fi boarddir="$cbcfgsdir/$board" @@ -81,6 +94,24 @@ readcfg() [ -n "$IFD_platform" ] && ifdprefix="-p $IFD_platform"; : } +patch_release() +{ + has_hashes="n" + tmpromdir="$xbmklocal/DO_NOT_FLASH/bin/$board" + + remkdir "${tmpromdir%"/bin/$board"}" + x_ tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}" + + for _hashes in $hashfiles; do + e "$tmpromdir/$_hashes" f && err \ + "'$archive': vendorfile insertion unsupported" + done + + readkconfig || exit 0 + + [ -n "$new_mac" ] && [ -n "$CONFIG_GBE_BIN_PATH" ] && modify_mac; : +} + readkconfig() { x_ rm -f "$xbmktmp/cbcfg" @@ -95,31 +126,6 @@ scankconfig() done } -patch_release_roms() -{ - tmpromdir="$xbmklocal/DO_NOT_FLASH/bin/$board" - - remkdir "${tmpromdir%"/bin/$board"}" - x_ tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}" - - for _hashes in $hashfiles; do - e "$tmpromdir/$_hashes" f && err \ - "'$archive': vendorfile insertion unsupported; $dontflash" - done - - [ -z "$new_mac" ] || [ -z "$CONFIG_GBE_BIN_PATH" ] || modify_mac - - [ "$xchanged" = "y" ] || rm -Rf "$tmpromdel" || : - [ "$xchanged" = "y" ] || return 0 - ( - x_ cd "${tmpromdir%"/bin/$board"}" - mkrom_tarball "bin/$board" - ) || err "Cannot re-generate '$archive' - $dontflash" - - mv "${tmpromdir%"/bin/$board"}/bin/${relname}_${board}.tar.xz" \ - "$archive" || err "'$archive' -> Can't overwrite - $dontflash"; : -} - modify_mac() { x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbmklocal/gbe" @@ -134,3 +140,14 @@ newmac() e "$1" f && xchanged="y" && x_ \ "$ifdtool" $ifdprefix -i GbE:"$xbmklocal/gbe" "$1" -O "$1"; : } + +remktar() +{ + ( + x_ cd "${tmpromdir%"/bin/$board"}" + mkrom_tarball "bin/$board" + ) || err "Cannot re-generate '$archive' - $dontflash" + + mv "${tmpromdir%"/bin/$board"}/bin/${relname}_${board}.tar.xz" \ + "$archive" || err "'$archive' -> Can't overwrite"; : +}