#!/usr/bin/env bash
# $Id$

set -o pipefail

##
### Copyright 2011-2013, Boundary
###
### 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.
###

PLATFORMS=("Ubuntu" "Debian" "CentOS" "Amazon" "RHEL" "SmartOS" "openSUSE" "FreeBSD" "LinuxMint" "Gentoo" "Oracle" "Scientific" "SHMZ" "OSX")

# Put additional version numbers here.
# These variables take the form ${platform}_VERSIONS, where $platform matches
# the tags in $PLATFORMS
Ubuntu_VERSIONS=("10.04" "10.10" "11.04" "11.10" "12.04" "12.10" "13.04" "13.10" "14.04" "14.10" "15.04")
Debian_VERSIONS=("5" "6" "7")
CentOS_VERSIONS=("5" "6" "7")
Amazon_VERSIONS=("2012.09" "2013.03")
RHEL_VERSIONS=("5" "6" "7")
SmartOS_VERSIONS=("1" "12" "13")
openSUSE_VERSIONS=("12.1" "12.3" "13.1")
FreeBSD_VERSIONS=("9.0-RELEASE 9.1-RELEASE 9.2-RELEASE 10.0-RELEASE")
LinuxMint_VERSIONS=("13", "14", "15", "16")
Gentoo_VERSIONS=("1.12.11.1")
Oracle_VERSIONS=("5" "6" "7")
Scientific_VERSIONS=("6" "7")
SHMZ_VERSIONS=("5" "6")
OSX_VERSIONS=("12.0.0" "13.0.0" "14.0.0")

# sed strips out obvious things in a version number that can't be used as
# a bash variable
function map() { eval "$1"`echo $2 | sed 's/[\. -]//g'`='$3' ; }
function get() { eval echo '${'"$1`echo $2 | sed 's/[\. -]//g'`"'#hash}' ; }

# Map distributions to common strings.
map Ubuntu 10.04 lucid
map Ubuntu 10.10 maverick
map Ubuntu 11.04 natty
map Ubuntu 11.10 oneiric
map Ubuntu 12.04 precise
map Ubuntu 12.10 quantal
map Ubuntu 13.04 raring
map Ubuntu 13.10 saucy
map Ubuntu 14.04 trusty
map Ubuntu 14.10 utopic
map Ubuntu 15.04 vivid
map Debian 5 lenny
map Debian 6 squeeze
map Debian 7 wheezy
map RHEL 5 Tikanga
map RHEL 6 Santiago
map RHEL 7 Maipo

# For version number updates you hopefully don't need to modify below this line
# -----------------------------------------------------------------------------

SCRIPTNAME="$(basename ${0})"
APICREDS=
# API 'enterprise' host and cred/token
APIHOST_ENT=${APIHOST_ENT:-"https://api.boundary.com"}
APICREDS_ENT=
# API 'premium' host and cred/token
APIHOST_PRE=${APIHOST_PRE:-"https://premium-api.boundary.com"}
APICREDS_PRE=

METERTAGS=

SUPPORTED_ARCH=0
SUPPORTED_PLATFORM=0

APT="apt.boundary.com"
YUM="yum.boundary.com"
SMARTOS="smartos.boundary.com"
FREEBSD="freebsd.boundary.com"
GENTOO="gentoo.boundary.com"
OSX="mac.boundary.com"

APT_CMD="apt-get -q -y --force-yes"
YUM_CMD="yum -d0 -e0 -y"

STAGING="false"

FEATURES="flow_metrics"
DEFEATURES=""

trap "exit" INT TERM EXIT

function print_supported_platforms() {
    echo
    echo "Supported platforms by the installation script are:"
    for d in ${PLATFORMS[*]}
    do
        echo -n " * $d:"
        foo="\${${d}_VERSIONS[*]}"
        versions=`eval echo $foo`
        for v in $versions; do
            echo -n " $v"
        done
        echo ""
    done
}

function print_pgp_key() {
    cat <<-EOF
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)

