#!/bin/sh -ue
# 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.
#
# A script to mark the current kernel partition as successfully booted.

# If we're not running as root, restart as root.
if [ $(id -u) -ne 0 ]; then
  exec sudo "$0" "$@"
fi

# Load functions and constants for chromeos-install.
. /usr/share/misc/chromeos-common.sh || exit 1

get_dev_by_part_uuid() {
  local dev guid="$1"
  # Look through the root device, the most likely place to find the partition.
  dev="$(cgpt find -1 -u "${guid}" "$(rootdev -d -s)")"
  if [ -z "${dev}" ]; then
    # Look through all the known devices to find that one partition.
    dev="$(cgpt find -1 -u "${guid}")"
  fi
  echo "${dev}"
}

FAFT_LOCKFILE="/var/tmp/faft/lock"
if [ -f "$FAFT_LOCKFILE" ]; then
  echo "FAFT lockfile exists, skipping chromeos-setgoodkernel actions"
  exit
fi

if grep -q 'cros_efi' /proc/cmdline ; then
  is_efi=1
else
  is_efi=0
fi

# Extract the kernel partition's UniqueGuid from the command line.
if [ $is_efi -eq 1 ]; then
  guid=$(sed -n 's/.*root=PARTUUID=\([0-9a-fA-F-]\+\).*/\1/p' /proc/cmdline)
  if [ -n "${guid}" ]; then
    root_dev=$(get_dev_by_part_uuid "${guid}")
  fi
else
  guid=$(sed -n 's/.*kern_guid=\([0-9a-fA-F-]\+\).*/\1/p' /proc/cmdline)
  if [ -n "${guid}" ]; then
    kern_dev=$(get_dev_by_part_uuid "${guid}")
  fi
fi

# If no Guid extracted from cmdline, get the root partition.
if [ -z "${guid}" ]; then
  root_dev=$(rootdev -s)
fi

# Split the kernel device into the base device and paritition number.
if [ -n "${kern_dev:+x}" ]; then
  base_dev=$(get_block_dev_from_partition_dev "${kern_dev}")
  kern_num=$(get_partition_number "${kern_dev}")
else
  base_dev=$(get_block_dev_from_partition_dev "${root_dev}")
  # EFI and legacy BIOSes boot the ROOT-x partition which is KERN-x + 1
  kern_num=$(($(get_partition_number "${root_dev}") - 1))
fi

# kern_dev would be /dev/mtd2 or /dev/mtd4 on NAND, base_dev will be /dev/mtd.
# But that's wrong, it should be /dev/mtd0 because there is no /dev/mtd device.
# ChromeOS only supports one NAND device, we use /dev/mtd0 for that.
if [ "${base_dev}" = "/dev/mtd" ]; then
  base_dev="/dev/mtd0"
fi

# Mark the kernel as successfully booted (success=1, tries=0).
cgpt add "${base_dev}" -i $kern_num -S1 -T0
# Mark the kernel as highest priority
cgpt prioritize "${base_dev}" -i $kern_num

# Collect any startup time firmware updater logs (see chromeos_startup)
FIRMWARE_UPDATE_LOG='/mnt/stateful_partition/update_firmware.log'
if [ -f "${FIRMWARE_UPDATE_LOG}" ]; then
  echo "Found startup-time firmware updating logs:"
  stat -c "%y" "${FIRMWARE_UPDATE_LOG}"
  echo "------------------------------------------"
  cat "${FIRMWARE_UPDATE_LOG}" && rm -f "${FIRMWARE_UPDATE_LOG}"
  echo "------------------------------------------"
fi

# Set firmware as 'good' if possible.
SET_GOOD_FIRMWARE_SCRIPT='/usr/sbin/chromeos-setgoodfirmware'
if [ -x "${SET_GOOD_FIRMWARE_SCRIPT}" ]; then
  "${SET_GOOD_FIRMWARE_SCRIPT}"
fi

# Run the verified boot debugging tool now, because we won't be able to run it
# manually if there's a problem (no root shell). It leaves a log file that we
# can look at.
dev_debug_vboot --cleanup > /dev/null 2>&1 &
