#!/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
### register dev host as target's update source

## usage: fx add-update-source [--addr ADDR] [--port PORT] [--name NAME]
##
## Configure target device to use a new update source.
##
##   --name NAME      Name the generated update source config NAME.
##   --addr ADDR      Specify the package server address explicitly.
##   --port PORT      The port at ADDR on which the package server is running (default: 8083).
##
## ADDR:
## Any IPv4 / IPv6 address or publicly reachable DNS name.
## Note: ADDR must be the address as-routable by the target device.
## If an link-local IPv6 address is provided, it must include a
## valid scope for the target (e.g. %ethp0014).
## If no ADDR is provided, the default address is assumed to be the
## address of the host machine as seen by the target from an SSH
## connection to the target device.
##
## NAME:
## If no name is supplied, the name defaults to "devhost", otherwise
## it contains the address given.

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

function usage {
  fx-command-help add-update-source
}

function main {
  fx-standard-switches "$@"
  set -- "${FX_ARGV[@]}"

  addr=""
  port="8083"
  source_name="devhost"
  while [[ $# -ne 0 ]]; do
    case "$1" in
      --addr)
        addr="$2"
        if [[ "${source_name}" == "devhost" ]]; then
          source_name="${addr}"
        fi
        shift
        ;;
      --port)
        port="$2"
        shift
        ;;
      --name)
        source_name="$2"
        shift
        ;;
      *)
        fx-error "Unrecognized option: $1"
        usage
        exit 1
    esac
    shift
  done

  if [[ -z "${addr}" ]]; then
    addr=$(fx-command-run shell 'echo $SSH_CONNECTION' | cut -d ' ' -f 1)
    if [[ $? -ne 0 || -z "${addr}" ]]; then
      fx-error "unable to determine host address as seen from the target.  Is the target up?"
      exit 1
    fi
  fi

  addr="$(echo "${addr}" | sed 's/%/%25/g')"

  # A poor mans heuristic for "is an ipv6 address", URL encase escape
  # the address.
  if [[ "${addr}" =~ : ]]; then
    addr="[${addr}]"
  fi

  config_url="http://${addr}:${port}/config.json"

  fx-command-run shell amberctl add_src \
    -n "${source_name}" \
    -f "${config_url}"
  err=$?

  if [[ $err -ne 0 ]]; then
    fx-error "Unable to register update source."
    if [[ $err -eq 2 ]]; then
      # The GET request failed.
      fx-error " - Is 'fx serve' or 'fx serve-updates' running?"
      fx-error " - Can the target reach ${config_url} ?"
    fi
    return "$err"
  fi
}

main "$@"