mQENBE3WllEBCADlEuA7DCcI0B1/1rXJ4SzzQGXcHwmsxLVGnRR9FX4Fu3oCz4sc
18/FkPHb2AwFfClv4xH6gOUBJVCDyub/C6PJeLolkc51SLA2lO3y5e3OpJ7uC8Ln
/P5AC96FDhIEPH+vVnBVxgYRFj/1vDlqUcJXUSN3ZnLxzHwnHJ+lATNydbTi3ltL
Kr53YOD5FmuKpc2hkNzT+9Lg1/aVEKXpnSjzlNT/1VIrXgJOzv/xyKvpSD2fb5M3
QZMjEkrod5botvclt/y6P8LNWsmlG0eM+JiewnDzwJ3OnhekSzHqoh3kVKQ3YJed
i1ZKInNthXQ5sSiHrsxHhJFGuVAQVA0/AmJfABEBAAG0G0JvdW5kYXJ5IDxvcHNA
Ym91bmRhcnkuY29tPokBOAQTAQIAIgUCTdaWUQIbAwYLCQgHAwIGFQgCCQoLBBYC
AwECHgECF4AACgkQQ4Go5GUyzCAqWggAjuJgzEYO1nTVd4hBhkhuxH1d/9R5eDzN
SvxMk9gI2kKd71DsVP7PCVlPPIkzqL/IMv5ffO3me3R0S3bZzquhCOhrUc987GgZ
+rPEcb0sDjT4fzcVeAOuaIf3T8oysx9ngB5pE4i3fatD43WvTGbj4LmU9XxiwZ6z
AKzIYltGy/+Cq2JJjYgg80O2RmG8FFf8k/FujkbsNgNICQwWnAGKKlpJ4b65M5zu
oNNUGFcJopGGufKLxXAiRwJqOx8a+EvD7/MEs5VYQJGeBgoaE6ZgXwufYJYn0Lv3
6fxTtkLlIrD27gvTbV1oF8tj+T+7ayKj75YGnaH03QYBOG8tmbqV/A==
=p4gi
-----END PGP PUBLIC KEY BLOCK-----
EOF
}

EC2_INTERNAL="http://169.254.169.254/latest/meta-data"
EC2_TAGS="instance-type placement/availability-zone"
EC2_DESC_TAGS=
which euca-describe-tags > /dev/null 2>&1
if [ $? -eq 0 ]; then
    EC2_DESC_TAGS=euca-describe-tags
else
    which ec2-describe-tags > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        EC2_DESC_TAGS=ec2-describe-tags
    fi
fi

function ec2_find_tags() {
    echo -n "Checking this is an ec2 environment..."
    EC2=`curl -s --connect-timeout 5 "$EC2_INTERNAL"`
    exit_code=$?

    if [ "$exit_code" -eq "0" ]; then
        # check to see if we *really* are on EC2.
        # Some Proxies emit false results for non-existent server addresses
        $CURL -is --connect-timeout 5 "$EC2_INTERNAL" | grep 'Server: EC2ws' > /dev/null
        exit_code=$?

        if [ "$exit_code" -ne "0" ]; then
            echo "no."
            return 0
        fi
        echo "yes."
        echo "Auto generating ec2 tags for this meter."
    else
        echo "no."
        return 0
    fi

    EC2METERTAGS=ec2

    for tag in $EC2_TAGS; do
        local AN_TAG
        local exit_code

        AN_TAG=`curl -s --connect-timeout 5 "$EC2_INTERNAL/$tag"`
        exit_code=$?

        # if the exit code is 7, that means curl couldnt connect so we can bail
        # since we probably are not on ec2.
        if [ "$exit_code" -eq "7" ]; then
            # do nothing
            return 0
        fi

        # it appears that an exit code of 28 is also a can't connect error
        if [ "$exit_code" -eq "28" ]; then
             # do nothing
            return 0
        fi

        # otherwise, maybe there was as timeout or something, skip that tag.
        if [ "$exit_code" -ne "0" ]; then
            continue
        fi

        for an_tag in $AN_TAG; do
            EC2METERTAGS=$EC2METERTAGS,$an_tag
        done
    done

    # extract additional tags if the commands and access variables are set
    if [ -n "$EC2_DESC_TAGS" -a -n "$EC2_ACCESS_KEY" -a -n "$EC2_SECRET_KEY" -a -n "$EC2_URL" ]; then
        for an_tag in `${EC2_DESC_TAGS} --filter "resource-id=\`curl -s http://169.254.169.254/latest/meta-data/instance-id\`" | grep -v Name | sed 's/[ \t]/ /g' | cut -d " " -f 5-`; do
            EC2METERTAGS=$EC2METERTAGS,$an_tag
        done
    fi

    echo Discovered ec2 tags: $EC2METERTAGS
    if [ -n "${METERTAGS}" ]; then
        METERTAGS=$METERTAGS,$EC2METERTAGS
    else
        METERTAGS=$EC2METERTAGS
    fi
}

