blobs/download: simplify downloading of files

individual functions for downloading each archive have
been removed. instead, eval is used in fetch_update(),
which is now renamed to fetch().

Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
Leah Rowe
2023-09-28 01:21:58 +01:00
parent 781d0a8091
commit e9e1a3b4ae
+59 -90
View File
@@ -70,44 +70,76 @@ build_dependencies()
download_blobs() download_blobs()
{ {
[ -z "${CONFIG_HAVE_ME_BIN}" ] || \ [ -z "${CONFIG_HAVE_ME_BIN}" ] || \
download_blob_intel_me || err "download_blobs ${board}: !me" fetch "intel_me" "${DL_url}" "${DL_url_bkup}" "${DL_hash}"
[ -z "${CONFIG_INCLUDE_SMSC_SCH5545_EC_FW}" ] || \ [ -z "${CONFIG_INCLUDE_SMSC_SCH5545_EC_FW}" ] || \
download_sch5545ec || err "download_blobs ${board}: !sch5545" fetch "sch5545ec" "${SCH5545EC_DL_url}" \
"${SCH5545EC_DL_url_bkup}" "${SCH5545EC_DL_hash}"
[ -z "${CONFIG_KBC1126_FIRMWARE}" ] || \ [ -z "${CONFIG_KBC1126_FIRMWARE}" ] || \
download_ec || err "download_blobs ${board}: kbc1126" fetch "kbc1126ec" "${EC_url}" "${EC_url_bkup}" "${EC_hash}"
[ -z "${CONFIG_VGA_BIOS_FILE}" ] || \ [ -z "${CONFIG_VGA_BIOS_FILE}" ] || \
download_e6400vga || err "download_blobs ${board}: !e6400vga" fetch "e6400vga" "${E6400_VGA_DL_url}" \
"${E6400_VGA_DL_url_bkup}" "${E6400_VGA_DL_hash}"
if [ ! -z "${CONFIG_HAVE_MRC}" ]; then if [ ! -z "${CONFIG_HAVE_MRC}" ]; then
./update blobs mrc || err "download_blobs ${board}: !mrc" ./update blobs mrc || err "download_blobs ${board}: !mrc"
fi fi
} }
download_blob_intel_me() fetch()
{ {
printf "Downloading neutered ME for board: %s\n" "${board}" dl_type="${1}"
dl="${2}"
dl_bkup="${3}"
dlsum="${4}"
fetch_update "${DL_url}" "${DL_url_bkup}" "${DL_hash}" dl_path="${blobdir}/cache/${dlsum}"
extract_blob_intel_me mkdir -p "${blobdir}/cache" || err "fetch: !mkdir ${blobdir}/cache"
dl_fail="y"
vendor_checksum "${dlsum}" && dl_fail="n"
for x in "${dl}" "${dl_bkup}"; do
[ "${dl_fail}" = "n" ] && break
[ -z "${x}" ] && continue
rm -f "${dl_path}" || err "fetch: !rm -f ${dl_path}"
wget --tries 3 -U "${agent}" "${x}" -O "${dl_path}" || continue
vendor_checksum "${dlsum}" && dl_fail="n"
done
if [ "${dl_fail}" = "y" ]; then
printf "ERROR: invalid vendor updates for: %s\n" "${board}" 1>&2
err "fetch ${dlsum}: matched vendor update unavailable"
fi
eval "extract_${dl_type}"
} }
extract_blob_intel_me() vendor_checksum()
{
if [ ! -f "${dl_path}" ]; then
printf "Vendor update not found for: %s\n" "${board}" 1>&2
return 1
elif [ "$(sha512sum ${dl_path} | awk '{print $1}')" != "${1}" ]; then
printf "Bad checksum on vendor update for: %s\n" "${board}" 1>&2
return 1
fi
}
extract_intel_me()
{ {
printf "Extracting neutered ME for %s\n" "${board}" printf "Extracting neutered ME for %s\n" "${board}"
_me_destination=${CONFIG_ME_BIN_PATH#../../} _me_destination=${CONFIG_ME_BIN_PATH#../../}
mkdirs "${_me_destination}" "extract_blob_intel_me" || return 0 mkdirs "${_me_destination}" "extract_intel_me" || return 0
bruteforce_extract_blob_intel_me "$(pwd)/${_me_destination}" \ bruteforce_extract_intel_me "$(pwd)/${_me_destination}" \
"$(pwd)/${appdir}" || \ "$(pwd)/${appdir}" || \
err "extract_blob_intel_me: could not extract Intel ME firmware" err "extract_intel_me: could not extract Intel ME firmware"
[ -f "${_me_destination}" ] || \ [ -f "${_me_destination}" ] || \
err "extract_blob_intel_me, ${board}: me.bin missing" err "extract_intel_me, ${board}: me.bin missing"
printf "Truncated and cleaned me output to: %s\n" "${_me_destination}" printf "Truncated and cleaned me output to: %s\n" "${_me_destination}"
} }
# cursed, carcinogenic code. TODO rewrite it better # cursed, carcinogenic code. TODO rewrite it better
bruteforce_extract_blob_intel_me() bruteforce_extract_intel_me()
{ {
_me_destination="${1}" _me_destination="${1}"
cdir="${2}" # must be an absolute path, not relative cdir="${2}" # must be an absolute path, not relative
@@ -120,7 +152,7 @@ bruteforce_extract_blob_intel_me()
( (
printf "Entering %s\n" "${cdir}" printf "Entering %s\n" "${cdir}"
cd "${cdir}" || \ cd "${cdir}" || \
err "bruteforce_extract_blob_intel_me: can't cd \"${cdir}\"" err "bruteforce_extract_intel_me: can't cd \"${cdir}\""
for i in *; do for i in *; do
if [ -f "${_me_destination}" ]; then if [ -f "${_me_destination}" ]; then
# me.bin found, so avoid needless further traversal # me.bin found, so avoid needless further traversal
@@ -138,10 +170,10 @@ bruteforce_extract_blob_intel_me()
&& break # (we found me.bin) && break # (we found me.bin)
_7ztest="${_7ztest}a" _7ztest="${_7ztest}a"
extract_archive "${i}" "${_7ztest}" || continue extract_archive "${i}" "${_7ztest}" || continue
bruteforce_extract_blob_intel_me "${_me_destination}" \ bruteforce_extract_intel_me "${_me_destination}" \
"${cdir}/${_7ztest}" "${cdir}/${_7ztest}"
elif [ -d "$i" ]; then elif [ -d "$i" ]; then
bruteforce_extract_blob_intel_me "${_me_destination}" \ bruteforce_extract_intel_me "${_me_destination}" \
"${cdir}/${i}" "${cdir}/${i}"
else else
printf "SKIPPING: %s\n" "${i}" printf "SKIPPING: %s\n" "${i}"
@@ -153,41 +185,33 @@ bruteforce_extract_blob_intel_me()
) )
rm -Rf "${sdir}" || \ rm -Rf "${sdir}" || \
err "bruteforce_extract_blob_intel_me: can't rm -Rf \"${sdir}\"" err "bruteforce_extract_intel_me: can't rm -Rf \"${sdir}\""
} }
download_ec() extract_kbc1126ec()
{
printf "Downloading KBC1126 EC firmware for HP laptop\n"
fetch_update "${EC_url}" "${EC_url_bkup}" "${EC_hash}"
extract_blob_kbc1126_ec
}
extract_blob_kbc1126_ec()
{ {
printf "Extracting KBC1126 EC firmware for board: %s\n" ${board} printf "Extracting KBC1126 EC firmware for board: %s\n" ${board}
_ec_destination=${CONFIG_KBC1126_FW1#../../} _ec_destination=${CONFIG_KBC1126_FW1#../../}
mkdirs "${_ec_destination}" "extract_blob_kbc1126_ec" || return 0 mkdirs "${_ec_destination}" "extract_kbc1126_ec" || return 0
( (
cd "${appdir}/" || \ cd "${appdir}/" || \
err "extract_blob_kbc1126_ec: !cd \"${appdir}/\"" err "extract_kbc1126_ec: !cd \"${appdir}/\""
mv Rompaq/68*.BIN ec.bin || : mv Rompaq/68*.BIN ec.bin || :
if [ ! -f ec.bin ]; then if [ ! -f ec.bin ]; then
unar -D ROM.CAB Rom.bin || \ unar -D ROM.CAB Rom.bin || \
unar -D Rom.CAB Rom.bin || \ unar -D Rom.CAB Rom.bin || \
unar -D 68*.CAB Rom.bin || \ unar -D 68*.CAB Rom.bin || \
err "extract_blob_kbc1126_ec: can't extract ec.bin" err "extract_kbc1126_ec: can't extract ec.bin"
mv Rom.bin ec.bin || \ mv Rom.bin ec.bin || \
err "extract_blob_kbc1126_ec: *didn't* extract ec.bin" err "extract_kbc1126_ec: *didn't* extract ec.bin"
fi fi
[ -f ec.bin ] || \ [ -f ec.bin ] || \
err "extract_blob_kbc1126_ec: ${board}: can't extract ec.bin" err "extract_kbc1126_ec: ${board}: can't extract ec.bin"
"${kbc1126_ec_dump}" ec.bin || \ "${kbc1126_ec_dump}" ec.bin || \
err "extract_blob_kbc1126_ec: ${board}: can't extract ecfw1/2.bin" err "extract_kbc1126_ec: ${board}: can't extract ecfw1/2.bin"
) )
ec_ex="y" ec_ex="y"
@@ -195,19 +219,10 @@ extract_blob_kbc1126_ec()
[ -f "${appdir}/ec.bin.fw${i}" ] || ec_ex="n" [ -f "${appdir}/ec.bin.fw${i}" ] || ec_ex="n"
done done
[ "${ec_ex}" = "y" ] || \ [ "${ec_ex}" = "y" ] || \
err "extract_blob_kbc1126_ec: ${board}: didn't extract ecfw1/2.bin" err "extract_kbc1126_ec: ${board}: didn't extract ecfw1/2.bin"
cp "${appdir}/"ec.bin.fw* "${_ec_destination%/*}/" || \ cp "${appdir}/"ec.bin.fw* "${_ec_destination%/*}/" || \
err "extract_blob_kbc1126_ec: cant mv ecfw1/2 ${_ec_destination%/*}" err "extract_kbc1126_ec: cant mv ecfw1/2 ${_ec_destination%/*}"
}
download_e6400vga()
{
printf "Downloading Nvidia VGA ROM for Dell Latitude E6400\n"
fetch_update "${E6400_VGA_DL_url}" "${E6400_VGA_DL_url_bkup}" \
"${E6400_VGA_DL_hash}"
extract_e6400vga
} }
extract_e6400vga() extract_e6400vga()
@@ -238,15 +253,6 @@ extract_e6400vga()
printf "E6400 Nvidia ROM saved to: %s\n" "${_vga_destination}" printf "E6400 Nvidia ROM saved to: %s\n" "${_vga_destination}"
} }
download_sch5545ec()
{
printf "Downloading SMSC SCH5545 Environment Controller firmware\n"
fetch_update "${SCH5545EC_DL_url}" "${SCH5545EC_DL_url_bkup}" \
"${SCH5545EC_DL_hash}"
extract_sch5545ec
}
# TODO: this code is cancer. hardcoded is bad, and stupid. # TODO: this code is cancer. hardcoded is bad, and stupid.
# TODO: make it *scan* (based on signature, in each file) # TODO: make it *scan* (based on signature, in each file)
extract_sch5545ec() extract_sch5545ec()
@@ -275,43 +281,6 @@ extract_sch5545ec()
err "extract_sch5545ec: cannot copy sch5545ec firmware file" err "extract_sch5545ec: cannot copy sch5545ec firmware file"
} }
fetch_update()
{
printf "Fetching vendor update for board: %s\n" "${board}"
dl="${1}"
dl_bkup="${2}"
dlsum="${3}"
dl_path="${blobdir}/cache/${dlsum}"
mkdir -p "${blobdir}/cache" || err "fetch_update: !mkdir ${blobdir}/cache"
dl_fail="y"
vendor_checksum "${dlsum}" && dl_fail="n"
for x in "${dl}" "${dl_bkup}"; do
[ "${dl_fail}" = "n" ] && break
[ -z "${x}" ] && continue
rm -f "${dl_path}" || err "fetch_update: !rm -f ${dl_path}"
wget --tries 3 -U "${agent}" "${x}" -O "${dl_path}" || continue
vendor_checksum "${dlsum}" && dl_fail="n"
done
if [ "${dl_fail}" = "y" ]; then
printf "ERROR: invalid vendor updates for: %s\n" "${board}" 1>&2
err "fetch_update ${dlsum}: matched vendor update unavailable"
fi
}
vendor_checksum()
{
if [ ! -f "${dl_path}" ]; then
printf "Vendor update not found for: %s\n" "${board}" 1>&2
return 1
elif [ "$(sha512sum ${dl_path} | awk '{print $1}')" != "${1}" ]; then
printf "Bad checksum on vendor update for: %s\n" "${board}" 1>&2
return 1
fi
}
mkdirs() mkdirs()
{ {
[ -f "${1}" ] && \ [ -f "${1}" ] && \