blob: b5e77ce41b8259201791df196c8fa6ad35701b34 [file] [log] [blame]
#!/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
# Default to one week timeout.
readonly TIMEOUT='168h'
# 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
# mount table 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 mount table permissions.
"${JIRI_ROOT}"/release/go/bin/vbecome -duration="${TIMEOUT}" \
-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}\"]}, \
\"Resolve\":{\"In\":[\"...\"]} \
}"
"${JIRI_ROOT}"/release/go/bin/vbecome -duration="${TIMEOUT}" \
-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 mount table.
# 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 -duration="${TIMEOUT}" \
-name="$(name_to_blessing "${NAME}")" \
"${JIRI_ROOT}"/release/projects/sensorlog/go/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
# Runs slcli against master Syncbase with specified $NAME.
# run_slcli MT NAME [args...]
function run_slcli() {
local -r MT="$1"
local -r NAME="$2"
shift 2
"${JIRI_ROOT}"/release/go/bin/vbecome -duration="${TIMEOUT}" \
-name "$(name_to_blessing "${NAME}")" \
"${JIRI_ROOT}"/release/projects/sensorlog/go/bin/slcli -v23.namespace.root "${MT}" \
-service "${NAME}/syncbased" "$@"
}
export -f run_slcli