diff options
| -rwxr-xr-x | script/update/blobs/download | 149 | 
1 files changed, 59 insertions, 90 deletions
| diff --git a/script/update/blobs/download b/script/update/blobs/download index c90a1ce4..773c66d1 100755 --- a/script/update/blobs/download +++ b/script/update/blobs/download @@ -70,44 +70,76 @@ build_dependencies()  download_blobs()  {  	[ -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}" ] || \ -		download_sch5545ec || err "download_blobs ${board}: !sch5545" +		fetch "sch5545ec" "${SCH5545EC_DL_url}" \ +		    "${SCH5545EC_DL_url_bkup}" "${SCH5545EC_DL_hash}"  	[ -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}" ] || \ -		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  		./update blobs mrc || err "download_blobs ${board}: !mrc"  	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}" -	extract_blob_intel_me +	dl_path="${blobdir}/cache/${dlsum}" +	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}"  	_me_destination=${CONFIG_ME_BIN_PATH#../../} -	mkdirs "${_me_destination}" "extract_blob_intel_me" || return 0 -	bruteforce_extract_blob_intel_me "$(pwd)/${_me_destination}" \ +	mkdirs "${_me_destination}" "extract_intel_me" || return 0 +	bruteforce_extract_intel_me "$(pwd)/${_me_destination}" \  	    "$(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}" ] || \ -		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}"  }  # cursed, carcinogenic code. TODO rewrite it better -bruteforce_extract_blob_intel_me() +bruteforce_extract_intel_me()  {  	_me_destination="${1}"  	cdir="${2}" # must be an absolute path, not relative @@ -120,7 +152,7 @@ bruteforce_extract_blob_intel_me()  	(  	printf "Entering %s\n" "${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  		if [ -f "${_me_destination}" ]; then  			# me.bin found, so avoid needless further traversal @@ -138,10 +170,10 @@ bruteforce_extract_blob_intel_me()  			    && break # (we found me.bin)  			_7ztest="${_7ztest}a"  			extract_archive "${i}" "${_7ztest}" || continue -			bruteforce_extract_blob_intel_me "${_me_destination}" \ +			bruteforce_extract_intel_me "${_me_destination}" \  			    "${cdir}/${_7ztest}"  		elif [ -d "$i" ]; then -			bruteforce_extract_blob_intel_me "${_me_destination}" \ +			bruteforce_extract_intel_me "${_me_destination}" \  			    "${cdir}/${i}"  		else  			printf "SKIPPING: %s\n" "${i}" @@ -153,41 +185,33 @@ bruteforce_extract_blob_intel_me()  	)  	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() -{ -	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() +extract_kbc1126ec()  {  	printf "Extracting KBC1126 EC firmware for board: %s\n" ${board}  	_ec_destination=${CONFIG_KBC1126_FW1#../../} -	mkdirs "${_ec_destination}" "extract_blob_kbc1126_ec" || return 0 +	mkdirs "${_ec_destination}" "extract_kbc1126_ec" || return 0  	(  	cd "${appdir}/" || \ -	    err "extract_blob_kbc1126_ec: !cd \"${appdir}/\"" +	    err "extract_kbc1126_ec: !cd \"${appdir}/\""  	mv Rompaq/68*.BIN ec.bin || :  	if [ ! -f ec.bin ]; then  		unar -D ROM.CAB Rom.bin || \  		    unar -D Rom.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 || \ -		    err "extract_blob_kbc1126_ec: *didn't* extract ec.bin" +		    err "extract_kbc1126_ec: *didn't* extract ec.bin"  	fi  	[ -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 || \ -	    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" @@ -195,19 +219,10 @@ extract_blob_kbc1126_ec()  		[ -f "${appdir}/ec.bin.fw${i}" ] || ec_ex="n"  	done  	[ "${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%/*}/" || \ -	    err "extract_blob_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 +	    err "extract_kbc1126_ec: cant mv ecfw1/2 ${_ec_destination%/*}"  }  extract_e6400vga() @@ -238,15 +253,6 @@ extract_e6400vga()  	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: make it *scan* (based on signature, in each file)  extract_sch5545ec() @@ -275,43 +281,6 @@ extract_sch5545ec()  	    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()  {  	[ -f "${1}" ] && \ | 
