#!/bin/bash

PATH=/usr/local/bin:/usr/local/sbin:/opt/local/bin:/usr/bin:/usr/sbin:/bin:/sbin
SHELL=/bin/bash

_TODAY=`date +%y%m%d`
_NOW=`date +%y%m%d-%H%M`
_L_VMFAMILY=XEN
_L_VM_TEST=`uname -a 2>&1`
if [[ "$_L_VM_TEST" =~ beng ]] ; then
  _L_VMFAMILY="VS"
fi

octopus_install ()
{
  if [ -e "/var/backups/OCTOPUS.sh.txt" ] ; then
    if [ -z "$user" ] ; then
      user="o1"
    fi
    _CHECK_HOST=`uname -n`
    sed -i "s/^_MY_EMAIL=.*/_MY_EMAIL=\"$email\"/g"          /var/backups/OCTOPUS.sh.txt &> /dev/null
    sed -i "s/^_CLIENT_EMAIL=.*/_CLIENT_EMAIL=\"$email\"/g"  /var/backups/OCTOPUS.sh.txt &> /dev/null
    sed -i "s/^_DNS_SETUP_TEST=.*/_DNS_SETUP_TEST=NO/g"      /var/backups/OCTOPUS.sh.txt &> /dev/null
    sed -i "s/^_USER=o1/_USER=$user/g"                       /var/backups/OCTOPUS.sh.txt &> /dev/null
    if [ "$mode" = "mini" ] ; then
      sed -i "s/^_AUTOPILOT=.*/_AUTOPILOT=YES/g"             /var/backups/OCTOPUS.sh.txt &> /dev/null
      sed -i "s/^_USE_STOCK=.*/_USE_STOCK=NO/g"              /var/backups/OCTOPUS.sh.txt &> /dev/null
    elif [ "$mode" = "max" ] ; then
      sed -i "s/^_AUTOPILOT=.*/_AUTOPILOT=YES/g"             /var/backups/OCTOPUS.sh.txt &> /dev/null
      sed -i "s/D7P D7S D7D D6P D6S D6D OAM/ALL/g"           /var/backups/OCTOPUS.sh.txt &> /dev/null
      sed -i "s/^_USE_STOCK=.*/_USE_STOCK=NO/g"              /var/backups/OCTOPUS.sh.txt &> /dev/null
    elif [ "$mode" = "stock" ] ; then
      sed -i "s/^_AUTOPILOT=.*/_AUTOPILOT=YES/g"             /var/backups/OCTOPUS.sh.txt &> /dev/null
      sed -i "s/^_USE_STOCK=.*/_USE_STOCK=YES/g"             /var/backups/OCTOPUS.sh.txt &> /dev/null
    else
      sed -i "s/D7P D7S D7D D6P D6S D6D OAM/ALL/g"           /var/backups/OCTOPUS.sh.txt &> /dev/null
      sed -i "s/^_USE_STOCK=.*/_USE_STOCK=NO/g"              /var/backups/OCTOPUS.sh.txt &> /dev/null
    fi
    if [ -e "/root/.host8.cnf" ] || [[ "$_CHECK_HOST" =~ ".host8." ]] || [ "$_L_VMFAMILY" = "VS" ] ; then
      if [[ "$_CHECK_HOST" =~ ".o8.io" ]] ; then
        _DO_NOTHING=YES
      else
        sed -i "s/^_AUTOPILOT=.*/_AUTOPILOT=YES/g"           /var/backups/OCTOPUS.sh.txt &> /dev/null
        sed -i "s/^_STRONG_PASSWORDS=NO/_STRONG_PASSWORDS=YES/g" /var/backups/OCTOPUS.sh.txt &> /dev/null
      fi
    fi
    bash /var/backups/OCTOPUS.sh.txt
    sed -i "s/^127.0.1.1.*//g" /etc/hosts
    sed -i "/^$/d" /etc/hosts
  else
    echo "OCTOPUS.sh.txt installer not available - try again"
    exit 1
  fi
}

