# Copyright 2016 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.
#
# This script processes exit values of the gsctool utility ran by
# cr50-update.conf. See it for details of exit code values.

description     "Startup file to process cr50 firmware updater exit status"
author          "chromium-os-dev@chromium.org"

start on stopped cr50-update

script

  logit() {
    logger -t ${UPSTART_JOB} "$*"
  }
  . /usr/share/misc/chromeos-common.sh
  . /usr/sbin/write_gpt.sh

  exit_status=0
  # Check the device state with cr50-set-board-id to determine if board id
  # should be set this boot. Only set board id when check_result runs
  # successfully.
  device_status="$(/usr/share/cros/cr50-set-board-id.sh 'check_device')" ||
      exit_status="$?"

  if [ "${exit_status}" = "0" ]; then
    logit "Will check Board ID settings"

    # Set flag to 'unknown' if board ID hasn't been set.
    # Note that this flag should normally be set in the factory flow.
    logit "$(/usr/share/cros/cr50-set-board-id.sh 'unknown')"
  else
    logit "skip setting board id: ${device_status}"
    # If cr50-set-board-id exited with a status of 4, something is wrong with
    # the device and cr50-result should skip the update reboot.
    if [ "${exit_status}" = "4" ]; then
      logit "skip reboot."
      exit "{exit_status}"
    fi
  fi

  # Check if rootfs is mounted on a removable device.
  rootdev_removable() {
    load_base_vars

    local dst_drive="$(get_fixed_dst_drive)"
    local root_drive="$(rootdev -s -d)"

    if [ -z  "${dst_drive}" ]; then
      logit "no known device"
    elif [ "${dst_drive}" != "${root_drive}" ]; then
      logit "running on removable device ${dst_drive}, not ${root_drive}"
      return 0
    else
      logit "running on disk ${root_drive}"
    fi
    return 1
  }

  case ${EXIT_STATUS} in
  (0)
    ;;
  (10[12])
    if rootdev_removable; then
      logit "rootfs on removable device, not rebooting"
    else
      logit "reboot required ${EXIT_STATUS}"
      reboot
      # Make sure this script does not continue running.
      sleep 60
    fi
    ;;
  (*)
    logit "unexpected cr50-update exit code ${EXIT_STATUS}"
    ;;
  esac

end script
