xref: /aosp_15_r20/external/vboot_reference/scripts/image_signing/common.sh (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker#!/bin/bash
2*8617a60dSAndroid Build Coastguard Worker#
3*8617a60dSAndroid Build Coastguard Worker# Copyright 2011 The ChromiumOS Authors
4*8617a60dSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
5*8617a60dSAndroid Build Coastguard Worker# found in the LICENSE file.
6*8617a60dSAndroid Build Coastguard Worker
7*8617a60dSAndroid Build Coastguard Worker# shellcheck disable=SC2039,SC2059,SC2155
8*8617a60dSAndroid Build Coastguard Worker
9*8617a60dSAndroid Build Coastguard Worker# shellcheck source=./common_minimal.sh
10*8617a60dSAndroid Build Coastguard Worker. "$(dirname "$0")/common_minimal.sh"
11*8617a60dSAndroid Build Coastguard WorkerCROS_LOG_PREFIX="${PROG}: "
12*8617a60dSAndroid Build Coastguard Worker
13*8617a60dSAndroid Build Coastguard Worker# Performs clean up by executing actions in the cleanup_actions array in
14*8617a60dSAndroid Build Coastguard Worker# reversed order.
15*8617a60dSAndroid Build Coastguard Workercleanup() {
16*8617a60dSAndroid Build Coastguard Worker  # Save the existing return value.
17*8617a60dSAndroid Build Coastguard Worker  rv=$?
18*8617a60dSAndroid Build Coastguard Worker  set +e
19*8617a60dSAndroid Build Coastguard Worker
20*8617a60dSAndroid Build Coastguard Worker  cleanup_temps_and_mounts
21*8617a60dSAndroid Build Coastguard Worker  cleanup_loopbacks
22*8617a60dSAndroid Build Coastguard Worker
23*8617a60dSAndroid Build Coastguard Worker  set -e
24*8617a60dSAndroid Build Coastguard Worker  return $rv
25*8617a60dSAndroid Build Coastguard Worker}
26*8617a60dSAndroid Build Coastguard Worker
27*8617a60dSAndroid Build Coastguard Worker# ANSI color codes used when displaying messages.
28*8617a60dSAndroid Build Coastguard Worker# Taken from src/scripts/common.sh.
29*8617a60dSAndroid Build Coastguard WorkerV_BOLD_GREEN="\e[1;32m"
30*8617a60dSAndroid Build Coastguard WorkerV_BOLD_RED="\e[1;31m"
31*8617a60dSAndroid Build Coastguard WorkerV_BOLD_YELLOW="\e[1;33m"
32*8617a60dSAndroid Build Coastguard WorkerV_VIDOFF="\e[0m"
33*8617a60dSAndroid Build Coastguard Worker
34*8617a60dSAndroid Build Coastguard Worker# Prints an informational message.
35*8617a60dSAndroid Build Coastguard Worker# Taken from src/scripts/common.sh.
36*8617a60dSAndroid Build Coastguard Worker# Arg: MESSAGE
37*8617a60dSAndroid Build Coastguard Workerinfo() {
38*8617a60dSAndroid Build Coastguard Worker  echo -e >&2 "${V_BOLD_GREEN}${CROS_LOG_PREFIX:-}INFO   : $*${V_VIDOFF}"
39*8617a60dSAndroid Build Coastguard Worker}
40*8617a60dSAndroid Build Coastguard Worker
41*8617a60dSAndroid Build Coastguard Worker# Prints a warning message.
42*8617a60dSAndroid Build Coastguard Worker# Taken from src/scripts/common.sh.
43*8617a60dSAndroid Build Coastguard Worker# Arg: MESSAGE
44*8617a60dSAndroid Build Coastguard Workerwarn() {
45*8617a60dSAndroid Build Coastguard Worker  echo -e >&2 "${V_BOLD_YELLOW}${CROS_LOG_PREFIX:-}WARNING: $*${V_VIDOFF}"
46*8617a60dSAndroid Build Coastguard Worker}
47*8617a60dSAndroid Build Coastguard Worker
48*8617a60dSAndroid Build Coastguard Worker# Prints the specified error and exit the script with an error code.
49*8617a60dSAndroid Build Coastguard Worker# Taken from src/scripts/common.sh.
50*8617a60dSAndroid Build Coastguard Worker# Args: MESSAGE
51*8617a60dSAndroid Build Coastguard Workererror() {
52*8617a60dSAndroid Build Coastguard Worker  echo -e >&2   "${V_BOLD_RED}${CROS_LOG_PREFIX:-}ERROR  : $*${V_VIDOFF}"
53*8617a60dSAndroid Build Coastguard Worker}
54*8617a60dSAndroid Build Coastguard Worker
55*8617a60dSAndroid Build Coastguard WorkerTEMP_LOOP_LIST=$(mktemp)
56*8617a60dSAndroid Build Coastguard Worker
57*8617a60dSAndroid Build Coastguard Worker# Setup a loopback device for a file and scan for partitions, with retries.
58*8617a60dSAndroid Build Coastguard Worker#
59*8617a60dSAndroid Build Coastguard Worker# $1 - The file to back the new loopback device.
60*8617a60dSAndroid Build Coastguard Worker# $2-$N - Additional arguments to pass to losetup.
61*8617a60dSAndroid Build Coastguard Workerloopback_partscan() {
62*8617a60dSAndroid Build Coastguard Worker  local lb_dev image="$1"
63*8617a60dSAndroid Build Coastguard Worker  shift
64*8617a60dSAndroid Build Coastguard Worker
65*8617a60dSAndroid Build Coastguard Worker  # We know partition scanning & dev node creation can be racy with udev and
66*8617a60dSAndroid Build Coastguard Worker  # the kernel, and the kernel does not sleep/wait for it to finish.  We have
67*8617a60dSAndroid Build Coastguard Worker  # to use the partx tool manually as it will sleep until things are finished.
68*8617a60dSAndroid Build Coastguard Worker  lb_dev=$(sudo losetup --show -f "$@" "${image}")
69*8617a60dSAndroid Build Coastguard Worker
70*8617a60dSAndroid Build Coastguard Worker  # Cache the path so we can clean it up.
71*8617a60dSAndroid Build Coastguard Worker  echo "${lb_dev}" >>"${TEMP_LOOP_LIST}"
72*8617a60dSAndroid Build Coastguard Worker
73*8617a60dSAndroid Build Coastguard Worker  # Ignore problems deleting existing partitions. There shouldn't be any
74*8617a60dSAndroid Build Coastguard Worker  # which will upset partx, but that's actually ok.
75*8617a60dSAndroid Build Coastguard Worker  sudo partx -d "${lb_dev}" 2>/dev/null || true
76*8617a60dSAndroid Build Coastguard Worker  sudo partx -a "${lb_dev}"
77*8617a60dSAndroid Build Coastguard Worker
78*8617a60dSAndroid Build Coastguard Worker  echo "${lb_dev}"
79*8617a60dSAndroid Build Coastguard Worker}
80*8617a60dSAndroid Build Coastguard Worker
81*8617a60dSAndroid Build Coastguard Worker# Detach a loopback device set up earlier.
82*8617a60dSAndroid Build Coastguard Worker#
83*8617a60dSAndroid Build Coastguard Worker# $1 - The loop device to detach.
84*8617a60dSAndroid Build Coastguard Worker# $2-$N - Additional arguments to pass to losetup.
85*8617a60dSAndroid Build Coastguard Workerloopback_detach() {
86*8617a60dSAndroid Build Coastguard Worker  # Retry the deletes before we detach.  crbug.com/469259
87*8617a60dSAndroid Build Coastguard Worker  local i
88*8617a60dSAndroid Build Coastguard Worker  for (( i = 0; i < 10; i++ )); do
89*8617a60dSAndroid Build Coastguard Worker    if sudo partx -d "$1"; then
90*8617a60dSAndroid Build Coastguard Worker      break
91*8617a60dSAndroid Build Coastguard Worker    fi
92*8617a60dSAndroid Build Coastguard Worker    warn "Sleeping & retrying ..."
93*8617a60dSAndroid Build Coastguard Worker    sync
94*8617a60dSAndroid Build Coastguard Worker    sleep 1
95*8617a60dSAndroid Build Coastguard Worker  done
96*8617a60dSAndroid Build Coastguard Worker  sudo losetup --detach "$@"
97*8617a60dSAndroid Build Coastguard Worker}
98*8617a60dSAndroid Build Coastguard Worker
99*8617a60dSAndroid Build Coastguard Worker# Clear out all loopback devices we setup.
100*8617a60dSAndroid Build Coastguard Workercleanup_loopbacks() {
101*8617a60dSAndroid Build Coastguard Worker  local line
102*8617a60dSAndroid Build Coastguard Worker  while read -r line; do
103*8617a60dSAndroid Build Coastguard Worker    info "Cleanup: detaching ${line}"
104*8617a60dSAndroid Build Coastguard Worker    loopback_detach "${line}" 2>/dev/null
105*8617a60dSAndroid Build Coastguard Worker  done <"${TEMP_LOOP_LIST}"
106*8617a60dSAndroid Build Coastguard Worker  rm -f "${TEMP_LOOP_LIST}"
107*8617a60dSAndroid Build Coastguard Worker}
108*8617a60dSAndroid Build Coastguard Worker
109*8617a60dSAndroid Build Coastguard Worker# Usage: lsbval path-to-lsb-file key
110*8617a60dSAndroid Build Coastguard Worker# Returns the value for the given lsb-release file variable.
111*8617a60dSAndroid Build Coastguard Workerlsbval() {
112*8617a60dSAndroid Build Coastguard Worker  local lsbfile="$1"
113*8617a60dSAndroid Build Coastguard Worker  local key="$2"
114*8617a60dSAndroid Build Coastguard Worker  grep "^${key}=" "${lsbfile}" | sed "s/^${key}=//"
115*8617a60dSAndroid Build Coastguard Worker}
116*8617a60dSAndroid Build Coastguard Worker
117*8617a60dSAndroid Build Coastguard Worker# Usage: get_board_from_lsb_release rootfs
118*8617a60dSAndroid Build Coastguard Worker# Returns the exact board name from /etc/lsb-release.  This may contain
119*8617a60dSAndroid Build Coastguard Worker# dashes or other characters not suitable for variable names.  See the
120*8617a60dSAndroid Build Coastguard Worker# next function for that.
121*8617a60dSAndroid Build Coastguard Workerget_board_from_lsb_release() {
122*8617a60dSAndroid Build Coastguard Worker  local rootfs="$1"
123*8617a60dSAndroid Build Coastguard Worker  lsbval "${rootfs}/etc/lsb-release" CHROMEOS_RELEASE_BOARD
124*8617a60dSAndroid Build Coastguard Worker}
125*8617a60dSAndroid Build Coastguard Worker
126*8617a60dSAndroid Build Coastguard Worker# Usage: get_boardvar_from_lsb_release rootfs
127*8617a60dSAndroid Build Coastguard Worker# Returns the board name from /etc/lsb-release in a mangled form that can
128*8617a60dSAndroid Build Coastguard Worker# be used in variable names.  e.g. dashes are turned into underscores.
129*8617a60dSAndroid Build Coastguard Workerget_boardvar_from_lsb_release() {
130*8617a60dSAndroid Build Coastguard Worker  get_board_from_lsb_release "$@" | sed 's:[-]:_:g'
131*8617a60dSAndroid Build Coastguard Worker}
132*8617a60dSAndroid Build Coastguard Worker
133*8617a60dSAndroid Build Coastguard Worker# Usage: restore_lsb_selinux lsb-file
134*8617a60dSAndroid Build Coastguard Worker# restore lsb-release security.selinux attribute
135*8617a60dSAndroid Build Coastguard Workerrestore_lsb_selinux() {
136*8617a60dSAndroid Build Coastguard Worker  sudo setfattr -n security.selinux -v "u:object_r:cros_conf_file:s0" "$1"
137*8617a60dSAndroid Build Coastguard Worker}
138*8617a60dSAndroid Build Coastguard Worker
139*8617a60dSAndroid Build Coastguard Worker# Extracts a firmware updater bundle (for firmware image binaries) file
140*8617a60dSAndroid Build Coastguard Worker# (generated by src/platform/firmware/pack_firmware.sh).
141*8617a60dSAndroid Build Coastguard Worker# Args: INPUT_FILE OUTPUT_DIR
142*8617a60dSAndroid Build Coastguard Workerextract_firmware_bundle() {
143*8617a60dSAndroid Build Coastguard Worker  local input="$(readlink -f "$1")"
144*8617a60dSAndroid Build Coastguard Worker  local output_dir="$2"
145*8617a60dSAndroid Build Coastguard Worker  if [[ ! -s "${input}" ]]; then
146*8617a60dSAndroid Build Coastguard Worker    return 1
147*8617a60dSAndroid Build Coastguard Worker  elif grep -q '^##CUTHERE##' "${input}"; then
148*8617a60dSAndroid Build Coastguard Worker    # Bundle supports self-extraction (--unpack, or --sb_extract)
149*8617a60dSAndroid Build Coastguard Worker    "${input}" --unpack "${output_dir}" ||
150*8617a60dSAndroid Build Coastguard Worker      "${input}" --sb_extract "${output_dir}" ||
151*8617a60dSAndroid Build Coastguard Worker        die "Extracting firmware autoupdate (--unpack) failed."
152*8617a60dSAndroid Build Coastguard Worker  else
153*8617a60dSAndroid Build Coastguard Worker    # Legacy bundle - try uudecode.
154*8617a60dSAndroid Build Coastguard Worker    uudecode -o - "${input}" | tar -C "${output_dir}" -zxf - 2>/dev/null ||
155*8617a60dSAndroid Build Coastguard Worker      die "Extracting firmware autoupdate failed."
156*8617a60dSAndroid Build Coastguard Worker  fi
157*8617a60dSAndroid Build Coastguard Worker}
158*8617a60dSAndroid Build Coastguard Worker
159*8617a60dSAndroid Build Coastguard Worker# This will override the trap set in common_minmal.sh
160*8617a60dSAndroid Build Coastguard Workertrap "cleanup" INT TERM EXIT
161