#!/bin/bash
# импорт сертификата для docker
curl http://downloads.artix.su/static/downloads/docker/cs_env/import_docker_cert.sh -o /tmp/import_docker_cert.sh
. /tmp/import_docker_cert.sh
#sudo mkdir -p /etc/docker/certs.d;echo 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|base64 --decode|sudo tar -zxf - -C /etc/docker/certs.d/

set -e

CHECKED_PORTS="[8140, 45873]"
DOCKER_COMPOSE_NAME=puppet_env
DOCKER_FILES_DIRECTORY=/opt/artix/docker/$DOCKER_COMPOSE_NAME

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="$DOCKER_COMPOSE_NAME"

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

check_ports() {
	return `python << END
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ports = $CHECKED_PORTS
host='127.0.0.1'

result = "true"
for p in ports:
   isFree = sock.connect_ex((host, p))
   if isFree == 0:
      exit(1)
exit(0)
END`
}

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;
}

set_default_env_variable(){
    local VARIABLE="$1"
    local DEFAULT_VALUE="$2"
    local DESCRIPTION="$3"
    local var
    sudo touch $DOCKER_FILES_DIRECTORY/.env
    grep -q "^${VARIABLE}=" $DOCKER_FILES_DIRECTORY/.env || echo "${VARIABLE}=${DEFAULT_VALUE}"|sudo tee -a $DOCKER_FILES_DIRECTORY/.env
    read -p "Set ${DESCRIPTION}, current value: `grep \"^${VARIABLE}=\" ${DOCKER_FILES_DIRECTORY}/.env`: " var
    if [[ "$var" ]];then
        sudo sed -i "s/^${VARIABLE}=.*/${VARIABLE}=`echo $var|sed 's|/|\\\/|g'`/g" $DOCKER_FILES_DIRECTORY/.env
    fi;
}
check_exist_certificate;
verify_artix_certificate;


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

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

log INFO "Add repository deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
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 docker-ce

if [[ ! -f  "/usr/local/bin/docker-compose" ]];then
    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
fi

sudo mkdir -p $DOCKER_FILES_DIRECTORY
#Скачаем скрипты для запуска
sudo curl -L http://downloads.artix.su/static/downloads/docker/${DOCKER_COMPOSE_NAME}/docker-compose.yaml -o $DOCKER_FILES_DIRECTORY/docker-compose.yaml

CONTINUE=true
while ${CONTINUE}; do
    res=`isContainersExist`
    if [[ ${res} == true ]]; then
        CONTINUE=`askQuestion "You're already have ${DOCKER_COMPOSE_NAME} containers! Destroy them? (y - continue/n - exit)"`
        if ${CONTINUE}; then
            log INFO "Delete containers:"
            sudo docker rm -f `sudo docker ps -a|grep -a "${DOCKER_COMPOSE_NAME}"|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: $CHECKED_PORTS. Do it and we will continue!"
    else
        break
    fi
   CONTINUE=`askQuestion "Have you freed the ports? (y - continue/n - exit)"`
done

set_default_env_variable "CS_SERVER_HOST" "127.0.0.1" "Artix:Cashserver host"

log INFO "Current .env:"
cat $DOCKER_FILES_DIRECTORY/.env

log INFO "Run ${DOCKER_COMPOSE_NAME} services"
(cd $DOCKER_FILES_DIRECTORY && sudo docker-compose up -d)
log INFO "Your's containers:"
sudo docker ps | grep "${DOCKER_COMPOSE_NAME}"

echo -e '#!/bin/bash\nsudo docker-compose stop'|sudo tee $DOCKER_FILES_DIRECTORY/stop > /dev/null && sudo chmod +x $DOCKER_FILES_DIRECTORY/stop
echo -e '#!/bin/bash\nsudo docker-compose start'|sudo tee $DOCKER_FILES_DIRECTORY/start > /dev/null && sudo chmod +x $DOCKER_FILES_DIRECTORY/start
echo -e '#!/bin/bash\n[[ "$1" ]] && sudo docker-compose up -d --force-recreate --no-deps $1 || echo "Please set service name as parameter!"'|sudo tee $DOCKER_FILES_DIRECTORY/restart_service > /dev/null \
    && sudo chmod +x $DOCKER_FILES_DIRECTORY/restart_service
echo -e '#!/bin/bash\n[[ "$1" ]] && sudo docker-compose exec $@ || echo "Please set service name as parameter!"'|sudo tee $DOCKER_FILES_DIRECTORY/exec_service > /dev/null \
    && sudo chmod +x $DOCKER_FILES_DIRECTORY/exec_service
echo -e '#!/bin/bash\nsudo docker-compose logs -f $@'|sudo tee $DOCKER_FILES_DIRECTORY/logs > /dev/null \
    && sudo chmod +x $DOCKER_FILES_DIRECTORY/logs
echo -e '#!/bin/bash\nsudo docker-compose ps'|sudo tee $DOCKER_FILES_DIRECTORY/status > /dev/null && sudo chmod +x $DOCKER_FILES_DIRECTORY/status
cat <<EOF|sudo tee $DOCKER_FILES_DIRECTORY/update > /dev/null && sudo chmod +x $DOCKER_FILES_DIRECTORY/update
#!/bin/bash
set -e
cd $DOCKER_FILES_DIRECTORY
sudo echo ""
{
echo "\$(date): check updates"
curl -L "http://downloads.artix.su/static/downloads/docker/${DOCKER_COMPOSE_NAME}/remote_update_script.sh"|sudo bash
CURRENT_FILE_NAME="docker-compose.yaml"
NEW_FILE_NAME="\${CURRENT_FILE_NAME}_\$(date +%Y_%M_%d-%s)"
sudo curl -L "http://downloads.artix.su/static/downloads/docker/${DOCKER_COMPOSE_NAME}/docker-compose.yaml" -o ./\$NEW_FILE_NAME
if cmp --silent ./\$CURRENT_FILE_NAME ./\$NEW_FILE_NAME; then
    echo "Current version of file is some with downloaded file"
    sudo rm \$NEW_FILE_NAME
else
    echo "copy old version of docker-compose for backup"
    sudo mv ./\$CURRENT_FILE_NAME ./\${CURRENT_FILE_NAME}_\$(date +%Y_%M_%d-%s)_backup
    sudo mv ./\$NEW_FILE_NAME ./\$CURRENT_FILE_NAME
fi
echo "\$(date): check update end"
}|sudo tee -a ./update_info.log
EOF
