#!/bin/bash
# Copyright 2015 The Vanadium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

# Functions for starting the Sensor Log daemon and required services with
# appropriate blessings. Expected to be run with V23_CREDENTIALS or through
# an agent. NAME parameters are used both in service names and in blessing
# extensions.

set -eu

# Kills all child processes of the current process.
function kill_child_processes() {
  kill -TERM -- -"${BASHPID}" || true
  sleep 1
  kill -KILL -- -"${BASHPID}" || true
}
export -f kill_child_processes

# Generates a hex-encoded 16-byte random UUID.
function gen_uuid() {
  head -c 256 /dev/urandom | sha256sum | cut -c 1-32
}
export -f gen_uuid

readonly BLESSING_CHAIN_SEPARATOR='/'

# Converts name to blessing extension.
# name_to_blessing NAME
function name_to_blessing() {
  sed -e "s,/,${BLESSING_CHAIN_SEPARATOR},g" <<< "$@"
}
export -f name_to_blessing

# Gets first default blessing for the principal set in the environment.
function get_blessing_root() {
  "${JIRI_ROOT}"/release/go/bin/principal dump -s | cut -d ' ' -f 1 | cut -d ',' -f 1
}
export -f get_blessing_root

# Extracts email address from the blessing obtained by get_blessing_root.
function get_user_email() {
  get_blessing_root | tr "${BLESSING_CHAIN_SEPARATOR}" '\n' | grep '@' | head -n 1
}
export -f get_user_email

# Starts mounttabled at IPADDR:PORT. If $GLOBAL_MOUNT is provided, the
# mounttable mounts itself under $GLOBAL_MOUNT/$NAME.
# run_mounttabled NAME IPADDR:PORT [GLOBAL_MOUNT]
function run_mounttabled() {
  local -r NAME="$1"
  local -r IPADDR_PORT="$2"
  local GLOBAL_MOUNT="${3:-}"
  if [[ -n "${GLOBAL_MOUNT}" ]]; then
    GLOBAL_MOUNT="${GLOBAL_MOUNT}/${NAME}"
  fi
  # TODO(ivanpi): Lock down mounttable permissions.
  "${JIRI_ROOT}"/release/go/bin/vbecome -name="$(name_to_blessing "${NAME}/mounttabled")" \
    "${JIRI_ROOT}"/release/go/bin/mounttabled -v23.tcp.address "${IPADDR_PORT}" \
    -name="${GLOBAL_MOUNT}" \
    &
  sleep 1
}
export -f run_mounttabled

# Starts syncbased with permissions other than resolve restricted to
# <blessing_root>:$NAME.
# run_syncbased MT NAME TMPDIR
function run_syncbased() {
  local -r MT="$1"
  local -r NAME="$2"
  local -r TMPDIR="$3"
  local -r DEF_BLESSING_RUNNER="$(name_to_blessing "$(get_blessing_root)/${NAME}")"
  local -r PERMISSIONS_LITERAL="{\
\"Admin\":{\"In\":[\"${DEF_BLESSING_RUNNER}\"]}, \
\"Read\":{\"In\":[\"${DEF_BLESSING_RUNNER}\"]}, \
\"Write\":{\"In\":[\"${DEF_BLESSING_RUNNER}\"]}, \
\"Debug\":{\"In\":[\"${DEF_BLESSING_RUNNER}\"]}, \
\"Resolve\":{\"In\":[\"...\"]} \
}"
  "${JIRI_ROOT}"/release/go/bin/vbecome -name "$(name_to_blessing "${NAME}/syncbased")" \
    "${JIRI_ROOT}"/release/go/bin/syncbased -v23.namespace.root "${MT}" -name "${NAME}/syncbased" \
    -engine leveldb -root-dir "${TMPDIR}/${NAME}/syncbased" \
    -v23.permissions.literal "${PERMISSIONS_LITERAL}" \
    &
  sleep 1
}
export -f run_syncbased

# Starts measured that uses $PUBLISH_SB to publish the syncgroup. Expects a
# syncbase instance to have been started at $MT with the same $NAME. If
# $PUBLISH_MT is provided, the syncgroup is advertised there in addition to
# the local mounttable.
# run_measured MT NAME DEVID ADMIN PUBLISH_SB [PUBLISH_MT]
function run_measured() {
  local -r MT="$1"
  local -r NAME="$2"
  local -r DEVID="$3"
  local -r ADMIN="$4"
  local -r PUBLISH_SB="$5"
  local -r PUBLISH_MT="${6:-}"
  local -r DEF_BLESSING_ADMIN="$(name_to_blessing "$(get_blessing_root)/${ADMIN}")"
  "${JIRI_ROOT}"/release/go/bin/vbecome -name="$(name_to_blessing "${NAME}")" \
    "${JIRI_ROOT}"/experimental/projects/sensorlog_lite/bin/measured -v23.namespace.root "${MT}" \
    -service "${NAME}/syncbased" -devid="${DEVID}" -admin="${DEF_BLESSING_ADMIN}" \
    -publish-sb "${PUBLISH_SB}" -publish-mt="${PUBLISH_MT}" \
    -alsologtostderr \
    &
  sleep 1
}
export -f run_measured