barracuda_install ()
{
if [ -e "/var/backups/BARRACUDA.sh.txt" ] ; then
  sed -i "s/^_MY_EMAIL=.*/_MY_EMAIL=\"$email\"/g"           /var/backups/BARRACUDA.sh.txt &> /dev/null
  sed -i "s/^_AUTOPILOT=.*/_AUTOPILOT=YES/g"                /var/backups/BARRACUDA.sh.txt &> /dev/null
  if [ "$kind" = "local" ] ; then
    sed -i "s/^_EASY_LOCALHOST=.*/_EASY_LOCALHOST=YES/g"    /var/backups/BARRACUDA.sh.txt &> /dev/null
    sed -i "s/^_EASY_PUBLIC=.*/_EASY_PUBLIC=NO/g"           /var/backups/BARRACUDA.sh.txt &> /dev/null
    sed -i "s/^127.0.1.1.*//g" /etc/hosts
    echo "127.0.1.1 aegir.local o1.sub.aegir.local o2.sub.aegir.local o3.sub.aegir.local" >> /etc/hosts
  elif [ "$kind" = "public" ] ; then
    sed -i "s/^_EASY_LOCALHOST=.*/_EASY_LOCALHOST=NO/g"     /var/backups/BARRACUDA.sh.txt &> /dev/null
    sed -i "s/^_EASY_PUBLIC=.*/_EASY_PUBLIC=YES/g"          /var/backups/BARRACUDA.sh.txt &> /dev/null
    sed -i "s/^_EASY_HOSTNAME=.*/_EASY_HOSTNAME=$fqdn/g"    /var/backups/BARRACUDA.sh.txt &> /dev/null
  fi
  if [ "$mode" = "stock" ] ; then
    sed -i "s/^_USE_STOCK=.*/_USE_STOCK=YES/g"              /var/backups/BARRACUDA.sh.txt &> /dev/null
    if [ -e "/root/.barracuda.cnf" ] ; then
      sed -i "s/^_USE_STOCK=.*/_USE_STOCK=YES/g"            /root/.barracuda.cnf &> /dev/null
    fi
  else
    sed -i "s/^_USE_STOCK=.*/_USE_STOCK=NO/g"               /var/backups/BARRACUDA.sh.txt &> /dev/null
    if [ -e "/root/.barracuda.cnf" ] ; then
      sed -i "s/^_USE_STOCK=.*/_USE_STOCK=NO/g"             /root/.barracuda.cnf &> /dev/null
    fi
  fi
  if [ ! -z "$rkey" ] ; then
    sed -i "s/^_NEWRELIC_KEY=.*/_NEWRELIC_KEY=\"$rkey\"/g"  /var/backups/BARRACUDA.sh.txt &> /dev/null
  fi
  if [ -e "/var/backups/BARRACUDA.sh.txt" ] ; then
    bash /var/backups/BARRACUDA.sh.txt
  fi
else
  echo "BARRACUDA.sh.txt installer not available - try again"
  exit 1
fi
}

init_start ()
{
  if [ -e "/var/run/boa_run.pid" ] ; then
    echo Another BOA installer is running probably - /var/run/boa_run.pid exists
    exit 1
  elif [ -e "/var/run/boa_wait.pid" ] ; then
    echo Some important system task is running probably - /var/run/boa_wait.pid exists
    exit 1
  else
    touch /var/run/boa_run.pid
    touch /var/run/boa_wait.pid
    mkdir -p /var/backups
    cd /var/backups
    rm -f /var/backups/BARRACUDA.sh*
    rm -f /var/backups/OCTOPUS.sh*
  fi
}

set_pin_priority ()
{
  if [ ! -e "/etc/apt/preferences" ] && [ -e "/etc/issue.net" ] ; then
    _THIS_OS=$(grep "Debian" /etc/issue.net)
    if [[ "$_THIS_OS" =~ "Debian" ]] ; then
      _THIS_OS=Debian
    else
      _THIS_OS=Ubuntu
    fi
    if [ "$_THIS_OS" = "Debian" ] ; then
      _THIS_RV=$(grep "6.0" /etc/issue.net)
      if [[ "$_THIS_RV" =~ "6.0" ]] ; then
        curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "http://files.aegir.cc/versions/master/aegir/conf/etc-apt-preferences-squeeze.txt" -o /etc/apt/preferences
      else
        curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "http://files.aegir.cc/versions/master/aegir/conf/etc-apt-preferences-wheezy.txt" -o /etc/apt/preferences
      fi
    elif [ "$_THIS_OS" = "Ubuntu" ] ; then
      curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "http://files.aegir.cc/versions/master/aegir/conf/etc-apt-preferences-ubuntu.txt" -o /etc/apt/preferences
    fi
    rm -f /var/backups/etc-apt-preferences-*
  fi
  _THIS_DO=$(grep "Ubuntu 12.04" /etc/issue.net)
  if [[ "$_THIS_DO" =~ "Ubuntu 12.04" ]] ; then
    _THIS_DO=YesPrecise
  else
    _THIS_DO=Other
  fi
}

