#!/bin/bash
#
# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Script which ensures that a given image has an up-to-date
# kernel partition, rootfs integrity hashes, and legacy bootloader configs.

# --- BEGIN COMMON.SH BOILERPLATE ---
# Load common CrOS utilities.  Inside the chroot this file is installed in
# /usr/lib/crosutils.  Outside the chroot we find it relative to the script's
# location.
find_common_sh() {
  local common_paths=("$(dirname "$(readlink -f "$0")")/.." /usr/lib/crosutils)
  local path

  SCRIPT_ROOT="${common_paths[0]}"
  for path in "${common_paths[@]}"; do
    if [ -r "${path}/common.sh" ]; then
      SCRIPT_ROOT="${path}"
      break
    fi
  done
}

find_common_sh
. "${SCRIPT_ROOT}/common.sh" || exit 1
# --- END COMMON.SH BOILERPLATE ---

# Need to be inside the chroot to load chromeos-common.sh
assert_inside_chroot

# Load functions and constants for chromeos-install
. /usr/share/misc/chromeos-common.sh || exit 1
. "${BUILD_LIBRARY_DIR}/build_image_util.sh" || exit 1
. "${BUILD_LIBRARY_DIR}/disk_layout_util.sh" || exit 1
. "${BUILD_LIBRARY_DIR}/mount_gpt_util.sh" || exit 1

switch_to_strict_mode

