#!/bin/bash
set -e

log() {
    if [[ "TRACE" = "$1" ]] || [[ `(echo "TRACEDEBUGINFOERRORWARN" |sed s/^.*"TRACE"//g )` == *"$1"* ]]; then
        echo "`date '+%Y-%m-%d %H:%M:%S'` $1: $2"
    fi;
}

trim() {
    echo -e "${1}" | tr -d '[[:space:]]'
}
isEmpty() {
    if [[ -z "$(trim "$1")" ]] || [[ -z "$1" ]]; then
        true
    else
        false
    fi;
}
askQuestion() {
    local MSG=`log INFO`

    if (isEmpty $1); then
        MSG="$MSG Do you want to continue (y/n)?"
    else
        MSG="$MSG $1"
    fi

    read -p "$MSG" choice
    case "$choice" in
      y|Y|"" ) true;;
      n|N ) exit 1;;
      * ) false;;
    esac
}
isContainersExist() {
    local NAME="delivery"

    docker ps -a | while read line; do
        if [[ ${line} =~ $NAME ]]; then
            echo true
            break
        fi
    done
}

check_ports() {
local RESULT=`python << END
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ports = [8110, 8111, 5432]
host='127.0.0.1'

result = "true"
for p in ports:
   isFree = sock.connect_ex((host, p))
   if isFree == 0:
      result = "false"
      break
print result
END`
echo ${RESULT}
}

check_exist_certificate(){
    local CERTIFICATE_DIRECTORY="/etc/docker/certs.d"
    if [ -d "$CERTIFICATE_DIRECTORY" ] ;
        then
            log INFO "Directory $CERTIFICATE_DIRECTORY exists."
        else
            log ERROR "Error: Directory with certificate $CERTIFICATE_DIRECTORY not found. Install delivery app stopped."
            exit 1
    fi

    local CERTIFICATE_ARTIX_DIRECTORY="$CERTIFICATE_DIRECTORY/cashserver.artix.su:1443"

    if [ -d "$CERTIFICATE_ARTIX_DIRECTORY" ] ;
        then
            log INFO "Directory $CERTIFICATE_ARTIX_DIRECTORY exists."
        else
            log ERROR "Error: Certificate artix not added. Add certificate. Install delivery app stopped."
            exit 1
    fi
}

verify_artix_certificate(){
    local TARGET="cashserver.artix.su";
    log INFO "Verify expiration certificate for $TARGET";
    local expirationdate=$(date -d "$(: | openssl s_client -connect $TARGET:1443 -servername $TARGET 2>/dev/null \
                              | openssl x509 -text \
                              | grep 'Not After' \
                              |awk '{print $4,$5,$7}')" '+%s');

    local current_day=$(date +%s);
    if [ $current_day -gt $expirationdate ]; then
        log ERROR "Certificate for $TARGET expires on $(date -d @$expirationdate '+%Y-%m-%d')"
        exit 1;
    else
        log INFO "Certificate expires on $expirationdate";
    fi;
}

check_exist_certificate;
verify_artix_certificate;

log INFO "Start install linux-image-extra"

sudo apt-get install -y \
linux-image-extra-$(uname -r) \
linux-image-extra-virtual

log INFO "Start install apt-transport-https, ca-certificates, curl, software-properties-common"

sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

log INFO "Add repository deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

log INFO "apt-get update"

sudo apt-get update

log INFO "Start install docker-ce"

sudo apt-get install -y --force-yes docker-ce
# fix docker registry server
# cashserver.artix.su:1443 - это внешний адрес по которому доступно только чтение. Для доспута к нему должен быть установлен сертификат
#echo { \"insecure-registries\":[\"cashserver.artix.su:1443\"] } | sudo tee  /etc/docker/daemon.json

log INFO "Restart docker"
sudo service docker restart

#Докер не рекомендует добавлять пользователя в группу докера.
#sudo usermod -a -G docker $USER

sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

#Скачаем скрипты для запуска
#Дать права для запуска
#curl -L http://downloads.artix.su/static/downloads/docker/installapp/docker-compose.yml -o docker-compose.yml

VERSION="latest"
# Версия
if ! (isEmpty "$1"); then
    VERSION=$1
    # Если с версией проблемы, продолжать нет смысла, иначе разгребать замучаемся что там произошло
    # Пример валидных значений:
    # для релиза 0.0.1.253
    # для тестов 0.0.1.253-testing
    REGEX="^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)$"
    REGEX_WITH_STATE="^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-[A-Za-z]+)$"
    if [[ ! ${1} =~ $REGEX ]] && [[ ! ${1} =~ $REGEX_WITH_STATE ]] ; then
        log ERROR "Something is wrong. Version is error: '$1'"
        log ERROR "Exit..."
        exit 1
    fi
    echo "TAG=$1" > .env
fi

CONTINUE=true
while ${CONTINUE}; do
    res=`isContainersExist`
    if [[ ${res} == true ]]; then
        CONTINUE=`askQuestion "You're already have delivery containers! Destroy them? (y - continue/n - exit)"`
        if ${CONTINUE}; then
            log INFO "Delete containers:"
            docker rm -f `docker ps -a|grep "delivery"|awk '{print $1}'`
            CONTINUE=false;
        fi
    else
        CONTINUE=false;
    fi
done

CONTINUE=true
while ${CONTINUE}; do
    if ! check_ports; then
        log WARN "You're have busy ports. Free up ports: 8110, 8111, 5432. Do it and we will continue!"
    else
        break
    fi
   CONTINUE=`askQuestion "Have you freed the ports? (y - continue/n - exit)"`
done

docker pull postgres:10.6
docker pull cashserver.artix.su:1443/delivery-service:${VERSION}
docker pull cashserver.artix.su:1443/delivery-gateway:${VERSION}

log INFO "Run delivery services"
docker-compose up -d
log INFO "Your's containers:"
docker ps | grep delivery

rm -rf .env || true