function check_distro_version() {
    PLATFORM=$1
    DISTRO=$2
    VERSION=$3

    TEMP="\${${DISTRO}_versions[*]}"
    VERSIONS=`eval echo $TEMP`
    VERSION_CMP=

    if [ $DISTRO = "Ubuntu" ]; then
        MAJOR_VERSION=`echo $VERSION | awk -F. '{print $1}'`
        MINOR_VERSION=`echo $VERSION | awk -F. '{print $2}'`
        VERSION_CMP=$MAJOR_VERSION.$MINOR_VERSION

    elif [ $DISTRO = "CentOS" ] || [ $DISTRO = "RHEL" ] || [ $DISTRO = "Oracle" ] || [ $DISTRO = "Scientific" ] || [ $DISTRO = "SHMZ" ]; then
        MAJOR_VERSION=`echo $VERSION | awk -F. '{print $1}'`
        VERSION_CMP=$MAJOR_VERSION

    elif [ $DISTRO = "Amazon" ]; then
        VERSION=`echo $PLATFORM | awk '{print $5}'`
        # Some of these include minor numbers. Trim.
        VERSION_CMP=${VERSION:0:7}

    elif [ $DISTRO = "Debian" ]; then
        MAJOR_VERSION=`echo $VERSION | awk -F. '{print $1}'`
        VERSION_CMP=$MAJOR_VERSION

    else
        VERSION_CMP=$VERSION
    fi

    TEMP="\${${DISTRO}_VERSIONS[*]}"
    VERSIONS=`eval echo $TEMP`
    for v in $VERSIONS ; do
        if [ "$VERSION_CMP" = "$v" ]; then
            return 0
        fi
    done

    echo "$DISTRO $VERSION is not officially supported yet"
    return 1
}

