blob: bdac9e3d07fb9a9731046455c9f4303b32915512 [file] [log] [blame] [edit]
#!/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
### start the update server and attach to a running fuchsia device
## usage: fx serve [-v] [-l host[:port]] [-c version] [--no-device] [--name NAME]
##
## -l port port that "fx serve" will listen on
## --address address that "fx serve will listen on"
## --no-device Do not register the repository with a specific device.
## --name NAME Name the generated update source config NAME.
## --[no-]persist enable or disable persistence of repository metadata. Disabled
## by default.
## -v verbose mode, shows info and debug messages from "ffx repository serve"
## -C|--clean clean the package repository first. This flag is only
## valid if the incremental package publishing is enabled.
## --foreground run the repository server in the foreground (the default).
## --background run the repository server in the background.
##
## This command supports:
## - incremental package publishing. If enabled, it will auto-publish packages as they
## are created or modified.
##
## To enable incremental package serving, run "fx --enable=incremental serve ..."
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 $?
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/fx-optional-features.sh || exit $?
fx-config-read
function usage {
fx-command-help serve
}
fx-standard-switches "$@"
set -- "${FX_ARGV[@]}"
port=""
address="[::]"
verbose=false
clean_first=false
source_name=""
storage_type="ephemeral"
no_device=""
server_mode="--foreground"
while (($#)); do
case "$1" in
-l)
port="${2##*:}"
shift
;;
--address)
address="$2"
shift
;;
--name)
source_name="$2"
shift
;;
--no-persist)
storage_type="ephemeral"
;;
--persist)
storage_type="persistent"
;;
--no-device)
no_device="--no-device"
;;
--background)
server_mode="--background"
;;
--foreground)
server_mode="--foreground"
;;
-v|--verbose)
verbose=true
;;
-C|--clean)
clean_first=true
;;
*)
echo "Unrecognized option: $1"
usage
exit 1
;;
esac
shift
done
if fx-is-bringup; then
fx-error "$0 is not supported in the bringup build configuration, as there are no package features in bringup."
exit 1
fi
if [[ -z "${source_name}" ]]; then
source_name="$(ffx-default-repository-name)"
fi
log() {
# This format matches bootserver so that `fx serve` ui is easier to read.
echo "$(date '+%Y-%m-%d %H:%M:%S') [serve] $@"
}
# TODO(b/360930691): Set the default repo_dir in the configuration.
repo_dir="${FUCHSIA_BUILD_DIR}/amber-files"
if is_feature_enabled "incremental" || is_feature_enabled "incremental_new"; then
# macOS in particular has a low default for number of open file descriptors
# per process, which is prohibitive for higher job counts. Here we raise
# the number of allowed file descriptors per process if it appears to be
# low in order to avoid failures due to the limit. See `getrlimit(2)` for
# more information.
if [[ $(ulimit -n) -lt 1000 ]]; then
ulimit -n 32768
fi
if $clean_first; then
$verbose && echo -n >&2 "Cleaning the package repository..."
if [[ -d "${repo_dir}" ]]; then
rm -Rf "${repo_dir}"
fi
$verbose && echo >&2 "done"
fi
if [[
! -e "${repo_dir}/keys/snapshot.json" ||
! -e "${repo_dir}/keys/targets.json" ||
! -e "${repo_dir}/keys/timestamp.json" ||
! -e "${repo_dir}/repository/1.root.json" ||
! -e "${repo_dir}/repository/root.json"
]]; then
echo >&2 "Preparing the package repository..."
# TODO(b/361326913: Would `ffx repository create` work here?
if ! fx-command-run build build/images/updates:prepare_publish
then
exit $?
fi
echo >&2 "done"
fi
else
if $clean_first; then
fx-error "Flag '-C' or '--clean' can only be used if the incremental feature is enabled"
exit 1
fi
fi
# TODO(b/360931702): Allow setting the port independent of the IP address.
# Default the port to 8083 if it is unset.
if [[ -z "${port}" ]]; then
port="$(fx-command-run ffx config get repository.server.default_port 2>/dev/null | tr -d '"')"
fi
# If it is still not set, just use 8083
if [[ -z "${port}" ]]; then
port="8083"
fi
# Error out if we can't start a package server.
check-if-we-can-start-package-server "" "${port}"
err=$?
if [[ "${err}" -ne 0 ]]; then
exit 1
fi
if [[ "${no_device}" == "--no-device" ]]; then
fx-info "Please note that '--no-device' disables automatic device configuration."
fx-info "Use 'fx -t DEVICE add-update-source --port ${port}' to reconfigure devices"
fx-info "as needed, since it is not persisted accross flashes."
else
# Make sure the ssh config is present and has the expected private key
check-ssh-config
fi
log "Starting repository server"
if [[ "${verbose}" == true ]]; then
ffx_flags+=( --verbose )
fi
# Start repository server in foreground, wait until it
# voluntarily exits
# TODO(b/360931702): Allow listening IP address to be set.
server_flags=( repository server start "${server_mode}" --address "${address}:${port}" )
server_flags+=( --repository "${source_name}" --repo-path "${repo_dir}" )
server_flags+=( --trusted-root "${repo_dir}/repository/9.root.json" )
server_flags+=( --alias "fuchsia.com" --alias "chromium.org" )
server_flags+=( --storage-type "${storage_type}" )
if [[ -n "$no_device" ]]; then
server_flags+=( --no-device )
fi
if is_feature_enabled "incremental" || is_feature_enabled "incremental_new"; then
server_flags+=( --auto-publish "${FUCHSIA_BUILD_DIR}/all_package_manifests.list" )
fi
fx-command-run ffx "${ffx_flags[@]}" "${server_flags[@]}"
exit 0