init_finish ()
{
  rm -f /var/run/boa_run.pid
  rm -f /var/run/boa_wait.pid
  rm -f /var/backups/BARRACUDA.sh*
  rm -f /var/backups/OCTOPUS.sh*
  rm -f /root/BOA.sh*
  echo
  echo BOA $cmmand completed
  echo Bye
  echo
  if [ "$_NEEDS_UPDATE" = "YES" ] ; then
    rm -f /var/backups/BOA.sh.txt-*
    curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "http://files.aegir.cc/BOA.sh.txt" -o /var/backups/BOA.sh.txt-$_NOW
    exec bash /var/backups/BOA.sh.txt-$_NOW &> /dev/null
    rm -f /var/backups/BOA.sh.txt-$_NOW
  fi
  exit 0
}

init_setup ()
{
  init_start
  set_pin_priority
  if [ "$kind" = "local" ] ; then
    mode="$email"
    email="$fqdn"
  fi
  if [ "$kind" = "public" ] ; then
    if [ "$user" = "ask" ] || [ "$user" = "mini" ] || [ "$user" = "max" ] || [ "$user" = "stock" ] ; then
      rkey="$mode"
      mode="$user"
      user="o1"
    fi
  fi
  if [ "$mode" = "stock" ] ; then
    cmmand=in-head
    curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "https://raw.githubusercontent.com/omega8cc/boa/master/BARRACUDA.sh.txt" -o BARRACUDA.sh.txt
    curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "https://raw.githubusercontent.com/omega8cc/boa/master/OCTOPUS.sh.txt" -o OCTOPUS.sh.txt
  else
    if [ "$cmmand" = "in-head" ] ; then
      curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "https://raw.githubusercontent.com/omega8cc/boa/master/BARRACUDA.sh.txt" -o BARRACUDA.sh.txt
      curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "https://raw.githubusercontent.com/omega8cc/boa/master/OCTOPUS.sh.txt" -o OCTOPUS.sh.txt
    elif [ "$cmmand" = "in-stable" ] ; then
      curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "http://files.aegir.cc/versions/stable/txt/BARRACUDA.sh.txt" -o BARRACUDA.sh.txt
      curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "http://files.aegir.cc/versions/stable/txt/OCTOPUS.sh.txt" -o OCTOPUS.sh.txt
    elif [ "$cmmand" = "in-legacy" ] ; then
      curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "http://files.aegir.cc/versions/legacy/txt/BARRACUDA.sh.txt" -o BARRACUDA.sh.txt
      curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "http://files.aegir.cc/versions/legacy/txt/OCTOPUS.sh.txt" -o OCTOPUS.sh.txt
    fi
  fi
  barracuda_install
  octopus_install
  init_finish
}

download_wrapper ()
{
  if [ ! -e "$_THIS_FILE" ] ; then
    echo "I can not connect to files.aegir.cc at the moment"
    echo "I will try again in 15 seconds, please wait..."
    sleep 15
    curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "http://files.aegir.cc/versions/master/aegir/tools/bin/$(basename "$0")" -o $_THIS_FILE
  fi
}