function print_help() {
    echo "${SCRIPTNAME} [-s] -i <API token>[,<API token>] \\"
    i=0; while [ ${i} -le ${#SCRIPTNAME} ]; do echo -n " "; i=$((i + 1)); done
    echo "[--enable-flow-metrics] [--enable-server-metrics] \\"
    i=0; while [ ${i} -le ${#SCRIPTNAME} ]; do echo -n " "; i=$((i + 1)); done
    echo "[--gd-relay-file <file>]"
    echo
    echo " Basic options:"
    echo "   -i: Required input for authentication. The API token can be one (or both) of"
    echo "       the following:"
    echo
    echo "         - Boundary Premium"
    echo "            The API token is api.XXXXXXXXXX-XXXX, which can be found in"
    echo "            'Settings->Account' as 'Your API token'."
    echo "         - Boundary Enterprise"
    echo "            The API token is ORGID:APIKEY, which can be found in"
    echo "            Account Settings in the Boundary Enterprise WebUI."
    echo
    echo "   -s: Install the latest testing meter from the staging repositories"
    echo "   -t: comma-separated list of tags to assign this meter"
    echo
    echo " Advanced options:"
    echo "   --enable-flow-metrics:   Enable reporting network flow metrics (default)"
    echo "   --enable-server-metrics: Enable reporting host level metrics"
    echo "   --disable-metrics:       Disable reporting of all metrics"
    echo "   --gd-relay-file <file>:  Import relay settings file (e.g. config.json)"
    exit 0
}

function do_install() {
    # export 'enterprise' and 'premium' tokens to the environment...
    export INSTALLTOKEN="${APICREDS}"
    export INSTALLTOKENS="${APICREDS}"
    export PROVISIONPREMIUMAPIHOST="${APIHOST_PRE}"
    export PROVISIONENTERPRISEAPIHOST="${APIHOST_ENT}"
    export PROVISIONTAGS="${METERTAGS}"
    export PROVISIONFEATURES="${FEATURES}"
    export PROVISIONDEFEATURES="${DEFEATURES}"
    export GDRELAYFILE="${GDRELAYFILE}"
    if [ "$DISTRO" = "Ubuntu" ] || [ $DISTRO = "Debian" ]; then
        APT_STRING="deb https://${APT}/ubuntu/ `get $DISTRO $MAJOR_VERSION.$MINOR_VERSION` universe"
        if [ "$DISTRO" = "Debian" ]; then
            APT_STRING="deb https://${APT}/debian/ `get $DISTRO $MAJOR_VERSION` main"
        fi
        echo -n "Adding repository $APT_STRING..."
        sh -c "echo \"$APT_STRING\" > /etc/apt/sources.list.d/boundary.list"

        print_pgp_key | apt-key add -
        if [ $? -gt 0 ]; then
            echo "Error adding Boundary GPG key to list of trusted keys!"
            exit 1
        fi

        echo "Updating apt repository cache..."
        $APT_CMD update > /dev/null
        $APT_CMD install boundary-meter
        return $?

    elif [ "$DISTRO" = "openSUSE" ]; then
        GPG_KEY_LOCATION=/tmp/RPM-GPG-KEY-Boundary
        ARCH_STR="x86_64/"

        print_pgp_key > ${GPG_KEY_LOCATION}
        rpm --import ${GPG_KEY_LOCATION}
        if [ $? -gt 0 ]; then
            echo "Error adding Boundary GPG key to list of trusted keys!"
            exit 1
        fi

        echo "Adding repository http://${YUM}/opensuse/os/$VERSION/$ARCH_STR"
        zypper addrepo -c -k -f -g http://${YUM}/opensuse/os/$VERSION/$ARCH_STR boundary

        zypper install -f -y boundary-meter
        return $?

    elif [ "$DISTRO" = "CentOS" ] || [ $DISTRO = "Amazon" ] || [ $DISTRO = "RHEL" ] || [ $DISTRO = "Oracle" ] || [ $DISTRO = "Scientific" ] || [ $DISTRO = "SHMZ" ]; then
        GPG_KEY_LOCATION=/etc/pki/rpm-gpg/RPM-GPG-KEY-Boundary
        if [ "$MACHINE" = "i686" ]; then
            ARCH_STR="i386/"
        elif [ "$MACHINE" = "x86_64" ]; then
            ARCH_STR="x86_64/"
        fi

        # Amazon hack: we know the Amazon Linux AMIs are binary
        # compatible with CentOS
        if [ $DISTRO = "Amazon" ]; then
            MAJOR_VERSION=6
        fi

        echo "Adding repository http://${YUM}/centos/os/$MAJOR_VERSION/$ARCH_STR"

        sh -c "cat - > /etc/yum.repos.d/boundary.repo <<EOF
[boundary]
name=boundary
baseurl=http://${YUM}/centos/os/$MAJOR_VERSION/$ARCH_STR
gpgcheck=1
gpgkey=file://$GPG_KEY_LOCATION
enabled=1
EOF"

        print_pgp_key > ${GPG_KEY_LOCATION}
        $YUM_CMD install boundary-meter
        return $?

    elif [ "$DISTRO" = "SmartOS" ]; then
      SMARTOS_PKG=$(curl -s http://${SMARTOS}/${MACHINE}/ | sed -n 's/^.*\"\(boundary-meter.*tgz\)\".*$/\1/p' | tail -n 1)
      pkg_add -f -v http://${SMARTOS}/${MACHINE}/${SMARTOS_PKG}
      return $?

    elif [ "$DISTRO" = "FreeBSD" ]; then
        # Use the way which works for https per OS ver.
        if [ -n "$(echo ${VERSION} | sed -n '/^1[0-9]\./p')" ]; then
            curl -s "https://${FREEBSD}/`echo ${VERSION} | awk -F '-' '{print $1}'`/${MACHINE}/boundary-meter-current.txz" > boundary-meter-current.txz
        else
            fetch "https://${FREEBSD}/`echo ${VERSION} | awk -F '-' '{print $1}'`/${MACHINE}/boundary-meter-current.txz"
        fi
        pkg add boundary-meter-current.txz

    elif [ "$DISTRO" = "Gentoo" ]; then
        if [ -e boundary-meter ]; then
            echo
            echo "The installation script needs to create a 'boundary-meter' directory in the current"
            echo "working directory for installation to proceed. Please run this script from"
            echo "another location or remove the currently-existing 'boundary-meter' file or directory"
            echo "and try again."
            echo
            return 1
        fi
        mkdir boundary-meter
        (cd boundary-meter;
         wget "http://${GENTOO}/engineyard/latest"
         wget "http://${GENTOO}/engineyard/`cat latest`")
        ebuild --skip-manifest boundary-meter/`cat boundary-meter/latest` merge
        rm -fr boundary-meter
    elif [ "$DISTRO" = "OSX" ]; then
        curl https://$OSX/boundary-meter-current-osx-x86_64.tar.gz > boundary-meter.tar.gz
        tar xvf boundary-meter.tar.gz
        cd boundary-meter-*
        ./start.sh -i ${APICREDS} -a ${APIHOST_PRE}
		echo "To start the meter again, run './start.sh' in the `boundary-meter-*` directory"
    fi
}

function pre_install_sanity() {
    which curl > /dev/null
    if [ $? -gt 0 ]; then
        echo "Installing curl ..."

        if [ $DISTRO = "Ubuntu" ] || [ $DISTRO = "Debian" ]; then
            echo "Updating apt repository cache..."
            $APT_CMD update > /dev/null
            $APT_CMD install curl

        elif [ $DISTRO = "CentOS" ] || [ $DISTRO = "Amazon" ] || [ $DISTRO = "RHEL" ] || [ $DISTRO = "Oracle" ] || [ $DISTRO = "Scientific" ] || [ $DISTRO = "SHMZ" ]; then
            if [ "$MACHINE" = "i686" ]; then
                $YUM_CMD install curl.i686
            elif [ "$MACHINE" = "x86_64" ]; then
                $YUM_CMD install curl.x86_64
            fi

        elif [ $DISTRO = "FreeBSD" ]; then
            pkg install -y curl
        fi
    fi

    if [ $DISTRO = "SmartOS" ]; then
        CURL="`which curl` -k"
    else
        CURL="`which curl`"
    fi

    if [ $DISTRO = "Ubuntu" ] || [ $DISTRO = "Debian" ]; then
        test -f /usr/lib/apt/methods/https
        if [ $? -gt 0 ];then
            echo "apt-transport-https is not installed to access Boundary's HTTPS based APT repository ..."
            echo "Updating apt repository cache..."
            $APT_CMD update > /dev/null
            echo "Installing apt-transport-https ..."
            $APT_CMD install apt-transport-https
        fi
    fi
}

function update_api_creds() {
    for i in `echo $APICREDS|sed 's/,/ /g'`; do
        if [ -n "`echo $i | sed -n '/^api/p'`" ]; then
            if [ -z "$APICREDS_PRE" ]; then
                APICREDS_PRE=`echo $i | sed -n '/^api/p'`
            fi
        elif [ -z "$APICREDS_ENT" ]; then
            APICREDS_ENT=`echo $i | sed -n '/:/p'`
        fi
    done
}

function update_features() {
    if [ -z "${FEATURES}" ]; then
        FEATURES="${1}"
    else
        FEATURES="${FEATURES},${1}"
    fi
}

# Grab some system information
if [ -f /etc/redhat-release ] ; then
    PLATFORM=`cat /etc/redhat-release`
    DISTRO=`echo $PLATFORM | awk '{print $1}'`
    if [ "$DISTRO" = "Fedora" ]; then
       DISTRO="RHEL"
       VERSION="6"
    else
       if [ "$DISTRO" != "CentOS" ]; then
           if [ "$DISTRO" = "Enterprise" ] || [ -f /etc/oracle-release ]; then
                # Oracle "Enterprise Linux"/"Linux"
                DISTRO="Oracle"
                VERSION=`echo $PLATFORM | awk '{print $7}'`
           elif [ "$DISTRO" = "Red" ]; then
                DISTRO="RHEL"
                VERSION=`echo $PLATFORM | awk '{print $7}'`
           elif [ "$DISTRO" = "Scientific" ]; then
                VERSION=`echo $PLATFORM | awk '{print $4}'`
           elif [ "$DISTRO" = "SHMZ" ]; then
                VERSION=`echo $PLATFORM | awk '{print $3}'`
           else
                DISTRO="unknown"
                PLATFORM="unknown"
                VERSION="unknown"
           fi
       elif [ "$DISTRO" = "CentOS" ]; then
           if [ "`echo $PLATFORM | awk '{print $2}'`" = "Linux" ]; then
                # CentOS 7 now includes "Linux" in the release string...
                VERSION=`echo $PLATFORM | awk '{print $4}'`
           else
                VERSION=`echo $PLATFORM | awk '{print $3}'`
           fi
       fi
    fi
    MACHINE=`uname -m`
elif [ -f /etc/system-release ]; then
    PLATFORM=`cat /etc/system-release | head -n 1`
    DISTRO=`echo $PLATFORM | awk '{print $1}'`
    VERSION=`echo $PLATFORM | awk '{print $5}'`
    MACHINE=`uname -m`
elif [ -f /etc/lsb-release ] ; then
    #Ubuntu version lsb-release - https://help.ubuntu.com/community/CheckingYourUbuntuVersion
    . /etc/lsb-release
    PLATFORM=$DISTRIB_DESCRIPTION
    DISTRO=$DISTRIB_ID
    VERSION=$DISTRIB_RELEASE
    MACHINE=`uname -m`
    if [ "$DISTRO" = "LinuxMint" ]; then
       DISTRO="Ubuntu"
       VERSION="12.04"
    fi
elif [ -f /etc/debian_version ] ; then
    #Debian Version /etc/debian_version - Source: http://www.debian.org/doc/manuals/debian-faq/ch-software.en.html#s-isitdebian
    DISTRO="Debian"
    VERSION=`cat /etc/debian_version`
    INFO="$DISTRO $VERSION"
    PLATFORM=$INFO
    MACHINE=`uname -m`
elif [ -f /etc/os-release ] ; then
    . /etc/os-release
    PLATFORM=$PRETTY_NAME
    DISTRO=$NAME
    VERSION=$VERSION_ID
    MACHINE=`uname -m`
elif [ -f /etc/gentoo-release ] ; then
    PLATFORM="Gentoo"
    DISTRO="Gentoo"
    VERSION=`cat /etc/gentoo-release | cut -d ' ' -f 5`
    MACHINE=`uname -m`
else
    PLATFORM=`uname -sv | grep 'SunOS joyent'` > /dev/null
    if [ "$?" = "0" ]; then
      PLATFORM="SmartOS"
      DISTRO="SmartOS"
      MACHINE="i386"
      VERSION=13
    elif [ "$?" != "0" ]; then
        uname -sv | grep 'FreeBSD' > /dev/null
        if [ "$?" = "0" ]; then
            PLATFORM="FreeBSD"
            DISTRO="FreeBSD"
            VERSION=`uname -r`
            MACHINE=`uname -m`
        else
            uname -sv | grep 'Darwin' > /dev/null
            if [ "$?" = "0" ]; then
                PLATFORM="Darwin"
                DISTRO="OSX"
                VERSION=`uname -r`
                MACHINE=`uname -m`
            fi
        fi
    fi
fi

ENABLE_FLOW_METRICS=""
ENABLE_SERVER_METRICS=""
GDRELAYFILE=""
while getopts "hdsi:t:f:-:" opts; do
    case $opts in
        h)  print_help;;
        s)  STAGING="true";;
        i)  APICREDS="$OPTARG";;
        t)  METERTAGS="$OPTARG";;
        f)  echo "WARNING! You are OVERRIDING this script's OS detection."
            echo "On unsupported platforms, your mileage may vary!"
            print_supported_platforms
            echo "Please contact support@boundary.com to request support for your architecture."

            # This takes input basically of the form "OS VERSION" for the OS
            # you're mimicking.
            # E.g., "CentOS 6.2", "Ubuntu 11.10", etc.
            PLATFORM="$OPTARG"
            DISTRO=`echo $PLATFORM | awk '{print $1}'`
            VERSION=`echo $PLATFORM | awk '{print $2}'`

            echo "Script will masquerade as \"$PLATFORM\""
            ;;
        -)  case ${OPTARG} in
                enable-flow-metrics)
                    ENABLE_FLOW_METRICS="flow_metrics"
                    ;;
                enable-server-metrics)
                    ENABLE_SERVER_METRICS="server_metrics"
                    ;;
                disable-metrics)
                    ENABLE_FLOW_METRICS=""
                    ENABLE_SERVER_METRICS=""
                    FEATURES=""
                    ;;
                gd-relay-file)
                    GDRELAYFILE="${!OPTIND}"
                    shift
                    if [ -z "${GDRELAYFILE}" ]; then
                        echo "Error: missing config filename for --${OPTARG} arg."
                        exit 1
                    elif [ ! -f "${GDRELAYFILE}" ]; then
                        echo "Error: could not find file '${GDRELAYFILE}'"
                        exit 1
                    fi
                    ;;
                *)
                    echo "Error: unrecognized option '--${OPTARG}'"
                    echo print_help
                    ;;
            esac
            ;;
        [?]) print_help;;
    esac
