3 # SPDX-License-Identifier: GPL-2.0-only
5 # On some systems, `parted` and `debugfs` are located in /sbin.
6 export PATH
="$PATH:/sbin"
8 exit_if_uninstalled
() {
10 local deb_pkg_name
="$2"
12 if type "$cmd_name" >/dev
/null
2>&1; then
16 printf '`%s` was not found. ' "$cmd_name" >&2
17 printf 'On Debian-based systems, it can be installed\n' >&2
18 printf 'by running `apt install %s`.\n' "$deb_pkg_name" >&2
23 exit_if_dependencies_are_missing
() {
24 exit_if_uninstalled
"uudecode" "sharutils"
25 exit_if_uninstalled
"debugfs" "e2fsprogs"
26 exit_if_uninstalled
"parted" "parted"
27 exit_if_uninstalled
"curl" "curl"
28 exit_if_uninstalled
"unzip" "unzip"
33 _url
=https
://dl.google.com
/dl
/edgedl
/chromeos
/recovery
/recovery.conf
35 echo "Downloading recovery image inventory..."
37 curl
-s "$_url" >$_conf
44 echo "Downloading recovery image"
45 curl
"$_url" >"$_file.zip"
46 echo "Decompressing recovery image"
57 echo "Extracting ROOT-A partition"
58 ROOTP
=$
(printf "unit\nB\nprint\nquit\n" |
59 parted
$FILE 2>/dev
/null |
grep $NAME)
61 if [ "$ROOTP" == "" ]; then
62 # Automatic extraction failed, likely due to parted detecting
63 # overlapping partitions. Fall back to using fdisk and assume
64 # ROOT-A is partition #3
65 echo "(Extracting via parted failed; falling back to fdisk)"
66 _ssize
=$
(printf "p q" | fdisk
$FILE |
grep "Sector size" |
67 cut
-f2 -d: | cut
-f2 -d ' ')
68 _start
=$
(printf "p q" | fdisk
$FILE |
grep "bin3" |
tr -s ' ' |
70 _nsec
=$
(printf "p q" | fdisk
$FILE |
grep "bin3" |
tr -s ' ' |
72 START
=$
(($_ssize * $_start))
73 SIZE
=$
(($_ssize * $_nsec))
75 START
=$
(($
(echo $ROOTP | cut
-f2 -d\ |
tr -d "B")))
76 SIZE
=$
(($
(echo $ROOTP | cut
-f4 -d\ |
tr -d "B")))
79 dd if=$FILE of
=$ROOTFS bs
=$_bs skip
=$
(($START / $_bs)) \
80 count
=$
(($SIZE / $_bs)) >/dev
/null
2>&1
87 echo "Extracting chromeos-firmwareupdate"
88 printf "cd /usr/sbin\ndump chromeos-firmwareupdate $SHELLBALL\nquit" |
89 debugfs
$ROOTFS >/dev
/null
2>&1
94 _unpacked
=$
(mktemp
-d)
96 echo "Extracting coreboot image"
97 if ! sh
$_shellball --unpack $_unpacked >/dev
/null
2>&1; then
98 sh
$_shellball --sb_extract $_unpacked >/dev
/null
2>&1
101 if [ -d $_unpacked/models
/ ]; then
102 _version
=$
(cat $_unpacked/VERSION |
grep -m 1 -e Model.
*$_board -A5 |
103 grep "BIOS (RW) version:" | cut
-f2 -d: |
tr -d \
)
104 if [ "$_version" == "" ]; then
105 _version
=$
(cat $_unpacked/VERSION |
grep -m 1 -e Model.
*$_board -A5 |
106 grep "BIOS version:" | cut
-f2 -d: |
tr -d \
)
108 _bios_image
=$
(grep "IMAGE_MAIN" $_unpacked/models
/$_board/setvars.sh |
110 elif [ -f "$_unpacked/manifest.json" ]; then
111 _version
=$
(grep -m1 -A1 "$BOARD" "$_unpacked/manifest.json" |
grep "host" | cut
-f12 -d'"')
112 _bios_image
=$
(grep -m1 -A3 "$BOARD" "$_unpacked/manifest.json" |
grep "image" | cut
-f4 -d'"')
114 _version
=$
(cat $_unpacked/VERSION |
grep BIOS\ version
: |
115 cut
-f2 -d: |
tr -d \
)
118 if cp $_unpacked/$_bios_image coreboot-
$_version.bin
; then
119 echo "Extracted coreboot-$_version.bin"
130 download_image
$_url $_file
132 extract_partition ROOT-A
$_file root-a.ext2
133 extract_shellball root-a.ext2 chromeos-firmwareupdate-
$_board
134 rm $_file root-a.ext2
136 extract_coreboot chromeos-firmwareupdate-
$_board
145 exit_if_dependencies_are_missing
147 if [ "$BOARD" == "all" ]; then
151 grep ^name
= $CONF |
while read _line
; do
152 name
=$
(echo $_line | cut
-f2 -d=)
153 echo Processing board
$name
154 eval $
(grep -v hwid
= $CONF |
grep -A11 "$_line" |
155 grep '\(url=\|file=\)')
156 BOARD
=$
(echo $url | cut
-f3 -d_)
157 do_one_board
$BOARD $url $file
161 elif [ "$BOARD" != "" ]; then
165 echo Processing board
$BOARD
166 eval $
(grep -i $BOARD -A8 $CONF |
grep '\(url=\|file=\)')
167 do_one_board
$BOARD $url $file
171 echo "Usage: $0 <boardname>"