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