if [ $# -lt 2 ]; then
  echo "Usage: ${0} /PATH/TO/IMAGE IMAGE.BIN [shflags overrides]"
  exit 1
fi

IMAGE_DIR="$(readlink -f "${1}")"
IMAGE="${IMAGE_DIR}/${2}"
shift
shift
FLAG_OVERRIDES=( "$@" )

if get_boot_desc "${IMAGE_DIR}/boot.desc"; then
  info "Boot-time configuration for ${IMAGE_DIR}:"
  for flag in "${boot_desc_flags[@]}"; do
    info "  ${flag}"
  done
else
  warn "Falling back to command line parsing."
fi

if [ ! -r "${IMAGE}" ]; then
  die "${IMAGE} cannot be read!"
fi

locate_gpt
set +e

# Now parse the build settings from ${OUTPUT_DIR}/boot.desc
DEFINE_string adjust_part "" \
  "Adjustments to apply to the partition table"
DEFINE_string board "${DEFAULT_BOARD}" \
  "Board we're building for."
DEFINE_string image_type "base" \
  "Type of image we're building for (base/factory_install)."
DEFINE_string output_dir "/tmp" \
  "Directory to place output in."
DEFINE_string image "chromiumos_base.img" \
  "Full path to the chromiumos image to make bootable."
DEFINE_string arch "x86" \
  "Architecture to make bootable for: arm, mips, x86, or amd64"
DEFINE_boolean cleanup_dirs ${FLAGS_TRUE} \
  "Whether the mount dirs should be removed on completion."

DEFINE_string boot_args "noinitrd" \
  "Additional boot arguments to pass to the commandline"

DEFINE_integer rootfs_size 720 \
  "rootfs filesystem size in MBs."
# ceil(0.1 * rootfs_size) is a good minimum.
DEFINE_integer rootfs_hash_pad 8 \
  "MBs reserved at the end of the rootfs image."

DEFINE_string rootfs_hash "/tmp/rootfs.hash" \
  "Path where the rootfs hash should be stored."
# TODO(taysom): when we turn on boot cache, both verification and
# bootcache should have their default be FLAGS_TRUE.
DEFINE_boolean enable_rootfs_verification ${FLAGS_FALSE} \
  "Default all bootloaders to NOT use kernel-based root fs integrity checking."
DEFINE_boolean enable_bootcache ${FLAGS_FALSE} \
  "Default all bootloaders to NOT use bootcache."
DEFINE_integer verity_error_behavior 3 \
  "Kernel verified boot error behavior (0: I/O errors, 1: reboot, 2: nothing)"
DEFINE_integer verity_max_ios -1 \
  "Number of outstanding I/O operations dm-verity caps at."
DEFINE_string verity_algorithm "sha1" \
  "Cryptographic hash algorithm used for kernel vboot."
DEFINE_string verity_salt "" \
  "Salt for rootfs hash tree."

DEFINE_string keys_dir "${VBOOT_DEVKEYS_DIR}" \
  "Directory containing the signing keys."

DEFINE_string rootfs_mountpoint "/tmp/rootfs" \
  "Path where the rootfs can be safely mounted"
DEFINE_string statefulfs_mountpoint "/tmp/statefulfs" \
  "Path where the statefulfs can be safely mounted"
DEFINE_string espfs_mountpoint "/tmp/espfs" \
  "Path where the espfs can be safely mounted"

DEFINE_boolean use_dev_keys ${FLAGS_FALSE} \
  "Use developer keys for signing. (Default: false)"

DEFINE_boolean fsck_rootfs ${FLAGS_FALSE} \
  "Check integrity of the rootfs on the modified image."

# TODO(pkumar): Remove once known that no images are using this flag
DEFINE_boolean crosbug12352_arm_kernel_signing ${FLAGS_FALSE} \
  "This flag is deprecated but the bots still need parse old images."

# TODO(sosa):  Remove once known images no longer use this in their config.
DEFINE_string arm_extra_bootargs "" "DEPRECATED FLAG.  Do not use."

DEFINE_boolean force_developer_mode ${FLAGS_FALSE} \
  "Add cros_debug to boot args."

DEFINE_string enable_serial "" \
  "Enable serial port for printks. Example values: ttyS0"
DEFINE_integer loglevel 7 \
  "The loglevel to add to the kernel command line."

# Parse the boot.desc and any overrides
set -- "${boot_desc_flags[@]}" "${FLAG_OVERRIDES[@]}"
FLAGS "${@}" || exit 1

[ -z "${FLAGS_verity_salt}" ] && FLAGS_verity_salt=$(make_salt)

# board_options.sh relies on ${SRC_IMAGE} environment variable.
SRC_IMAGE="${IMAGE}"
. "${BUILD_LIBRARY_DIR}/board_options.sh" || exit 1
load_board_specific_script "board_specific_setup.sh"

# Only now can we die on error.  shflags functions leak non-zero error codes,
# so will die prematurely if 'switch_to_strict_mode' is specified before now.
switch_to_strict_mode -u

append_boot_flag() {
  local file="$1"
  local pattern="$2"
  local base_pattern="$3"

  [ -f "${file}" ] || return ${FLAGS_TRUE}
  grep -wq "${pattern}" "${file}" && return ${FLAGS_TRUE}
  sudo sed -i "s/\b${base_pattern}\b/& ${pattern}/g" "${file}"
}

check_kernel_size() {
  local kernel_image_size="$1"
  local kernel_part="$2"
  local kernel_slot="$3"
  local kernel_partition_size=$(get_partition_size ${FLAGS_image_type} \
                                                   ${kernel_part})
  local kernel_partition_size_90=$(( kernel_partition_size * 90 / 100 ))
  info "Kernel partition ${kernel_slot} size is ${kernel_partition_size} bytes."
  if [[ ${kernel_image_size} -gt ${kernel_partition_size} ]]; then
    die "Kernel image won't fit in partition ${kernel_slot}!"
  elif [[ ${kernel_image_size} -gt ${kernel_partition_size_90} ]]; then
    warn "Kernel partition ${kernel_slot} is more than 90% full!"
  fi
}

build_img() {
  local image_name="$1"
  local root_dev="$2"
  local root_dev_size="$3"
  local keyblock="$4"
  local private="$5"
  local public="$6"
  local vblock=${7:-""}

  # Default to non-verified
  local enable_rootfs_verification_flag=--noenable_rootfs_verification
  if [[ ${FLAGS_enable_rootfs_verification} -eq ${FLAGS_TRUE} ]]; then
    enable_rootfs_verification_flag=--enable_rootfs_verification
  fi
  local enable_bootcache_flag=--noenable_bootcache
  if [[ ${FLAGS_enable_bootcache} -eq ${FLAGS_TRUE} ]]; then
    enable_bootcache_flag=--enable_bootcache
  fi

  if [[ -n "${vblock}" ]]; then
    vblock=--hd_vblock="${FLAGS_output_dir}/${vblock}"
  fi

  ${SCRIPTS_DIR}/build_kernel_image.sh \
    --board="${FLAGS_board}" \
    --arch="${FLAGS_arch}" \
    --to="${FLAGS_output_dir}/${image_name}" \
    --vmlinuz="${VMLINUZ}" \
    --working_dir="${FLAGS_output_dir}" \
    --boot_args="${FLAGS_boot_args}" \
    --keep_work \
    --rootfs_image=${root_dev} \
    --rootfs_image_size=${root_dev_size} \
    --rootfs_hash=${FLAGS_rootfs_hash} \
    --verity_hash_alg=${FLAGS_verity_algorithm} \
    --verity_max_ios=${FLAGS_verity_max_ios} \
    --verity_error_behavior=${FLAGS_verity_error_behavior} \
    --verity_salt=${FLAGS_verity_salt} \
    --keys_dir="${FLAGS_keys_dir}" \
    --keyblock="${keyblock}" \
    --private="${private}" \
    --public="${public}" \
    --enable_serial="${FLAGS_enable_serial}" \
    ${vblock} \
    ${enable_rootfs_verification_flag} \
    ${enable_bootcache_flag}
}

make_image_bootable() {
  local image="$1"

  # Update legacy boot config templates (in rootfs) before rootfs is locked.
  # This is required because postinst will copy new legacy boot configurations
  # from rootfs partition instead of modifying existing entries in EFI
  # partition.
  if [ ${FLAGS_force_developer_mode} -eq ${FLAGS_TRUE} ]; then
    trap "unmount_image ; die 'cros_make_image_bootable failed.'" EXIT
    mount_image "${image}" "${FLAGS_rootfs_mountpoint}" \
      "${FLAGS_statefulfs_mountpoint}" "" ""

    append_boot_flag "${FLAGS_rootfs_mountpoint}/boot/syslinux/root.A.cfg" \
      "cros_debug" "cros_legacy"
    append_boot_flag "${FLAGS_rootfs_mountpoint}/boot/syslinux/root.B.cfg" \
      "cros_debug" "cros_legacy"
    append_boot_flag "${FLAGS_rootfs_mountpoint}/boot/syslinux/usb.A.cfg" \
      "cros_debug" "cros_legacy"
    append_boot_flag "${FLAGS_rootfs_mountpoint}/boot/efi/boot/grub.cfg" \
      "cros_debug" "cros_efi"

    unmount_image
    trap - EXIT
  fi

  # Make the filesystem un-mountable as read-write.
  # mount_gpt_image.sh will undo this as needed.
  # TODO(wad) make sure there is parity in the signing scripts.
  if [ ${FLAGS_enable_rootfs_verification} -eq ${FLAGS_TRUE} ]; then
    # TODO(wad) this would be a good place to reset any other ext2 metadata.
    warn "Disabling r/w mount of the root filesystem"
    local rootfs_offset="$(partoffset ${image} 3)"
    disable_rw_mount "${image}" "$(( rootfs_offset * 512 ))"
  fi

  trap "unmount_image ; die 'cros_make_image_bootable failed.'" EXIT
  mount_image "${image}" "${FLAGS_rootfs_mountpoint}" \
    "${FLAGS_statefulfs_mountpoint}" "" "--safe"

  # Newer `mount` will decode the filename backing the loop device,
  # so we need to dig deeper and find the answer ourselves.
  root_dev=$(awk -v mnt="${FLAGS_rootfs_mountpoint}" \
             '$2 == mnt { print $1 }' /proc/mounts)
  if [[ -z "${root_dev}" ]]; then
    # If the read-only rootfs is not mounted via the kernel using a real block
    # device and we need to create one here. So far, all the filesystems we
    # use in the rootfs can be mounted read-only by the kernel (including
    # squashfs) so we just exit if that's the case.
    die "Didn't find the rootfs block device device after mounting it."
  fi

  # We sign the image with the recovery_key, because this is what goes onto the
  # USB key. We can only boot from the USB drive in recovery mode.
  # For dev install shim, we need to use the installer keyblock instead of
  # the recovery keyblock because of the difference in flags.
  local keyblock
  if [ ${FLAGS_use_dev_keys} -eq ${FLAGS_TRUE} ]; then
    keyblock=installer_kernel.keyblock
    info "DEBUG: use dev install keyblock"
  else
    keyblock=recovery_kernel.keyblock
    info "DEBUG: use recovery keyblock"
  fi

  if [ ${FLAGS_force_developer_mode} -eq ${FLAGS_TRUE} ]; then
    FLAGS_boot_args="${FLAGS_boot_args} cros_debug"
  fi

  # Builds the kernel partition image.
  local partition_num_root_a="$(get_layout_partition_number \
    "${FLAGS_image_type}" ROOT-A)"
  local rootfs_fs_size=$(get_filesystem_size "${FLAGS_image_type}" \
    "${partition_num_root_a}")
  build_img "vmlinuz.image" "${root_dev}" "${rootfs_fs_size}" "${keyblock}" \
            "recovery_kernel_data_key.vbprivk" "recovery_key.vbpubk"
  build_img "hd_vmlinuz.image" "${root_dev}" "${rootfs_fs_size}" \
            "kernel.keyblock" "kernel_data_key.vbprivk" "kernel_subkey.vbpubk" \
            "vmlinuz_hd.vblock"

  # Check the size of kernel image and issue warning when image size is
  # near the limit.
  local kernel_image_size_A=$(stat -c '%s' ${FLAGS_output_dir}/vmlinuz.image)
  info "Kernel image A   size is ${kernel_image_size_A} bytes."
  local kernel_image_size_B=$(stat -c '%s' ${FLAGS_output_dir}/hd_vmlinuz.image)
  info "Kernel image B   size is ${kernel_image_size_B} bytes."
  local partition_num_kern_a="$(get_layout_partition_number \
    "${FLAGS_image_type}" KERN-A)"
  check_kernel_size ${kernel_image_size_A} ${partition_num_kern_a} A
  local partition_num_kern_b="$(get_layout_partition_number \
    "${FLAGS_image_type}" KERN-B)"
  check_kernel_size ${kernel_image_size_B} ${partition_num_kern_b} B

  local rootfs_hash_size=$(stat -c '%s' ${FLAGS_rootfs_hash})
  local rootfs_partition_size=$(get_partition_size ${FLAGS_image_type} \
      ${partition_num_root_a})
  local rootfs_hash_pad=$(( rootfs_partition_size - rootfs_fs_size ))
  info "Appending rootfs.hash (${rootfs_hash_size} bytes) to the root fs"
  if [[ ${rootfs_hash_size} -gt ${rootfs_hash_pad} ]]
  then
    die "rootfs_partition_size - rootfs_fs_size is less than the needed " \
        "rootfs_hash_size (${rootfs_hash_size}), update your disk layout " \
        "configuration"
  fi
  # Unfortunately, mount_gpt_image uses mount and not losetup to create the
  # loop devices.  This means that they are not the correct size.  We have to
  # write directly to the image to append the hash tree data.
  local hash_offset="$(partoffset ${image} ${partition_num_root_a})"
  hash_offset=$((hash_offset + (${rootfs_fs_size} / 512)))
  sudo dd bs=512 \
          seek=${hash_offset} \
          if="${FLAGS_rootfs_hash}" \
          of="${image}" \
          conv=notrunc \
          status=none

  # Move the verification block needed for the hard disk install to the
  # stateful partition. Mount stateful fs, copy file, and umount fs.
  # In original CL: http://codereview.chromium.org/2868044, this was done in
  # create_base_image(). However, it could break the build if it is a clean
  # build because vmlinuz_hd.vblock hasn't been created by build_kernel_image.sh
  # In some builds that don't use vboot to verify the kernel, this file might
  # not get created as part of the build, so only copy them if they were.
  if [ -f "${FLAGS_output_dir}/vmlinuz_hd.vblock" ]; then
    sudo cp "${FLAGS_output_dir}/vmlinuz_hd.vblock" \
            "${FLAGS_statefulfs_mountpoint}"
  fi

  # Install the kernel to both slots A and B so there will always be a regular
  # kernel in slot B on recovery and non-recovery images.
  local koffset="$(partoffset ${image} ${partition_num_kern_a})"
  sudo dd if="${FLAGS_output_dir}/vmlinuz.image" of="${image}" \
    conv=notrunc bs=512 seek=${koffset} status=none
  koffset="$(partoffset ${image} ${partition_num_kern_b})"
  sudo dd if="${FLAGS_output_dir}/hd_vmlinuz.image" of="${image}" \
    conv=notrunc bs=512 seek=${koffset} status=none

  # Update the bootloaders.  The EFI system partition will be updated.
  local kernel_part=

  # We should update the esp in place in the image.
  local partition_num_efi_system="$(get_layout_partition_number \
    "${FLAGS_image_type}" EFI-SYSTEM)"
  local image_dev=$(loopback_partscan "${image}")
  trap "loopback_detach ${image_dev}; unmount_image ; \
    die 'cros_make_image_bootable failed.'" EXIT
  local bootloader_to="${image_dev}"
  # Make this writable by the user, it will get deleted by losetup -d.
  sudo chown $(id -u) ${bootloader_to} ${bootloader_to}p*
  local esp_size="$(partsize ${image} ${partition_num_efi_system})"
  esp_size=$((esp_size * 512))  # sectors to bytes

  if [[ "${FLAGS_arch}" = "x86" || "${FLAGS_arch}" = "amd64" ]]; then
    # Use the kernel partition to acquire configuration flags.
    kernel_part="--kernel_partition='${FLAGS_output_dir}/vmlinuz.image'"
    # Install syslinux on the EFI System Partition.
    kernel_part="${kernel_part} --install_syslinux"
  elif [[ "${FLAGS_arch}" = "arm" || "${FLAGS_arch}" = "mips" ]]; then
    # These flags are not used for ARM / MIPS update_bootloaders.sh
    kernel_part=""
  fi

  # Force all of the file writes to complete, in case it's necessary for
  # crbug.com/938958
  sync

  if [[ ${esp_size} -gt 0 ]]; then
    # Update EFI partition
    ${SCRIPTS_DIR}/update_bootloaders.sh \
      --arch="${FLAGS_arch}" \
      --board="${BOARD}" \
      --image_type="${FLAGS_image_type}" \
      --to="${bootloader_to}" \
      --to_partition="${partition_num_efi_system}" \
      --from="${FLAGS_rootfs_mountpoint}"/boot \
      --vmlinuz="${VMLINUZ}" \
      --zimage="${ZIMAGE}" \
      ${kernel_part}
  fi

  # We don't need to keep these files around anymore.
  sudo rm -f "${FLAGS_rootfs_hash}" "${FLAGS_output_dir}/vmlinuz.image" \
             "${FLAGS_output_dir}/hd_vmlinuz.image" \
             "${FLAGS_output_dir}/vmlinuz_hd.vblock"

  sudo losetup -d ${image_dev}
  unmount_image
  trap - EXIT
}

verify_image_rootfs() {
  local image=$1
  local partition_num_root_a="$(get_layout_partition_number \
    "${FLAGS_image_type}" ROOT-A)"
  local rootfs_offset="$(partoffset ${image} ${partition_num_root_a})"

  local rootfs_tmp_file=$(mktemp)
  trap "rm ${rootfs_tmp_file}" EXIT
  sudo dd if="${image}" of="${rootfs_tmp_file}" bs=512 skip="${rootfs_offset}" \
          status=none

  # This flips the read-only compatibility flag, so that
  # e2fsck does not complain about unknown file system capabilities.
  enable_rw_mount "${rootfs_tmp_file}"
  info "Running e2fsck to check root file system for errors"
  sudo e2fsck -fn "${rootfs_tmp_file}" ||
    die "Root file system has errors, please ensure boot.desc and/or \
command line parameters are correct"
}

# Store output and temporary files next to image.
FLAGS_output_dir="${IMAGE_DIR}"
FLAGS_rootfs_hash="${IMAGE_DIR}/rootfs.hash"
FLAGS_rootfs_mountpoint="${IMAGE_DIR}/rootfs_dir"
FLAGS_statefulfs_mountpoint="${IMAGE_DIR}/stateful_dir"
FLAGS_espfs_mountpoint="${IMAGE_DIR}/esp"

# Create the directories if they don't exist.
mkdir -p ${FLAGS_rootfs_mountpoint}
mkdir -p ${FLAGS_statefulfs_mountpoint}
mkdir -p ${FLAGS_espfs_mountpoint}

# base_image_utils.sh always places the kernel images in
# ${IMAGE_DIR}/boot_images.
declare -r VMLINUZ="${IMAGE_DIR}/boot_images/vmlinuz"
declare -r ZIMAGE="${IMAGE_DIR}/boot_images/zimage"

make_image_bootable "${IMAGE}"
if type -p board_make_image_bootable; then
  board_make_image_bootable "${IMAGE}"
fi
if [ ${FLAGS_fsck_rootfs} -eq ${FLAGS_TRUE} ]; then
  verify_image_rootfs "${IMAGE}"
fi

if [ ${FLAGS_cleanup_dirs} -eq ${FLAGS_TRUE} ]; then
  # These paths are already cleaned up by make_image_bootable when unmounting
  # the image. This is a fallback in case there are errors in that script.
  for path in ${FLAGS_rootfs_mountpoint} ${FLAGS_statefulfs_mountpoint} \
      ${FLAGS_espfs_mountpoint}; do
    if [[ -d "${path}" ]]; then
      rmdir "${path}"
    fi
  done
fi