done

update_api_creds

if [ -n "${ENABLE_FLOW_METRICS}" -o -n "${ENABLE_SERVER_METRICS}" ]; then
    FEATURES=""
    for f in ${ENABLE_FLOW_METRICS} ${ENABLE_SERVER_METRICS}; do
        if [ -n "${FEATURES}" ]; then
            FEATURES="${FEATURES},${f}"
        else
            FEATURES=${f}
        fi
    done
fi

if [ $STAGING = "true" ]; then
    APT="apt-staging.boundary.com"
    YUM="yum-staging.boundary.com"
    SMARTOS="smartos-staging.boundary.com"
    FREEBSD="freebsd-staging.boundary.com"
    GENTOO="gentoo-staging.boundary.com"
    OSX="mac-staging.boundary.com"
fi

# If this script is being run by root for some reason, don't use sudo.
if [ ${DISTRO} != "OSX" -a "$(id -u)" != "0" ]; then
    SUDO=`which sudo`
    if [ $? -ne 0 ]; then
        echo "This script must be executed as the 'root' user or with sudo"
        echo "in order to install the Boundary meter."
        echo
        echo "Please install sudo or run again as the 'root' user."
        echo "For assistance, support@boundary.com"
        exit 1
    else
        sudo -E $0 $@
        exit 0
    fi