check_wrapper ()
{
  mkdir -p /var/backups
  rm -f /var/backups/$(basename "$0")-now-*
  _THIS_FILE="/var/backups/$(basename "$0")-now-$_NOW"
  curl -L --max-redirs 10 -k -s --retry 10 --retry-delay 5 -A iCab "http://files.aegir.cc/versions/master/aegir/tools/bin/$(basename "$0")" -o $_THIS_FILE
  if [ ! -e "$_THIS_FILE" ] ; then
    download_wrapper
    if [ ! -e "$_THIS_FILE" ] ; then
      download_wrapper
      if [ ! -e "$_THIS_FILE" ] ; then
        download_wrapper
        if [ ! -e "$_THIS_FILE" ] ; then
          echo "Sorry, I gave up."
          echo "Please check http://stats.pingdom.com/x0s6yrbopal6/801243 and try again later."
          exit 1
        fi
      fi
    fi
  fi
  _BIN_FILE="/usr/local/bin/$(basename "$0")"
  _DATE_TEST=$(grep "### $_TODAY ###" $_THIS_FILE)
  if [[ "$_DATE_TEST" =~ "### $_TODAY ###" ]] ; then
    _NEEDS_UPDATE=NO
  else
    _NEEDS_UPDATE=YES
  fi
}

check_dns_curl ()
{
  if [ ! -e "/etc/resolv.conf" ] ; then
    echo "nameserver 8.8.8.8" >/etc/resolv.conf
    echo "nameserver 8.8.4.4" >>/etc/resolv.conf
  else
    _RESOLV_TEST=$(grep "nameserver" /etc/resolv.conf)
    if [[ "$_RESOLV_TEST" =~ "nameserver" ]] ; then
      _DO_NOTHING=YES
    else
      rm -f /etc/resolv.conf
      echo "nameserver 8.8.8.8" >/etc/resolv.conf
      echo "nameserver 8.8.4.4" >>/etc/resolv.conf
    fi
  fi
  _CURL_TEST=$(curl -L --max-redirs 10 -k -s -I "http://files.aegir.cc" 2> /dev/null)
  if [[ "$_CURL_TEST" =~ "200 OK" ]] ; then
    _DO_NOTHING=YES
  else
    apt-get clean -qq &> /dev/null
    apt-get update -qq &> /dev/null
    apt-get install curl -y --force-yes --reinstall &> /dev/null
  fi
}

check_root ()
{
  if [ `whoami` = "root" ] ; then
    chmod a+w /dev/null
    if [ ! -e "/dev/fd" ] ; then
      if [ -e "/proc/self/fd" ] ; then
        rm -rf /dev/fd
        ln -s /proc/self/fd /dev/fd
      fi
    fi
    sed -i "s/.*173.231.133.190.*//g" /etc/hosts
    sed -i "s/^127.0.0.1.*/127.0.0.1 localhost/g" /etc/hosts
    sed -i "/^$/d" /etc/hosts
  else
    echo "ERROR: This script should be ran as a root user - please `sudo -i` first"
    exit 1
  fi
  _DF_TEST=$(df -kTh / -l | grep '/'| sed 's/\%//g'| awk '{print $6}' 2> /dev/null)
  _DF_TEST=${_DF_TEST//[^0-9]/}
  if [ ! -z "$_DF_TEST" ] && [ "$_DF_TEST" -gt "90" ] ; then
    echo "ERROR: Your disk space is almost full - we can not proceed until it is below 90/100"
    exit 1
  fi
}

case "$1" in
  in-stable) cmmand="$1"
             kind="$2"
             fqdn="$3"
             email="$4"
             user="$5"
             mode="$6"
             rkey="$7"
             check_root
             check_dns_curl
             check_wrapper
             init_setup
  ;;
  in-head)   cmmand="$1"
             kind="$2"
             fqdn="$3"
             email="$4"
             user="$5"
             mode="$6"
             rkey="$7"
             check_root
             check_dns_curl
             check_wrapper
             init_setup
  ;;
  in-legacy) cmmand="$1"
             kind="$2"
             fqdn="$3"
             email="$4"
             user="$5"
             mode="$6"
             rkey="$7"
             check_root
             check_dns_curl
             check_wrapper
             init_setup
  ;;
  *)         echo
             echo "Usage: $(basename "$0") {in-stable|in-head|in-legacy} {local|public} {fqdn} {email} {o1} {ask|mini|max|stock} {newrelickey}"
             echo
             exit 1
  ;;
esac
