#!/usr/bin/env bash
# 
#   Copyright 2017 RIFT.IO Inc
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#
# Author(s): Jeremy Mordkoff
# Creation Date: 26 April 2017
# 
#

# INSTALL.sh
# install launchpad UI and create the service
#

HERE=$(realpath $(dirname $0))
OSM_JENKINS=$(dirname $HERE)
. $OSM_JENKINS/common/install_common



# Defensive bash programming flags
set -o errexit    # Exit on any error
trap 'echo ERROR: Command failed: \"$BASH_COMMAND\"' ERR
set -o nounset    # Expanding an unset variable is an error.  Variables must be
                  # set before they can be used.

###############################################################################
# Set up repo and version
PLATFORM_REPOSITORY=OSM
PLATFORM_VERSION=5.2.0.0.71033

while getopts ":P:V:h" o; do
    case "${o}" in
        P)
            PLATFORM_REPOSITORY=${OPTARG}
            ;;
        V)
            PLATFORM_VERSION=${OPTARG}
            ;;
        h)
            usage
            exit 0
            ;;
        *)
            usage
            exit 1
            ;;
    esac
done

function usage() {
    echo
    echo "NAME:"
    echo "  $0"
    echo
    echo "SYNOPSIS:"
    echo "  $0 -h|--help"
    echo "  $0 -P <PLATFORM_REPOSITORY> -V <PLATFORM_VERSION>"
    echo
    echo "DESCRIPTION:"
    echo "  Prepare current system to run SO and UI."
    echo
    echo "  PLATFORM_REPOSITORY (optional): name of the RIFT.ware repository."
    echo "  PLATFORM_VERSION (optional): version of the platform packages to be installed."
    echo
}


###############################################################################
# Main block

# enable the right repos
curl http://repos.riftio.com/public/xenial-riftware-public-key | apt-key add -
curl -o /etc/apt/sources.list.d/RIFT.list http://buildtracker.riftio.com/repo_file/ub16/${PLATFORM_REPOSITORY}/

# Make the Rift repo a higher priority to work around version conflicts.
cat <<EOF > /etc/apt/preferences.d/rift
Package: *
Pin: origin repos.riftio.com
Pin-Priority: 600
EOF

apt-get update

# and install the tools
apt remove -y rw.toolchain-rwbase tcpdump
apt-get install -y --allow-downgrades rw.tools-container-tools=${PLATFORM_VERSION} rw.tools-scripts=${PLATFORM_VERSION} python
/usr/rift/container_tools/mkcontainer --modes UI-base --rw-version ${PLATFORM_VERSION}

chmod 777 /usr/rift /usr/rift/usr/share

# now disable the RIFT OSM repo so that we'll get UI from
# the OSM repos
rm -f /etc/apt/sources.list.d/RIFT.list

apt-get update
apt-get install -y rw.ui-skyquake
echo "Creating Service ...."
/usr/rift/bin/create_launchpad_service

