#!/usr/bin/bash
#     ____             __             ____  ______  __
#    / __ \____  _____/ /_____  _____/ __ \/ ___/ |/ /
#   / / / / __ \/ ___/ //_/ _ \/ ___/ / / /\__ \|   /
#  / /_/ / /_/ / /__/ ,< /  __/ /  / /_/ /___/ /   |
# /_____/\____/\___/_/|_|\___/_/   \____//____/_/|_| TESTS
#
# Title:            Docker-OSX (Mac on Docker)
# Author:           Sick.Codes https://twitter.com/sickcodes
# Version:          4.2
# License:          GPLv3+
# Repository:       https://github.com/sickcodes/Docker-OSX
# Website:          https://sick.codes
#
# Status:           Used internally to auto build, run and test images on DO.
# 

help_text="Usage: ./test.sh --branch <string> --repo <string>

General options:
    --branch, -b <string>               Git branch, default is master
    --repo, -r <url>                    Alternative link to build
    --mirror-country, -m <SS>           Two letter country code for Arch mirrors
    --docker-username, -u <string>      Docker hub username
    --docker-password, -p <string>      Docker hub password
    --vnc-password, -v <string>         Choose a VNC passwd.

Flags
    --no-cache, -n                      Enable --no-cache (default already)
    --no-no-cache, -nn                  Disable --no-cache docker builds
    --help, -h, help                    Display this help and exit
"

# set -xeuf -o pipefail


# gather arguments
while (( "$#" )); do
    case "${1}"  in

    --help | -h | h | help ) 
                echo "${help_text}" && exit 0
            ;;

    --branch=* | -b=* )
                export BRANCH="${1#*=}"
                shift
            ;;
    --branch* | -b* )
                export BRANCH="${2}"
                shift
                shift
            ;;
    --repo=* | -r=* )
                export REPO="${1#*=}"
                shift
            ;;
    --repo* | -r* )
                export REPO="${2}"
                shift
                shift
            ;;
    --mirror-country=* | -m=* )
                export MIRROR_COUNTRY="${1#*=}"
                shift
            ;;
    --mirror-country* | -m* )
                export MIRROR_COUNTRY="${2}"
                shift
                shift
            ;;
    --vnc-password=* | -v=* | --vnc-passwd=* )
                export VNC_PASSWORD="${1#*=}"
                shift
            ;;
    --vnc-password* | -v* | --vnc-passwd* )
                export VNC_PASSWORD="${2}"
                shift
                shift
            ;;
    --docker-username=* | -u=* )
                export DOCKER_USERNAME="${1#*=}"
                shift
            ;;
    --docker-username* | -u* )
                export DOCKER_USERNAME="${2}"
                shift
                shift
            ;;
    --docker-password=* | -p=* )
                export DOCKER_PASSWORD="${1#*=}"
                shift
            ;;
    --docker-password* | -p* )
                export DOCKER_PASSWORD="${2}"
                shift
                shift
            ;;
    --no-cache | -n )
                export NO_CACHE='--no-cache'
                shift
            ;;
    --no-no-cache | -nn )
                export NO_CACHE=
                shift
            ;;
    *)
                echo "Invalid option: ${1}"
                exit 1
            ;;

    esac
done

BRANCH="${BRANCH:=master}"
REPO="${REPO:=https://github.com/sickcodes/Docker-OSX.git}"
VNC_PASSWORD="${VNC_PASSWORD:=testing}"
MIRROR_COUNTRY="${MIRROR_COUNTRY:=US}"
NO_CACHE="${NO_CACHE:=--no-cache}"


TEST_BUILDS=(
    'docker-osx:naked'
    'docker-osx:naked-auto'
    'docker-osx:auto'
)

TEST_BUILDS=(
    'docker-osx:naked'
    'docker-osx:naked-auto'
    'docker-osx:auto'
)

VERSION_BUILDS=(
    'high-sierra'
    'mojave'
    'catalina'
    'big-sur'
    'monterey'
    'ventura'
    'sonoma'
)

