#!/usr/bin/env bash
#
# Bash script for provisioning the MongoDB instances

set -e
set -x

function ip_config(){
  export CLIENT_IP_ADDR=`ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' | tail -1`
  export CLIENT_FQDN=`hostname`
  export CLIENT_NAME=`hostname | cut -d. -f 1 | tr '[:upper:]' '[:lower:]'`
  echo "Configuring /etc/hosts ..."
  echo "127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 " > /etc/hosts
  echo "::1       localhost localhost.localdomain localhost6 localhost6.localdomain6" >> /etc/hosts
  echo "fe00::0 ip6-localnet" >> /etc/hosts
  echo "ff00::0 ip6-mcastprefix" >> /etc/hosts
  echo "ff02::1 ip6-allnodes" >> /etc/hosts
  echo "ff02::2 ip6-allrouters" >> /etc/hosts
  echo "ff02::3 ip6-allhosts" >> /etc/hosts
  echo "$CLIENT_IP_ADDR    $CLIENT_FQDN $CLIENT_NAME" >> /etc/hosts
}

function install_mongod(){
  echo "Install MongoDB Enterprise"
  # install MongoDB using apt-get so it installs with service support and has a
  # default configuration file in /etc/
  # have to force-yes -y to force install of unsigned packages (our 3.4 key does
  # not match, no 3.6 key in the docs) and to agree to install
  sudo apt-get install --force-yes -y mongodb-enterprise
  mkdir -p /var/log/mongodb/
  sudo chown vagrant:vagrant -R /var/log/mongodb
  sudo chown vagrant:vagrant -R /var/lib/mongodb
  sudo echo "
security:
  authorization: enabled"  | sudo tee -a /etc/mongod.conf
  echo "Done installing MongoDB Enterprise"
}

function user_setup(){
  sudo sh -c "killall mongod; true"
  sudo mkdir -p /data
  sudo chmod -R 777 /data
  mkdir -p /data/db
  mkdir -p /home/vagrant/data
  chmod -R 777 /home/vagrant/data
  chown -R vagrant:vagrant /home/vagrant/data
  mkdir -p /var/m103/validation
  echo "Set LC_ALL=C to .profile"
  sudo echo "export LC_ALL=C" >> /home/vagrant/.profile
  sudo echo "PATH=$PATH:/var/m103/validation" >> /home/vagrant/.profile
}

function update_repo(){
  echo "Install MongoDB Enterprise Repository"
  # set to track mongodb development (rc)
  echo "deb [ arch=amd64 ] http://repo.mongodb.com/apt/ubuntu trusty/mongodb-enterprise/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-enterprise.list
  sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

  echo "Update Repositories"
  sudo apt-get update -y
  echo "Installing MongoDB Enterprise Dependencies"
  sudo apt-get install -y libgssapi-krb5-2 libsasl2-2 libssl1.0.0 libstdc++6 snmp
}

function config(){
  sudo su
  # disable THP
  echo -e "never" > /sys/kernel/mm/transparent_hugepage/enabled
  echo -e "never" > /sys/kernel/mm/transparent_hugepage/defrag
  # disable mongod upstart service
  echo 'manual' | sudo tee /etc/init/mongod.override
}

function download_dataset() {
  echo "Downloading Dataset"
  curl -s https://s3.amazonaws.com/edu-static.mongodb.com/lessons/M103/products.json.tgz -o products.json.tgz
  tar -xzvf products.json.tgz -C /dataset
  rm -rf products.json.tgz
}

function download_validators() {
  echo "Downloading Validation Scripts"
  curl -s https://s3.amazonaws.com/edu-static.mongodb.com/lessons/M103/m103_validation.tgz -o m103_validation.tgz
  tar -xzvf m103_validation.tgz -C /var/m103/validation
  rm -rf m103_validation.tgz
  echo "#!/bin/bash
        curl -s https://s3.amazonaws.com/edu-static.mongodb.com/lessons/M103/m103_validation.tgz -o m103_validation.tgz
        sudo tar -xzvf m103_validation.tgz -C /var/m103/validation
        rm -rf m103_validation.tgz" > /var/m103/validation/download_validators
  echo "#!/bin/bash
        echo -n 'm103 rocks' | openssl sha256 | sed -e s/\(stdin\)=.//" > /var/m103/validation/validate_box
  chmod -R +x /var/m103/validation/
  chown root:root /var/m103/validation
  echo "Done: Downloaded Validation Scripts"
}

function data_path() {
  sudo mkdir -p /data
  sudo chown -R vagrant:vagrant /data
}

function install_pymongo() {
  sudo apt-get -y install python-pip
  sudo pip install pymongo
}

config
ip_config
update_repo
install_mongod
user_setup
data_path
install_pymongo
download_dataset
download_validators
echo "DONE"