fi

if [ "$MACHINE" = "i686" ] ||
   [ "$MACHINE" = "i586" ] ||
   [ "$MACHINE" = "i386" ] ; then
    ARCH="32"
    SUPPORTED_ARCH=1
fi

#determine hard vs. soft float using readelf
if [[ "$MACHINE" == arm* ]] ; then
    if [ -x /usr/bin/readelf ] ; then
        HARDFLOAT=`readelf -a /proc/self/exe | grep armhf`
        if [ -z "$HARDFLOAT" ]; then
            if [ "$MACHINE" = "armv7l" ] ||
               [ "$MACHINE" = "armv6l" ] ||
               [ "$MACHINE" = "armv5tel" ] ||
               [ "$MACHINE" = "armv5tejl" ] ; then
                ARCH="32"
                SUPPORTED_ARCH=1
                echo "Detected $MACHINE running armel..."
            fi
        else
            if [ "$MACHINE" = "armv7l" ] ; then
                ARCH="32"
                SUPPORTED_ARCH=1
                echo "Detected $MACHINE running armhf..."
            else
                echo "$MACHINE with armhf ABI is not supported. Try the armel ABI"
            fi
        fi
    else
        echo "Cannot determine ARM ABI, please install the 'binutils' package"
    fi
fi

if [ "$MACHINE" = "x86_64" ] || [ "$MACHINE" = "amd64" ]; then
    ARCH="64"
    SUPPORTED_ARCH=1
