#!/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).
##   --[no-]persist   Enable or disable persistence of repo metadata. Disabled by default.
##
## 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"
  persist=""
  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
        ;;
      --no-persist)
        ;;
      --persist)
        persist="-persist"
        ;;
      *)
        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}" \
    "${persist}"
  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 "$@"
