#!/bin/bash
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

#### CATEGORY=Software delivery
### perform a system OTA on a connected device

## usage: fx ota [--help] [--build|--no-build]
##
##   --build | --no-build   Build (or not) the 'updates' target before initiating OTA.
##   --help                 Print out this message.
##
## Ask the connected Fuchsia device to do an OTA.
## Depending on the flags, this command will attempt to build the necessary
## dependencies ('fx build updates') before requesting the OTA.
##
## The default for --build is defined by the "incremental" feature:
##    'fx --enable=incremental ota'  defaults to '--build'
##    'fx --disable=incremental ota'  defaults to '--no-build'
##
## A package server needs to be running and this command will fail if it is not.

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/updates.sh || exit $?
fx-config-read

function needs-update {
  local targets_path="${FUCHSIA_BUILD_DIR}/amber-files/repository/targets.json"
  local base_package="system_image/0"
  local jq_filter=".signed.targets[\"${base_package}\"].custom.merkle"
  local base_package_merkle

  if [ ! -e "${targets_path}" ]; then
    fx-error "TUF targets metadata '${targets_path}' does not exist."
    fx-error "You may need to run 'fx build' to create it."
    return 1
  fi

  if ! base_package_merkle=$(fx-command-run jq -e -r "$jq_filter" "$targets_path"); then
    fx-error "TUF targets metadata does not contain the packge '${base_package}'".
    fx-error "You may need to run 'fx build' to create it."
    return 1
  fi

  if [[ "${base_package_merkle}" == "" || "${base_package_merkle}" == "null" ]]; then
    fx-error "Invalid merkle for TUF targets entry for 'system_image/0'."
    fx-error "Merkle must be a non-empty string, not '${base_package_merkle}'."
    return 1
  fi

  [[ $(fx-command-run shell 'read ver < /system/meta;echo $ver') != "${base_package_merkle}" ]]
}

function target-using-omaha-client {
  [[ "$(ffx component select capability fuchsia.update.Manager)" == *"/core/system-update/omaha-client-service"* ]]
}

function main {
  local build=false
  local build_targets=("updates")
  if is_feature_enabled "incremental"; then
    # In incremental workflows, these defaults have changed.
    # Keep old behavior if incremental is not enabled.
    build=true
    build_targets=("build/images/updates" "build/images/fuchsia:update")
  fi
  while (( $# )); do
    case "$1" in
      --help)
        fx-command-help
        exit 0
        ;;
      --no-build)
        build=false
        ;;
      --build)
        build=true
        ;;
      *)
       fx-error 'Invalid syntax'
       fx-command-help
       exit 1
    esac
    shift
  done

  check-for-package-server || return 1

  if target-using-omaha-client; then
    fx-warn "The target device is using omaha-client for update management, which will not"
    fx-warn "OTA from this host. Consider 'fx force-ota-from-devhost' to bypass omaha-client."
  fi

  if $build; then
    fx-info "Building/refreshing ${build_targets[@]}"
    fx-command-run build "${build_targets[@]}" || return 1
  fi

  # Note: the following command continues to run as the system goes into
  # reboot, so we lose SSH connection before it "completes". As such the
  # following command completes with error, but that is not actually an error.
  fx-command-run shell update check-now --monitor

  fx-command-run wait

  fx-command-run shell update wait-for-commit

  if needs-update; then
    fx-error "After update, system appears still out of date. OTA may have failed. Run 'fx log' for details."
    return 1
  fi
}

main "$@"