fi

if [ $SUPPORTED_ARCH -eq 0 ]; then
    echo "Unsupported architecture ($MACHINE) ..."
    echo "This is an unsupported platform for the Boundary Meter."
    echo "Please contact support@boundary.com to request support for this architecture."
    exit 1
fi

# Check the distribution
for d in ${PLATFORMS[*]} ; do
    if [ "$DISTRO" = "$d" ]; then
        SUPPORTED_PLATFORM=1
        break
    fi
done
if [ $SUPPORTED_PLATFORM -eq 0 ]; then
    echo "Your platform is not supported by this script at this time."
    echo "Please check https://app.boundary.com/docs/meter_install for alternate installation instructions."
    print_supported_platforms
    exit 1
fi

if [ -z "$APICREDS" ]; then
    print_help
fi

if [ -n "$APICREDS_ENT" ]; then
    APIID=`echo $APICREDS_ENT | awk -F: '{print $1}'`
    APIKEY=`echo $APICREDS_ENT | awk -F: '{print $2}'`
    if [ "${#APIID}" -lt 10 -o "${#APIKEY}" -lt 10 ]; then
        echo "Please enter a valid Boundary Enterprise installation token"
        echo "Expected APIID:APIKEY, got: '${APICREDS_ENT}'"
        echo

        print_help
    fi
