#!/bin/bash
# Copyright (c) 2012 VMware, Inc.
# Install vcap components on Ubuntu systems.

set -o errexit

usage() {
cat <<EOF
usage: $0 options

OPTIONS:
  -h           Show this message
  -a           Answer yes to all questions
  -p           http proxy i.e. -p http://username:password@host:port/
  -c           deployment config
  -d           cloudfoundry home
  -D           cloudfoundry domain (default: vcap.me)
  -r           cloud foundry repo base
  -b           cloud foundry repo branch/tag/SHA
EOF
}

function run_cmd () {
  if [ -z "$PROXY" ]; then
    sudo $*
  else
    sudo env http_proxy=$PROXY $*
  fi
}

function clear_bundler_settings () {
  [ $# -ge 1 ] || return 1
  local DIR=$1
  # Do we have a Bundler problem?
  find $DIR -type d -name .bundle | grep -Fq .bundle || return 0
  if [ "$ALL" != true ]; then
    read -p "Remembered Bundler options could cause you troubles, do you want me to clear them for you? [Y/n]"
    [[ $REPLY =~ ^[nN] ]] && return 0
  fi
  (cd $DIR && find -type d -name .bundle -prune -exec rm -r {} \; )
}

RUBY="/usr/bin/ruby"
GEM="/usr/bin/gem"
APT_CONFIG="-o Acquire::http::No-Cache=True -o Acquire::BrokenProxy=true -o Acquire::Retries=3"

if [ -n "$http_proxy" ]; then
  if [ -z "$https_proxy" ]; then
    echo "Please set https_proxy env variable."
    exit 1
  fi
  PROXY=$http_proxy
fi

while getopts "had:p:c:D:r:b:" OPTION
do
  case $OPTION in
    h)
      usage
      exit 1
      ;;
    a)
      ALL=true
      ;;
    c)
      CONFIG_FILE=$OPTARG
      ;;
    d)
      CLOUDFOUNDRY_HOME=$OPTARG
      ;;
    D)
      CLOUDFOUNDRY_DOMAIN=$OPTARG
      ;;
    r)
      VCAP_REPO_BASE=$OPTARG
      ;;
    b)
      VCAP_REPO_BRANCH=$OPTARG
      ;;
    p)
      PROXY=$OPTARG
      export http_proxy=$PROXY
      export https_proxy=$PROXY
  esac
done

if [ -z "$CLOUDFOUNDRY_HOME" ]; then
  CLOUDFOUNDRY_HOME=~/cloudfoundry
fi

if [ -z "$CLOUDFOUNDRY_DOMAIN" ]; then
  CLOUDFOUNDRY_DOMAIN=vcap.me
fi

if [ -z "$VCAP_REPO_BASE" ]; then
  VCAP_REPO_BASE=https://github.com/cloudfoundry
fi

if [ -z "$VCAP_REPO_BRANCH" ]; then
  VCAP_REPO_BRANCH=master
fi

# apt-get update
run_cmd apt-get update

# Check if we have access to the web
echo "Installing wget..."
if ! run_cmd apt-get $APT_CONFIG install -qym wget; then
  echo "Can't install prerequisite: wget"
  exit 1
fi

echo "Checking web connectivity."
if ! wget -q -T 2 -t 2 -O - http://api.run.pivotal.io/info | grep "Cloud Foundry sponsored by Pivotal" > /dev/null; then
  echo "Giving up. Cannot connect to the web. Check your proxy settings if you are behind a proxy."
  exit 1
fi

# Install chef
readonly PREREQUISITES=(ruby ruby-dev libopenssl-ruby rdoc ri irb build-essential ssl-cert)
echo "Installing prerequisites..."
run_cmd apt-get $APT_CONFIG install -qym "${PREREQUISITES[@]}"

if [ ! -f ${GEM} ] || [ `${GEM} -v` \< "1.3.6" ]; then
  # Blobstore_client requires gem >= 1.3.6
  echo "Installing rubygems..."
  CWD=`pwd`
  cd /tmp
  wget -q http://production.cf.rubygems.org/rubygems/rubygems-1.3.6.tgz
  tar zxf rubygems-1.3.6.tgz
  cd rubygems-1.3.6
  sudo ${RUBY} setup.rb --no-format-executable > /dev/null
  cd ${CWD}
fi

# we need to install net-ssh ans net-ssh-gatewayto avoid dependency problems on chef.
echo "Installing net-ssh..."
NET_SSH_VERSION="2.2.2"
${GEM} list -i net-ssh -v ${NET_SSH_VERSION} || sudo ${GEM} install net-ssh --version ${NET_SSH_VERSION} -q --no-ri --no-rdoc > /dev/null

echo "Installing net-ssh-gateway..."
NET_SSH_GATEWAY_VERSION=" 1.0.0"
${GEM} list -i net-ssh-gateway -v ${NET_SSH_GATEWAY_VERSION} || sudo ${GEM} install net-ssh-gateway --version ${NET_SSH_GATEWAY_VERSION} -q --no-ri --no-rdoc > /dev/null

echo "Installing chef..."
CHEF_VERSION="10.16.4"
${GEM} list -i chef -v ${CHEF_VERSION} || sudo ${GEM} install chef --version ${CHEF_VERSION} -q --no-ri --no-rdoc > /dev/null

# Install blobstore_client
echo "Installing blobstore_client..."
BLOB_VERSION="0.4.0"
${GEM} list -i blobstore_client -v ${BLOB_VERSION} || sudo ${GEM} install blobstore_client --version ${BLOB_VERSION} -q --no-ri --no-rdoc > /dev/null

# Install rake
echo "Installing rake..."
${GEM} list -i rake -i || sudo ${GEM} install rake -q --no-ri --no-rdoc > /dev/null

# Clone cloudfoundry repo
echo "Installing git..."
run_cmd apt-get $APT_CONFIG install -qym git-core

[ -d $CLOUDFOUNDRY_HOME ] || mkdir $CLOUDFOUNDRY_HOME
REPO=vcap
if [ ! -d $CLOUDFOUNDRY_HOME/${REPO} ]; then
  if ! (cd $CLOUDFOUNDRY_HOME
    git clone --no-checkout $VCAP_REPO_BASE/$REPO
    cd $REPO
    git checkout $VCAP_REPO_BRANCH
    git submodule update --recursive --init
  ); then
    echo "Unable to clone cloudfoundry $REPO repo."
    exit 1
  fi
else
  clear_bundler_settings $CLOUDFOUNDRY_HOME/$REPO
fi

# Launch chef
ARGS=""
if [ -n "$CLOUDFOUNDRY_HOME" ]; then
  ARGS="-d $CLOUDFOUNDRY_HOME"
fi

if [ -n "$CLOUDFOUNDRY_DOMAIN" ]; then
  ARGS="$ARGS -D $CLOUDFOUNDRY_DOMAIN"
fi

if [ -n "$CONFIG_FILE" ]; then
  ARGS="$ARGS -c $CONFIG_FILE"
fi

echo ""
echo "Launching chef..."
sleep 3
$CLOUDFOUNDRY_HOME/vcap/dev_setup/lib/chefsolo_launch.rb $ARGS