#!/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.
##   --server-mode MODE Use repository server mode MODE to register a repository onto a device.
##                      (default: output of 'ffx config get repository.server.mode').
##
## 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 $?
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/updates.sh || exit $?
fx-config-read

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

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

  local addr=""
  local port=""
  local source_name=""
  local persist=""
  local server_mode=""
  while [[ $# -ne 0 ]]; do
    case "$1" in
      --addr)
        addr="$2"
        shift
        ;;
      --port)
        port="$2"
        shift
        ;;
      --name)
        source_name="$2"
        shift
        ;;
      --no-persist)
        ;;
      --persist)
        persist="-p"
        ;;
      --server-mode)
        server_mode="$2"
        shift
        ;;
      *)
        fx-error "Unrecognized option: $1"
        usage
        exit 1
    esac
    shift
  done

  if [[ -z "${server_mode}" ]]; then
    server_mode="$(package-server-mode)"
    local err="$?"
    if [[ "${err}" -ne 0 ]]; then
      exit 1
    fi
  fi

  if [[ "${server_mode}" = "pm" ]]; then
    if [[ -z "${port}" ]]; then
      port="8083"
    fi

    if [[ -z "${source_name}" ]]; then
      if [[ -z "${addr}" ]]; then
        source_name="devhost"
      else
        source_name="${addr}"
      fi
    fi

    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"

    add_repo_args=(-n "${source_name}")
    if [[ ! -z "${persist}" ]]; then
      add_repo_args+=( "${persist}" )
    fi
    add_repo_args+=( "${config_url}" )

    fx-command-run shell pkgctl repo add url "${add_repo_args[@]}"
    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

    rule="'{
      \"version\": \"1\",
      \"content\": [
        {
          \"host_match\": \"fuchsia.com\",
          \"host_replacement\": \"${source_name}\",
          \"path_prefix_match\": \"/\",
          \"path_prefix_replacement\": \"/\"
        },
        {
          \"host_match\": \"chromium.org\",
          \"host_replacement\": \"${source_name}\",
          \"path_prefix_match\": \"/\",
          \"path_prefix_replacement\": \"/\"
        }
      ]
    }'"

    fx-command-run shell pkgctl rule replace json $rule
    err=$?

    if [[ $err -ne 0 ]]; then
      fx-error "The repo has been set up, but there was an error setting the rewriting rule for ${source_name}: $rule"
      fx-error "To remove the repo, run \"fx shell pkgctl repo rm fuchsia-pkg://${source_name}\"."
      return $err
    fi
  else
    if [[ ! -z "$addr" ]]; then
      fx-error "The feature 'legacy_serve' and ffx does not support the '--addr' flag"
      exit 1
    fi

    ffx-repository-check-server-address "" "$port"
    err=$?
    if [[ $err -ne 0 ]]; then
      exit "$err"
    fi

    # Use the build directory's name by default. Note that package URLs are not
    # allowed to have underscores, so replace them with hyphens.
    if [[ -z "${source_name}" ]]; then
      source_name="$(ffx-default-repository-name)"
    fi


    register_args=()
    if [[ -z "{persist}" ]]; then
      register_args+=( --storage-type persistent )
    fi

    ffx-register-repository "$source_name" "${register_args[@]}" || return $?
  fi

  fx-command-run shell update channel set "${source_name}"
  err=$?
  if [[ $err -ne 0 ]]; then
    fx-error "Failed to change the update channel to '${source_name}'"
    return "$err"
  fi
}

main "$@"
