blob: 2f892af8d39161da5046a51c9b083b2311a892ba [file] [log] [blame]
#!/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 system_image_merkle="${FUCHSIA_BUILD_DIR}"/obj/build/images/fuchsia/fuchsia/base/base.merkle
[[ $(fx-command-run shell 'read ver < /system/meta;echo $ver') != $(<"${system_image_merkle}") ]]
}
function target-using-omaha-client {
[[ "$(ffx component select capability fuchsia.update.Manager)" == *"/core/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 "$@"