fi

if [ -n "$APICREDS_PRE" ]; then
    CREDS_INVALID=""
    if [ "${DISTRO}" = "FreeBSD" -o "${DISTRO}" = "OSX" ]; then
        if [ -z "`echo ${APICREDS_PRE} | sed -E -n '/api\.[0-9a-fA-F]+-[0-9]+$/p'`" ]; then
            CREDS_INVALID="yes"
        fi
    else
        if [ -z "`echo ${APICREDS_PRE} | sed -n '/api\.[0-9a-fA-F]\+-[0-9]\+$/p'`" ]; then
            CREDS_INVALID="yes"
        fi
    fi
    if [ -n "${CREDS_INVALID}" ]; then
        echo "Please enter a valid Boundary Premium installation token"
        echo "Expected APITOKEN, got: '${APICREDS_PRE}'"
        echo

        print_help
    fi
fi

echo "Detected $DISTRO $VERSION..."

# Check the version number
UNSUPPORTED_RELEASE=0
check_distro_version "$PLATFORM" $DISTRO $VERSION
if [ $? -ne 0 ]; then
    UNSUPPORTED_RELEASE=1
fi

# The version number hasn't been found; let's just try and masquerade
# (and tell users what we're doing)
if [ $UNSUPPORTED_RELEASE -eq 1 ] ; then
    TEMP="\${${DISTRO}_VERSIONS[*]}"
    VERSIONS=`eval echo $TEMP`
    # Assume ordered list; grab latest version
    VERSION=`echo $VERSIONS | awk '{print $NF}'`
    MAJOR_VERSION=`echo $VERSION | awk -F. '{print $1}'`
    MINOR_VERSION=`echo $VERSION | awk -F. '{print $2}'`
    echo "Continuing; for reference, script is masquerading as: $DISTRO $VERSION"
fi

# At this point, we think we have a supported OS.
pre_install_sanity $d $v

ec2_find_tags

do_install

if [ $? -ne 0 ]; then
    echo "The meter installation failed."
    echo "For help, please contact support@boundary.com describing the problem."
    exit 1
fi

echo ""
echo "The meter has been installed successfully!"

exit 0