#!/bin/bash
##############################################################################
# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
function print_logo()
{

    figlet -ctf slant Compass Installer
    set +x; sleep 2; set -x
}

function install_docker()
{
    sudo apt-get install -y linux-image-extra-$(uname -r) linux-image-extra-virtual
    sudo apt-get install -y apt-transport-https ca-certificates curl \
                 software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo apt-key fingerprint 0EBFCD88
    sudo add-apt-repository    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
    sudo apt-get update
    sudo apt-get install -y docker-ce
    sleep 5
    sudo cat << EOF > /etc/docker/daemon.json
{
  "storage-driver": "devicemapper"
}
EOF

    sudo service docker start
    sudo service docker restart
}

function extract_tar()
{
    tar_name=`basename $TAR_URL`
    rm -f $WORK_DIR/cache/$tar_name
    curl --connect-timeout 10 -o $WORK_DIR/cache/$tar_name $TAR_URL
    tar -zxf $WORK_DIR/cache/$tar_name -C $WORK_DIR/installer
}

function prepare_env() {
    sudo sed -i -e 's/^#user =.*/user = "root"/g' /etc/libvirt/qemu.conf
    sudo sed -i -e 's/^#group =.*/group = "root"/g' /etc/libvirt/qemu.conf
    sudo service libvirt-bin restart
    if sudo service openvswitch-switch status|grep stop; then
        sudo service openvswitch-switch start
    fi

    # prepare work dir
    sudo rm -rf $WORK_DIR/{installer,vm,network,iso,docker}
    mkdir -p $WORK_DIR/installer
    mkdir -p $WORK_DIR/vm
    mkdir -p $WORK_DIR/network
    mkdir -p $WORK_DIR/iso
    mkdir -p $WORK_DIR/cache
    mkdir -p $WORK_DIR/docker

    extract_tar

    chmod 755 $WORK_DIR -R

    if [[ ! -d /etc/libvirt/hooks ]]; then
        sudo mkdir -p /etc/libvirt/hooks
    fi

    sudo cp ${COMPASS_DIR}/deploy/qemu_hook.sh /etc/libvirt/hooks/qemu
}

function  _prepare_python_env() {
   rm -rf $WORK_DIR/venv
   mkdir -p $WORK_DIR/venv

   if [[ "$DEPLOY_FIRST_TIME" == "true" ]]; then

        if [[ ! -z "$JHPKG_URL" ]]; then
             _pre_env_setup
        else
            if [[ ! -f /etc/redhat-release ]]; then
                sudo apt-get update -y
                sudo apt-get install -y --force-yes mkisofs bc curl ipmitool openvswitch-switch
                sudo apt-get install -y --force-yes git python-dev python-pip figlet sshpass
                sudo apt-get install -y --force-yes libxslt-dev libxml2-dev libvirt-dev build-essential qemu-utils qemu-kvm libvirt-bin virtinst libmysqld-dev
                sudo apt-get install -y --force-yes libffi-dev libssl-dev
            else
                sudo yum install -y centos-release-openstack-pike
                sudo yum install -y epel-release
                sudo yum install openvswitch -y --nogpgcheck
                sudo yum install -y git python-devel python-pip figlet sshpass mkisofs bc curl ipmitool
                sudo yum install -y libxslt-devel libxml2-devel libvirt-devel libmysqld-devel
                sudo yum install -y qemu-kvm qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer
                sudo yum install -y libffi libffi-devel openssl-devel
                sudo yum groupinstall -y 'Development Tools'
            fi

            sudo docker version >/dev/null 2>&1
            if [[ $? -ne 0 ]]; then
                install_docker
            fi
        fi
   fi

   if [[ ! -z "$JHPKG_URL" ]]; then
        _pre_pip_setup
   else
        sudo pip install --upgrade virtualenv
        virtualenv $WORK_DIR/venv
        source $WORK_DIR/venv/bin/activate

        pip install cffi==1.10.0
        pip install MarkupSafe==1.0
        pip install pip==9.0.1
        pip install cheetah==2.4.4
        pip install pyyaml==3.12
        pip install requests==2.18.1
        pip install netaddr==0.7.19
        pip install oslo.config==4.6.0
        pip install ansible==2.3.1.0
        # For sudo use
        sudo pip install docker-compose==1.14.0
   fi
}