warning () {
    clear
    for j in {15..1}; do 
        echo "############# WARNING: THIS SCRIPT IS NOT INTENDED FOR USE BY ################"
        echo "############# IT IS USED BY THE PROJECT TO BUILD AND PUSH TO DOCKERHUB #######"
        echo ""
        echo "                     Press Ctrl C to stop.       "
        MAX_COLS=$((${COLUMNS}/2))
        printf "$j %.0s" {1..20}
        echo
        sleep 1
    done
}

install_docker () {
    apt remove docker docker-engine docker.io containerd runc -y \
    ; apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y \
    && curl -fsSL https://download.docker.com/linux/ubuntu/gpg |  apt-key add - \
    && apt-key fingerprint 0EBFCD88 \
    && > /etc/apt/sources.list.d/docker.list \
    && add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
    && apt update -y \
    && apt install docker-ce docker-ce-cli containerd.io -y \
    && usermod -aG docker "${USER}" \
    && su hook docker run --rm hello-world
}

install_vnc () {
    apt update -y \
        && apt install xorg openbox tigervnc-standalone-server tigervnc-common tigervnc-xorg-extension tigervnc-viewer -y \
        && mkdir -p ${HOME}/.vnc \
        && touch ~/.vnc/config \
        && tee -a ~/.vnc/config <<< 'geometry=1920x1080' \
        && tee -a ~/.vnc/config <<< 'localhost' \
        && tee -a ~/.vnc/config <<< 'alwaysshared' \
        && touch ./vnc.sh \
        && printf '\n%s\n' \
            'sudo rm -f /tmp/.X99-lock' \
            'export DISPLAY=:99' \
            '/usr/bin/Xvnc -geometry 1920x1080 -rfbauth ~/.vnc/passwd :99 &' > ./vnc.sh \
        && tee vncpasswd_file <<< "${VNC_PASSWORD:=testing}" && echo "${VNC_PASSWORD:="$(tr -dc '[:graph:]' </dev/urandom | head -c8)"}" \
        && vncpasswd -f < vncpasswd_file > ${HOME}/.vnc/passwd \
        && chmod 600 ~/.vnc/passwd \
        && apt install qemu qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager -y \
        && sudo systemctl enable libvirtd.service \
        && sudo systemctl enable virtlogd.service \
        && echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs \
        && sudo modprobe kvm \
        && echo 'export DISPLAY=:99' >> ~/.bashrc \
        && printf '\n\n\n\n%s\n%s\n\n\n\n' '===========VNC_PASSWORD========== ' "$(<vncpasswd_file)"
    # ufw allow 5999
}

install_scrotcat () {
    apt update -y
    apt install git curl wget vim xvfb scrot build-essential sshpass -y
    git clone https://github.com/stolk/imcat.git
    make -C ./imcat
    sudo cp ./imcat/imcat /usr/bin/imcat
    touch /usr/bin/scrotcat
    tee  /usr/bin/scrotcat <<< '/usr/bin/imcat <(scrot -o /dev/stdout)'
    chmod +x /usr/bin/scrotcat
}

export_display_99 () {
    touch ~/.bashrc
    tee -a ~/.bashrc <<< 'export DISPLAY=:99'
    export DISPLAY=:99
}

start_xvfb () {
    nohup Xvfb :99 -screen 0 1920x1080x16 &
}

start_vnc () {
    nohup bash vnc.sh &
}

enable_kvm () {
    echo 1 | tee /sys/module/kvm/parameters/ignore_msrs
}

clone_repo () {
    git clone --branch="${1}" "${2}" Docker-OSX
}

docker-osx:naked () {
    docker build ${NO_CACHE} \
        --squash \
        --build-arg RANKMIRRORS=true \
        --build-arg MIRROR_COUNTRY="${MIRROR_COUNTRY}" \
        -f ./Dockerfile.naked \
        -t docker-osx:naked .
    docker tag docker-osx:naked sickcodes/docker-osx:naked
}

