#!/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_VERSION=5.2.0.3.73627

while getopts "V:h" o; do
    case "${o}" in
        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 -V <PLATFORM_VERSION>"
    echo
    echo "DESCRIPTION:"
    echo "  Prepare current system to run SO and UI."
    echo
    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 -
echo "deb https://artifactory.riftio.com/debian-OSM xenial main" >/etc/apt/sources.list.d/rift.list

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

apt-get update

# and install the tools
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}


# 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