function _pre_env_setup()
{
     rm -rf $WORK_DIR/prepare
     mkdir -p $WORK_DIR/prepare
     jhpkg_url=${JHPKG_URL:7}
     echo $jhpkg_url
     if [[ ! -f "$jhpkg_url" ]]; then
          echo "There is no jh_env_package."
          exit 1
     fi

     tar -zxvf $jhpkg_url -C $WORK_DIR/prepare/
     cd $WORK_DIR/prepare/jh_env_package
     tar -zxvf jh-ppa.tar.gz

     if [[ ! -z /etc/apt/sources.list.d ]]; then
          mv /etc/apt/sources.list.d /etc/apt/sources.list.d.bak
     fi

     if [[ -f /etc/apt/apt.conf ]]; then
          mv /etc/apt/apt.conf /etc/apt/apt.conf.bak
     fi

     sudo cat << EOF > /etc/apt/apt.conf
APT::Get::Assume-Yes "true";
APT::Get::force-yes "true";
Acquire::http::Proxy::127.0.0.1:9998 DIRECT;
EOF

     if [[ -f /etc/apt/sources.list ]]; then
          mv /etc/apt/sources.list /etc/apt/sources.list.bak
     fi

     sudo cat << EOF > /etc/apt/sources.list
deb [arch=amd64] http://127.0.0.1:9998/jh-ppa $(lsb_release -cs) main
EOF

     if [[ $(lsb_release -cs) == "trusty" ]]; then
         nohup python -m SimpleHTTPServer 9998 &
     else
         nohup python3 -m http.server 9998 &
     fi

     http_ppa_pid=$!

     cd -
     sleep 5
     apt-get update
     apt-get install -y mkisofs bc curl ipmitool openvswitch-switch \
         git python-pip python-dev figlet \
         libxslt-dev libxml2-dev libvirt-dev \
         build-essential qemu-utils qemu-kvm libvirt-bin \
         virtinst libmysqld-dev \
         libssl-dev libffi-dev python-cffi

     sudo docker version >/dev/null 2>&1
     if [[ $? -ne 0 ]]; then
         sudo apt-get install -y docker-ce
         sleep 5
         sudo cat << EOF > /etc/docker/daemon.json
{
  "storage-driver": "devicemapper"
}
EOF

         sudo service docker start
         sudo service docker restart
     else
         StorageDriver=$(sudo docker info | grep "Storage Driver" | awk '{print $3}')
         if [[ $StorageDriver != "devicemapper" ]]; then
             echo "The storage driver of docker currently only supports 'devicemapper'."
             exit 1
         fi
     fi

     kill -9 $http_ppa_pid

     if [[ ! -d /etc/libvirt/hooks ]]; then
         sudo mkdir -p /etc/libvirt/hooks
     fi

     sudo cp -f ${COMPASS_DIR}/deploy/qemu_hook.sh /etc/libvirt/hooks/qemu

     rm -rf /etc/apt/sources.list
     if [[ -f /etc/apt/sources.list.bak ]]; then
          mv /etc/apt/sources.list.bak /etc/apt/sources.list
     fi

     rm -rf /etc/apt/apt.conf
     if [[ -f /etc/apt/apt.conf.bak ]]; then
          mv /etc/apt/apt.conf.bak /etc/apt/apt.conf
     fi

     if [[ ! -z /etc/apt/sources.list.d.bak ]]; then
          mv /etc/apt/sources.list.d.bak /etc/apt/sources.list.d
     fi
}

function _pre_pip_setup()
{
     if [[ -d ~/.pip ]]; then
          if [[ -f ~/.pip/pip.conf ]]; then
               mv ~/.pip/pip.conf ~/.pip/pip.conf.bak
          fi
     else
          mkdir -p ~/.pip
     fi

     rm -rf $WORK_DIR/prepare
     mkdir -p $WORK_DIR/prepare
     jhpkg_url=${JHPKG_URL:7}
     echo $jhpkg_url
     if [[ ! -f "$jhpkg_url" ]]; then
          echo "There is no jh_env_package."
          exit 1
     fi

     tar -zxvf $jhpkg_url -C $WORK_DIR/prepare/
     cd $WORK_DIR/prepare/jh_env_package
     tar -zxvf jh_pip.tar.gz

     cat << EOF > ~/.pip/pip.conf
[global]
find-links = http://127.0.0.1:9999/jh_pip
no-index = true
[install]
trusted-host=127.0.0.1
EOF

     if [[ $(lsb_release -cs) == "trusty" ]]; then
         nohup python -m SimpleHTTPServer 9999 &
     else
         nohup python3 -m http.server 9999 &
     fi

     http_pip_pid=$!
     echo $http_pip_pid

     sleep 5

     cd -

     pip install --upgrade virtualenv

     virtualenv $WORK_DIR/venv
     source $WORK_DIR/venv/bin/activate

     pip install cffi==1.10.0
     pip install MarkupSafe==1.0
     pip install pip==9.0.1
     pip install cheetah==2.4.4
     pip install pyyaml==3.12
     pip install requests==2.18.1
     pip install netaddr==0.7.19
     pip install oslo.config==4.6.0
     pip install ansible==2.3.1.0
     sudo pip install docker-compose==1.14.0
     if [[ $(lsb_release -cs) == "xenial" ]]; then
         sudo pip install -U pyOpenSSL
     fi

     kill -9 $http_pip_pid

     if [[ -f ~/.pip/pip.conf.bak ]]; then
          mv ~/.pip/pip.conf.bak ~/.pip/pip.conf
     else
          rm -rf ~/.pip/pip.conf
     fi
}

function prepare_python_env()
{
    if [[ "$DEPLOY_FIRST_TIME" == "true" ]]; then
        _prepare_python_env
    else
        source $WORK_DIR/venv/bin/activate
        if [[ $? -ne 0 ]]; then
            _prepare_python_env
        fi
    fi
    which python
}