docker-osx:naked-auto () {
    docker build ${NO_CACHE} \
        --squash \
        --build-arg RANKMIRRORS=true \
        --build-arg MIRROR_COUNTRY="${MIRROR_COUNTRY}" \
        -f ./Dockerfile.naked-auto \
        -t docker-osx:naked-auto .
    docker tag docker-osx:naked-auto sickcodes/docker-osx:naked-auto
}

docker-osx:auto () {
    docker build ${NO_CACHE} \
        --build-arg RANKMIRRORS=true \
        --build-arg MIRROR_COUNTRY="${MIRROR_COUNTRY}" \
        -f ./Dockerfile.auto \
        -t docker-osx:auto .
    docker tag docker-osx:auto sickcodes/docker-osx:auto
}

# docker-osx:auto-big-sur () {
#     docker build ${NO_CACHE} \
#         --build-arg RANKMIRRORS=true \
#         --build-arg MIRROR_COUNTRY="${MIRROR_COUNTRY}" \
#         --build-arg IMAGE_URL='https://images.sick.codes/mac_hdd_ng_auto_big_sur.img' \
#         -f ./Dockerfile.auto \
#         -t docker-osx:auto-big-sur .
#     docker tag docker-osx:auto-big-sur sickcodes/docker-osx:auto-big-sur
# }

docker-osx:version () {
    SHORTNAME="${1}"
    docker build ${NO_CACHE} \
        --build-arg BRANCH="${BRANCH}" \
        --build-arg RANKMIRRORS=true \
        --build-arg SHORTNAME="${SHORTNAME}" \
        --build-arg MIRROR_COUNTRY="${MIRROR_COUNTRY}" \
        -f ./Dockerfile \
        -t "docker-osx:${SHORTNAME}" .
    docker tag "docker-osx:${SHORTNAME}" "sickcodes/docker-osx:${SHORTNAME}"
}

reset_docker_hard () {

    tee /etc/docker/daemon.json <<'EOF'
{
    "experimental": true
}
EOF
    systemctl disable --now docker
    systemctl disable --now docker.socket
    systemctl stop docker
    systemctl stop docker.socket
    rm -rf /var/lib/docker
    systemctl enable --now docker
}

warning
tee -a ~/.bashrc <<EOF
export DEBIAN_FRONTEND=noninteractive
export TZ=UTC
EOF
export DEBIAN_FRONTEND=noninteractive
export TZ=UTC
ln -snf "/usr/share/zoneinfo/${TZ}" /etc/localtime
tee -a /etc/timezone <<< "${TZ}"
apt update -y
apt-get install keyboard-configuration -y
docker -v | grep '\ 20\.\|\ 19\.' || install_docker
yes | apt install -y --no-install-recommends tzdata -y
install_scrotcat
yes | install_vnc
export_display_99
apt install xvfb -y
start_xvfb
# start_vnc
enable_kvm
reset_docker_hard
# echo killall Xvfb
clone_repo "${BRANCH}" "${REPO}"
cd ./Docker-OSX
git pull

for SHORTNAME in "${VERSION_BUILDS[@]}"; do
    docker-osx:version "${SHORTNAME}"
done

docker tag docker-osx:catalina sickcodes/docker-osx:latest

for TEST_BUILD in "${TEST_BUILDS[@]}"; do
    "${TEST_BUILD}"
done

# boot each image and test
bash ./tests/boot-images.sh || exit 1

if [[ "${DOCKER_USERNAME}" ]] && [[ "${DOCKER_PASSWORD}" ]]; then
    docker login --username "${DOCKER_USERNAME}" --password "${DOCKER_PASSWORD}" \
        && for SHORTNAME in "${VERSION_BUILDS[@]}"; do
            docker push "sickcodes/docker-osx:${SHORTNAME}"
        done \
        && touch PUSHED
    docker push sickcodes/docker-osx:naked
    docker push sickcodes/docker-osx:auto
    docker push sickcodes/docker-osx:naked-auto

fi

# connect remotely to your server to use VNC
# ssh -N root@1.1.1.1 -L  5999:127.0.0.1:5999