# Libiquity firmware distribution # # Copyright (C) 2015 Patrick "P. J." McDermott # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . dist_libiquity_get_name() { printf 'Libiquity' return 0 } dist_libiquity_get_mirrors() { cat <<-EOF http://files.libiquity.com/pub/libreboot/ Libiquity, USA EOF return 0 } dist_libiquity_get_versions() { local mirror="${1}" local board="${2}" shift 2 local versions='' local version= if ! versions="$(dl "${mirror}/Manifest")"; then err 'Failed to download list of firmware versions' return 1 fi IFS="${LF}" for version in ${versions}; do unset IFS case "${version}" in 'libiquity-20150501') # This version had unique ROM organization. # Let's not bother supporting it. continue ;; taurinus-201506*) sums='SHA512SUMS' archive="./rom/libreboot_${version}_${board}" archive="${archive}.tar.xz" ;; *) sums='SHA512SUMS' archive="./rom/grub/libreboot_${version}" archive="${archive}_grub_${board}.tar.xz" ;; esac if dl "${mirror}/${version}/${sums}" | \ grep -F " ${archive}" >/dev/null 2>&1; then versions="${versions} ${version}" fi done unset IFS printf '%s ' ${versions} return 0 } dist_libiquity_get_rom_taurinus_201506() { local mirror="${1}" local version="${2}" local board="${3}" shift 3 local archive= local sum= local arc_sum= local dir= local rom='' local keymaps='' local i=0 # Download checksums and ROMs archive. archive="libreboot_${version}_${board}.tar.xz" if ! sum="$(dl_temp "${mirror}/${version}/SHA512SUMS" 'sums')"; then err 'Failed to download checksums' rm_temp 'sums' fi sum="$(grep -F " ./rom/${archive}" "${sum}" | cut -d ' ' -f 1)" if ! archive="$(dl_temp "${mirror}/${version}/rom/${archive}" \ 'roms')"; then err 'Failed to download ROMs archive' rm_temp 'sums' rm_temp 'roms' fi # Verify checksum. arc_sum="$(${SHA512SUM} "${archive}" | cut -d ' ' -f 1)" if [ "x${arc_sum}" != "x${sum}" ]; then err 'ROM archive checksum mismatch' rm_temp 'sums' rm_temp 'roms' return 1 fi # Select keymap. dir="${board}" while read -r rom; do case "${rom}" in ${dir}/${board}_*_vesafb.rom) rom="${rom#${dir}/${board}_}" rom="${rom%_vesafb.rom}" keymaps="${keymaps} ${rom}" ;; esac done <<-EOF $(unxz -c "${archive}" | tar -t) EOF i=$(show_menu 'Select keymap' $(printf '%s\n' ${keymaps} | sort)) i=$(($i + 1)) rom="$(printf '%s ' ${keymaps} | cut -d ' ' -f ${i})" rom="${dir}/${board}_${rom}_vesafb.rom" dbg 'Using ROM "%s"' "${rom}" # Extract ROM. if ! unxz -c "${archive}" | tar -xO "${rom}" >"$(get_temp_dir)/rom" then err 'Failed to extract ROM' rm_temp 'sums' rm_temp 'roms' rm_temp 'rom' fi rm_temp 'sums' rm_temp 'roms' return 0 } dist_libiquity_get_rom_current() { local mirror="${1}" local version="${2}" local board="${3}" shift 3 local archive= local sum= local arc_sum= local dir= local rom='' local keymaps='' local i=0 # Download checksums and ROMs archive. archive="libreboot_${version}_grub_${board}.tar.xz" if ! sum="$(dl_temp "${mirror}/${version}/SHA512SUMS" 'sums')"; then err 'Failed to download checksums' rm_temp 'sums' fi sum="$(grep -F " ./rom/grub/${archive}" "${sum}" | cut -d ' ' -f 1)" if ! archive="$(dl_temp "${mirror}/${version}/rom/grub/${archive}" \ 'roms')"; then err 'Failed to download ROMs archive' rm_temp 'sums' rm_temp 'roms' fi # Verify checksum. arc_sum="$(${SHA512SUM} "${archive}" | cut -d ' ' -f 1)" if [ "x${arc_sum}" != "x${sum}" ]; then err 'ROM archive checksum mismatch' rm_temp 'sums' rm_temp 'roms' return 1 fi # Select keymap. dir="libreboot_${version}_grub_${board}" while read -r rom; do case "${rom}" in ${dir}/${board}_*_vesafb.rom) rom="${rom#${dir}/${board}_}" rom="${rom%_vesafb.rom}" keymaps="${keymaps} ${rom}" ;; esac done <<-EOF $(unxz -c "${archive}" | tar -t) EOF i=$(show_menu 'Select keymap' $(printf '%s\n' ${keymaps} | sort)) i=$(($i + 1)) rom="$(printf '%s ' ${keymaps} | cut -d ' ' -f ${i})" rom="${dir}/${board}_${rom}_vesafb.rom" dbg 'Using ROM "%s"' "${rom}" # Extract ROM. if ! unxz -c "${archive}" | tar -xO "${rom}" >"$(get_temp_dir)/rom" then err 'Failed to extract ROM' rm_temp 'sums' rm_temp 'roms' rm_temp 'rom' fi rm_temp 'sums' rm_temp 'roms' return 0 } dist_libiquity_get_rom() { local mirror="${1}" local version="${2}" local board="${3}" shift 3 case "${version}" in taurinus-201506*) if dist_libiquity_get_rom_taurinus_201506 "${mirror}" \ "${version}" "${board}"; then return 0 else return 1 fi ;; *) if dist_libiquity_get_rom_current "${mirror}" \ "${version}" "${board}"; then return 0 else return 1 fi ;; esac }