#!/bin/bash
#
# Populate environment variables from VM properties
#
# Copyright (C) 2020 Open Mobile Platform LLC.
# Contact: http://jolla.com/
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# - Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in
#   the documentation and/or other materials provided with the
#   distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

set -o nounset
set -o pipefail

VBOX_PROPERTY_PREFIX=/SailfishSDK/ENV/
inside_build_engine() [[ -f /etc/mer-sdk-vbox ]]
inside_virtualbox() [[ $(systemd-detect-virt) == oracle ]]

vbox_property_enumerate()
{
    VBoxControl --nologo guestproperty enumerate --patterns "$VBOX_PROPERTY_PREFIX*" \
        |sed -n 's/^Name: \([^,]\+\),.*/\1/p'
}

vbox_property_get()
{
    local property=$1
    local out=
    out=$(VBoxControl --nologo guestproperty get "$property") || return
    if ! [[ $out =~ ^Value:\ (.+)$ ]]; then
        echo "Unrecognized output from VBoxControl: '$out'" >&2
        return 1
    fi
    printf '%s\n' "${BASH_REMATCH[1]}"
}

setup_vbox_env()
{
    local properties=
    properties=$(vbox_property_enumerate) || return

    local property=
    for property in $properties; do
        local name= value=
        name=${property#$VBOX_PROPERTY_PREFIX}
        value=$(vbox_property_get "$property") || return

        systemctl set-environment "$name=$value"
    done
}

if ! inside_build_engine; then
    echo "$0: Fatal: Not inside an SDK build engine" >&2
    exit 1
fi

if inside_virtualbox; then
    setup_vbox_env
else
    echo "$0: Fatal: Unrecognized or otherwise unsupported build engine type" >&2
    exit 1
fi
